From db8e01a37dd516bb8b26b02d8a160f1bce9ea132 Mon Sep 17 00:00:00 2001 From: chrizmc Date: Thu, 23 May 2024 14:35:51 +0200 Subject: [PATCH 01/39] Add basis directory structure with readme files Signed-off-by: chrizmc --- cdsp/information-layer/README.md | 1 + cdsp/information-layer/db-router/README.md | 1 + cdsp/information-layer/iotdb/README.md | 1 + cdsp/information-layer/realmdb/README.md | 1 + cdsp/knowledge-layer/README.md | 1 + cdsp/knowledge-layer/knowledge-connector/README.md | 1 + .../knowledge-connector/json-rdf-convertor/README.md | 1 + .../knowledge-connector/json-rdf-convertor/json-writer/README.md | 1 + .../knowledge-connector/json-rdf-convertor/rdf-writer/README.md | 1 + .../knowledge-connector/json-rdf-convertor/utils/README.md | 1 + .../knowledge-connector/websocket-client/README.md | 1 + cdsp/knowledge-layer/numeric-analyzer/README.md | 1 + cdsp/knowledge-layer/symbolic-reasoner/README.md | 1 + cdsp/knowledge-layer/symbolic-reasoner/examples/README.md | 1 + cdsp/knowledge-layer/symbolic-reasoner/pellet/README.md | 1 + .../symbolic-reasoner/pellet/pellet-adapter/README.md | 1 + .../symbolic-reasoner/pellet/pellet-lib/README.md | 1 + cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md | 1 + .../symbolic-reasoner/rdfox/rdfox-adapter/README.md | 1 + cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-lib/README.md | 1 + 20 files changed, 20 insertions(+) create mode 100644 cdsp/information-layer/README.md create mode 100644 cdsp/information-layer/db-router/README.md create mode 100644 cdsp/information-layer/iotdb/README.md create mode 100644 cdsp/information-layer/realmdb/README.md create mode 100644 cdsp/knowledge-layer/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md create mode 100644 cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md create mode 100644 cdsp/knowledge-layer/numeric-analyzer/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/pellet/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-adapter/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-lib/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-lib/README.md diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/information-layer/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/information-layer/db-router/README.md b/cdsp/information-layer/db-router/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/information-layer/db-router/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/information-layer/iotdb/README.md b/cdsp/information-layer/iotdb/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/information-layer/iotdb/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/information-layer/realmdb/README.md b/cdsp/information-layer/realmdb/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/information-layer/realmdb/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/README.md b/cdsp/knowledge-layer/knowledge-connector/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md b/cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/numeric-analyzer/README.md b/cdsp/knowledge-layer/numeric-analyzer/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/numeric-analyzer/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/README.md b/cdsp/knowledge-layer/symbolic-reasoner/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/README.md b/cdsp/knowledge-layer/symbolic-reasoner/examples/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/pellet/README.md b/cdsp/knowledge-layer/symbolic-reasoner/pellet/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/pellet/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-adapter/README.md b/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-adapter/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-adapter/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-lib/README.md b/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-lib/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/pellet/pellet-lib/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-lib/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-lib/README.md new file mode 100644 index 0000000..fd9e641 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-lib/README.md @@ -0,0 +1 @@ +tbd \ No newline at end of file From 64e06ecb5f9445958b76a5bf9a4cd407850c7aab Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 29 May 2024 15:33:03 +0200 Subject: [PATCH 02/39] add basic setup of informationlayer containing basic dbrouter and realmdb-handler including some resdme updates Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/README.md | 53 +++++++++++- cdsp/information-layer/db-router/.gitignore | 9 ++ cdsp/information-layer/db-router/README.md | 8 +- cdsp/information-layer/db-router/package.json | 12 +++ .../db-router/src/websocket-server.js | 28 +++++++ cdsp/information-layer/realmdb/.gitignore | 12 +++ cdsp/information-layer/realmdb/README.md | 35 +++++++- .../realmdb/config/vehicle-config.js | 3 + cdsp/information-layer/realmdb/package.json | 10 +++ .../realmdb/src/realm-handler.js | 84 +++++++++++++++++++ 10 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 cdsp/information-layer/db-router/.gitignore create mode 100644 cdsp/information-layer/db-router/package.json create mode 100644 cdsp/information-layer/db-router/src/websocket-server.js create mode 100644 cdsp/information-layer/realmdb/.gitignore create mode 100644 cdsp/information-layer/realmdb/config/vehicle-config.js create mode 100644 cdsp/information-layer/realmdb/package.json create mode 100644 cdsp/information-layer/realmdb/src/realm-handler.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index fd9e641..8fca8d8 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -1 +1,52 @@ -tbd \ No newline at end of file +This directory contains files related to the [Information Layer](https://en.wikipedia.org/wiki/DIKW_pyramid) of the Central Data Service Playground. + +## 1. Information Layer Playground components +- Database-Handlers + - [RealmDB-Handler](realmdb/README.md) + - [IotDB-Handler](iotdb/README.md) +- [Database-Router](db-router/README.md) + + +## 2. Setting up a CDSP Information Layer +Setting up an information layer in the CDSP involves running a [Database-Router](db-router/README.md), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). + +### 2.1 Installation of Database-Handler + +Install and configure your database of choice, like described here for [RealmDB](realmdb/README.md) or for [IotDB](iotdb/README.md) + +### 2.2 Installation of Database-Router + +- Install and configure [Database-Router](db-router/README.md) + +## 3. Running "Hello World" example +The Hello World example in our case is quite simple. We feed an updated value for the HVAC ambient air temperature into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. +### 3.1 Choose and prepare your Data Feedeer + +Case 1: You choosed Realm as Database: + +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle document with an _id: 1234567 in a collection named Vehicles. +- Ensure that this document as well contains VSS data. At the moment only 1 data point is supported, namely Vehicle.Cabin.HVAC.AmbientAirTemperature. Here you can see how the vehicle document within theVehicles should like in ATLAS: +
+_id: 1234567 (Int64)
+Vehicle_Cabin_HVAC_AmbientAirTemperature: 6 (Double)
+
+ +Case 2: You choosed IoTDB as Database: + +- Not yet supported + +### 3.2 Start the Database Router +Start DB-Router by executing in db-router/src directory the command + + + node websocket-server.js + + +### 3.3 Look out for the Websocket Server message in the console +Now you can changed the value of Vehicle_Cabin_HVAC_AmbientAirTemperature in ATLAS cloud to let's say 23. After changing you should immediately see this line in console + + * the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 + + +### 3.4 Connect your own Websocket Client +Connect your own websocket client by connecting to ws://localhost:8080 \ No newline at end of file diff --git a/cdsp/information-layer/db-router/.gitignore b/cdsp/information-layer/db-router/.gitignore new file mode 100644 index 0000000..eec8018 --- /dev/null +++ b/cdsp/information-layer/db-router/.gitignore @@ -0,0 +1,9 @@ +# MongoDB Realm +mongodb-realm/ + +# Node.js +node_modules/ +package-lock.json + +# MAC +**/.DS_Store \ No newline at end of file diff --git a/cdsp/information-layer/db-router/README.md b/cdsp/information-layer/db-router/README.md index fd9e641..0c249bd 100644 --- a/cdsp/information-layer/db-router/README.md +++ b/cdsp/information-layer/db-router/README.md @@ -1 +1,7 @@ -tbd \ No newline at end of file +With [Database-Router](db-router/README.md) one can configure which database it shall connect to (As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now) . + +### Installation of DB-Router + +Execute within db-router directory + + npm install \ No newline at end of file diff --git a/cdsp/information-layer/db-router/package.json b/cdsp/information-layer/db-router/package.json new file mode 100644 index 0000000..81e3e89 --- /dev/null +++ b/cdsp/information-layer/db-router/package.json @@ -0,0 +1,12 @@ +{ + "name": "websocket-server", + "version": "1.0.0", + "description": "WebSocket server", + "main": "websocket-server.js", + "scripts": { + "start": "node websocket-server.js" + }, + "dependencies": { + "ws": "^7.4.6" + } +} \ No newline at end of file diff --git a/cdsp/information-layer/db-router/src/websocket-server.js b/cdsp/information-layer/db-router/src/websocket-server.js new file mode 100644 index 0000000..4941238 --- /dev/null +++ b/cdsp/information-layer/db-router/src/websocket-server.js @@ -0,0 +1,28 @@ +const WebSocket = require('ws'); +const { authenticateAndConnectToRealm, onMediaElementChange } = require('../../realmdb/src/realm-handler'); + + +const server = new WebSocket.Server({ port: 8080 }); + +// Define clients array globally +let clients = []; + +server.on('connection', ws => { + console.log('Client connected'); + clients.push(ws); // Add client to the array + + ws.on('close', () => { + console.log('Client disconnected'); + // Remove disconnected client from the array + clients = clients.filter(client => client !== ws); + }); +}); + +const sendMessageToClients = (message) => { + clients.forEach(client => { + client.send(JSON.stringify(message)); + }); +}; + +console.log('Starting authentication and connection to Realm...'); +authenticateAndConnectToRealm(sendMessageToClients, onMediaElementChange); diff --git a/cdsp/information-layer/realmdb/.gitignore b/cdsp/information-layer/realmdb/.gitignore new file mode 100644 index 0000000..4fed37d --- /dev/null +++ b/cdsp/information-layer/realmdb/.gitignore @@ -0,0 +1,12 @@ +# MongoDB Realm +mongodb-realm/ + +# Node.js +node_modules/ +package-lock.json + +# Credentials Config File +config.js + +# MAC +**/.DS_Store \ No newline at end of file diff --git a/cdsp/information-layer/realmdb/README.md b/cdsp/information-layer/realmdb/README.md index fd9e641..d24e906 100644 --- a/cdsp/information-layer/realmdb/README.md +++ b/cdsp/information-layer/realmdb/README.md @@ -1 +1,34 @@ -tbd \ No newline at end of file +This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embedds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. + +## 1 Installation of RealmDB-Handler + +Execute within realmdb/src directory + + npm install + +## 2 Configuring RealmDB +Before the Database-Router can start the RealmDB Handler without any errors you need to configure the RealmSDK before. + +### 2.1 Create ATLAS Cloud instance +To get APIKey and AppID you need to setup a [ATLAS cloud](https://cloud.mongodb.com/) instance and App Services. There is a free Tier solution (Status as of May 29, 2024) and you will find a lot of documentation in the internet how to set up everything. + +### 2.2 Configuration of RealmDB Handler + +Create a file config.js in the existing realmdb/config directory and add this content: + + + module.exports = {
+ realmAppId: 'your-realm-AppId',
+ realmApiKey: 'your-realm-ApiKey'
+ }; +
+ +> **_IMPORTANT:_** Do not commit this file to github! + + +### 2.3 Configuration of example vehicle +In the already existing file vehicle-config.js you can change the VIN (Vehicle Identification Number) of the example vehicle. The default VIN is 1234567. If you do not want to change it ensure, that in your ATLAS cloud instance there is a vehicle document with an _id: 1234567 in a collection named Vehicles. More infos how to run an example together with ATLAS cloud you can find [here](../readme.md#case-1-you-choosed-realm-as-database). + +## 3 Starting RealmDB-Handler +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../readme.md#22-installation-of-database-router). + diff --git a/cdsp/information-layer/realmdb/config/vehicle-config.js b/cdsp/information-layer/realmdb/config/vehicle-config.js new file mode 100644 index 0000000..a7777ed --- /dev/null +++ b/cdsp/information-layer/realmdb/config/vehicle-config.js @@ -0,0 +1,3 @@ +module.exports = { + Vin: 1234567 + }; \ No newline at end of file diff --git a/cdsp/information-layer/realmdb/package.json b/cdsp/information-layer/realmdb/package.json new file mode 100644 index 0000000..fb5c9ee --- /dev/null +++ b/cdsp/information-layer/realmdb/package.json @@ -0,0 +1,10 @@ +{ + "name": "realm-handler", + "version": "1.0.0", + "description": "Realm database handler", + "main": "realm-handler.js", + "dependencies": { + "realm": "^12.9.0", + "uuid": "^9.0.1" + } +} diff --git a/cdsp/information-layer/realmdb/src/realm-handler.js b/cdsp/information-layer/realmdb/src/realm-handler.js new file mode 100644 index 0000000..2ebd550 --- /dev/null +++ b/cdsp/information-layer/realmdb/src/realm-handler.js @@ -0,0 +1,84 @@ +const Realm = require('realm'); +const config = require('../config/config'); +const vehicleConfig = require('../config/vehicle-config'); // Import vehicle config file +const { v4: uuidv4 } = require('uuid'); // Importing UUID generator + +const MediaElementSchema = { + primaryKey: '_id', + name: 'Vehicles', + properties: { + _id: 'int', + Vehicle_Cabin_HVAC_AmbientAirTemperature: 'double' + } +}; + +const app = new Realm.App({ id: config.realmAppId }); +const credentials = Realm.Credentials.apiKey(config.realmApiKey); + +const realmConfig = { + schema: [MediaElementSchema], + path: 'myrealm12.realm', + sync: { + user: null, // will be assigned after authentication + flexible: true, + error: error => { + console.error('Realm sync error:', error); + } + } +}; + +const authenticateAndConnectToRealm = async (sendMessageToClients, onMediaElementChange) => { + try { + const user = await app.logIn(credentials); + console.log('Successfully authenticated with Realm'); + + realmConfig.sync.user = user; + const realm = await Realm.open(realmConfig); + console.log('Realm connection established successfully'); + + const MediaElements = realm.objects('Vehicles').subscribe(); + console.log(MediaElements); + + const objectId = vehicleConfig.Vin; // Retrieve objectId from config file + const mediaElement = realm.objectForPrimaryKey('Vehicles', objectId); + console.log(mediaElement); + + // Set WebSocket server ID as the same objectId + const websocketId = String(objectId); + + mediaElement.addListener((mediaElement, changes) => onMediaElementChange(mediaElement, changes, sendMessageToClients, websocketId)); + } catch (error) { + console.error('Failed to authenticate with Realm:', error); + } +}; + +const onMediaElementChange = (mediaElement, changes, sendMessageToClients, websocketId) => { + if (changes.deleted) { + console.log(`MediaElement is deleted: ${changes.deleted}`); + } else { + changes.changedProperties.forEach(prop => { + console.log(`* the value of "${prop}" changed to ${mediaElement[prop]}`); + + // Generate a meaningful UUID for WebSocket response + const uuid = uuidv4(); + + const message = { + type: 'update', + tree: 'VSS', + id: websocketId, // Use the WebSocket server ID + uuid: uuid, // Use generated UUID + dateTime: new Date().toISOString(), + node: { + name: prop, // Sending the property name as node name + value: mediaElement[prop] // Sending the property value as node value + } + }; + sendMessageToClients(message); + }); + } +}; + +module.exports = { + authenticateAndConnectToRealm, + onMediaElementChange +}; From 5ee12fda7408a3bbe522d7cc5337b57cde06e427 Mon Sep 17 00:00:00 2001 From: haonan-qiu Date: Fri, 31 May 2024 12:33:12 +0200 Subject: [PATCH 03/39] add files Signed-off-by: haonan-qiu --- .../json-rdf-convertor/utils/data_structs.h | 74 +++++++++++++++ .../json-rdf-convertor/utils/utils.h | 89 +++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h create mode 100644 cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h new file mode 100644 index 0000000..eb3eeec --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h @@ -0,0 +1,74 @@ +/// +/// @file +/// @copyright Copyright (C) 2017-2023, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +/// + +#ifndef DATA_STRUCTS_DATA_STRUCTS_H +#define DATA_STRUCTS_DATA_STRUCTS_H + +#include +#include +#include + +struct MessageHeader +{ + std::string id; + std::string type; + std::string tree; + std::string date_time; + std::string timestamp; + std::chrono::duration time_stamp; +}; + +struct Node +{ + std::string name; + std::string date_time; + std::string timestamp; + std::vector values; + std::chrono::duration time_stamp; +}; + +struct Data +{ + MessageHeader header; + std::vector nodes; +}; + +struct DataPoint +{ + std::string name; + std::string value; +}; + +struct InferredResult +{ + std::string entity_id; + std::vector data; +}; + +struct ProgramOptions +{ + std::string map; + std::string output_ttl; + std::string persist_data; + std::string entity_id; + + bool enable_message_log; + bool test_rules; + bool dummy_server; +}; + +struct QueryData +{ + std::string name_one; + std::string name_two; + std::string has_statement; + std::string data_type; + std::string prefix_name_one; + std::string prefix_name_two; + std::string prefix_data_type; + std::string prefix_has_statement; +}; + +#endif // DATA_STRUCTS_DATA_STRUCTS_H diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h new file mode 100644 index 0000000..f163215 --- /dev/null +++ b/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h @@ -0,0 +1,89 @@ +/// +/// @file +/// @copyright Copyright (C) 2017-2023, Bayerische Motoren Werke Aktiengesellschaft (BMW AG) +/// + +#ifndef UTILS_UTILS_H +#define UTILS_UTILS_H + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "data_structs.h" + +namespace utils +{ +namespace parser +{ +Data GetVehicleFeatureDataFromString(const std::string& string_feature); + +void RemoveChars(const char chars_to_remove[], std::string& string); + +void RemoveSubstring(const std::string& to_erase, std::string& string_feature); + +void SubstituteCharacter(std::string& input, char a, char b); + +Json::Value ParseJsonFromStream(const std::string& input_json); + +Json::Value ParseJsonFromString(const std::string& input_json); + +std::string FindDataTypesInJsonStream(const Json::Value& json_value, + const std::string& name_structure, + std::unordered_map& data_types_map); + +std::chrono::duration GetChronoTimeFromDateTime(const std::string& date_time_string); + +std::chrono::duration> GetChronoTimeInMinutesFromTime(const std::string& time_string); + +std::string GetHourPartFromDateTime(const std::string& date_time); + +std::string GetHourPartFromDateTimeAndSum(const std::string& start_time, const std::string& end_time); + +std::vector ParseWhenMultiNode(const Json::Value& nodes); + +Node ParseWhenSingleNode(const Json::Value& node); + +} // namespace parser + +void WriteStringToFile(const std::string& string_to_write); + +std::vector GetCurrentInferenceResultInJsonFormat(const std::vector& result, + const std::string& type, + const std::string& tree, + const std::string& id, + const bool is_test); + +std::vector ConvertCurrentInferenceResultToJson(const std::vector& result, + const std::string& type, + const std::string& tree, + const std::string& id); + +Json::Value GroupMessages(const Json::Value& message_1, const Json::Value& message2); + + +std::string GetIntials(const std::string input_string); + + +template +std::string to_string_with_precision(const T a_value, const int n = 15) +{ + std::ostringstream out; + out.precision(n); + out << std::fixed << a_value; + return out.str(); +} +} // namespace utils + +#endif From 75c0eb34c71df6fa44aabc4368ec40d0e286e1d9 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 09:15:35 +0200 Subject: [PATCH 04/39] Fixed readme format of config.js Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/realmdb/README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/cdsp/information-layer/realmdb/README.md b/cdsp/information-layer/realmdb/README.md index d24e906..7e298c8 100644 --- a/cdsp/information-layer/realmdb/README.md +++ b/cdsp/information-layer/realmdb/README.md @@ -16,13 +16,12 @@ To get APIKey and AppID you need to setup a [ATLAS cloud](https://cloud.mongodb. Create a file config.js in the existing realmdb/config directory and add this content: - - module.exports = {
- realmAppId: 'your-realm-AppId',
- realmApiKey: 'your-realm-ApiKey'
- }; -
- +```js +module.exports = { + realmAppId: 'your-realm-AppId', + realmApiKey: 'your-realm-ApiKey' +}; +``` > **_IMPORTANT:_** Do not commit this file to github! From a77d8a3de2861e87e363eff8d4777c4d2aa21d76 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 09:24:04 +0200 Subject: [PATCH 05/39] Renamed knowledge-connector -> connector Signed-off-by: Sebastian Schleemilch --- cdsp/knowledge-layer/{knowledge-connector => connector}/README.md | 0 .../json-rdf-convertor/README.md | 0 .../json-rdf-convertor/json-writer/README.md | 0 .../json-rdf-convertor/rdf-writer/README.md | 0 .../json-rdf-convertor/utils/README.md | 0 .../json-rdf-convertor/utils/data_structs.h | 0 .../json-rdf-convertor/utils/utils.h | 0 .../{knowledge-connector => connector}/websocket-client/README.md | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename cdsp/knowledge-layer/{knowledge-connector => connector}/README.md (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/README.md (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/json-writer/README.md (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/rdf-writer/README.md (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/utils/README.md (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/utils/data_structs.h (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/json-rdf-convertor/utils/utils.h (100%) rename cdsp/knowledge-layer/{knowledge-connector => connector}/websocket-client/README.md (100%) diff --git a/cdsp/knowledge-layer/knowledge-connector/README.md b/cdsp/knowledge-layer/connector/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/README.md rename to cdsp/knowledge-layer/connector/README.md diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md b/cdsp/knowledge-layer/connector/json-rdf-convertor/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/README.md rename to cdsp/knowledge-layer/connector/json-rdf-convertor/README.md diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md b/cdsp/knowledge-layer/connector/json-rdf-convertor/json-writer/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/json-writer/README.md rename to cdsp/knowledge-layer/connector/json-rdf-convertor/json-writer/README.md diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md b/cdsp/knowledge-layer/connector/json-rdf-convertor/rdf-writer/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/rdf-writer/README.md rename to cdsp/knowledge-layer/connector/json-rdf-convertor/rdf-writer/README.md diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md b/cdsp/knowledge-layer/connector/json-rdf-convertor/utils/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/README.md rename to cdsp/knowledge-layer/connector/json-rdf-convertor/utils/README.md diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h b/cdsp/knowledge-layer/connector/json-rdf-convertor/utils/data_structs.h similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/data_structs.h rename to cdsp/knowledge-layer/connector/json-rdf-convertor/utils/data_structs.h diff --git a/cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h b/cdsp/knowledge-layer/connector/json-rdf-convertor/utils/utils.h similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/json-rdf-convertor/utils/utils.h rename to cdsp/knowledge-layer/connector/json-rdf-convertor/utils/utils.h diff --git a/cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md b/cdsp/knowledge-layer/connector/websocket-client/README.md similarity index 100% rename from cdsp/knowledge-layer/knowledge-connector/websocket-client/README.md rename to cdsp/knowledge-layer/connector/websocket-client/README.md From 327db86851762e4a361f7a61b1f84fc168778c6d Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 09:27:59 +0200 Subject: [PATCH 06/39] Removed dead README link Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/db-router/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdsp/information-layer/db-router/README.md b/cdsp/information-layer/db-router/README.md index 0c249bd..048bc17 100644 --- a/cdsp/information-layer/db-router/README.md +++ b/cdsp/information-layer/db-router/README.md @@ -1,7 +1,7 @@ -With [Database-Router](db-router/README.md) one can configure which database it shall connect to (As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now) . +With this component one can configure which database it shall connect to (As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now) . ### Installation of DB-Router Execute within db-router directory - npm install \ No newline at end of file + npm install From 69da82d63e7aa60a18d29908e773762f7a01ac9b Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 10:55:30 +0200 Subject: [PATCH 07/39] Fixed README formatting and fixed typos Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 64 ++++++++++++++++---------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 8fca8d8..e52dfb7 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -1,52 +1,50 @@ This directory contains files related to the [Information Layer](https://en.wikipedia.org/wiki/DIKW_pyramid) of the Central Data Service Playground. -## 1. Information Layer Playground components -- Database-Handlers - - [RealmDB-Handler](realmdb/README.md) - - [IotDB-Handler](iotdb/README.md) -- [Database-Router](db-router/README.md) +# Information Layer Playground components + - Database-Handlers + - [RealmDB-Handler](realmdb/README.md) + - [IotDB-Handler](iotdb/README.md) + - [Database-Router](db-router/README.md) - -## 2. Setting up a CDSP Information Layer +# Setting up a CDSP Information Layer Setting up an information layer in the CDSP involves running a [Database-Router](db-router/README.md), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). -### 2.1 Installation of Database-Handler - +## Installation of Database-Handler Install and configure your database of choice, like described here for [RealmDB](realmdb/README.md) or for [IotDB](iotdb/README.md) - -### 2.2 Installation of Database-Router + +## [Installation of Database-Router](./db-router/README.md) -- Install and configure [Database-Router](db-router/README.md) +# Running "Hello World" example -## 3. Running "Hello World" example The Hello World example in our case is quite simple. We feed an updated value for the HVAC ambient air temperature into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. -### 3.1 Choose and prepare your Data Feedeer -Case 1: You choosed Realm as Database: +## Choose and prepare your Database -- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle document with an _id: 1234567 in a collection named Vehicles. -- Ensure that this document as well contains VSS data. At the moment only 1 data point is supported, namely Vehicle.Cabin.HVAC.AmbientAirTemperature. Here you can see how the vehicle document within theVehicles should like in ATLAS: -
-_id: 1234567 (Int64)
-Vehicle_Cabin_HVAC_AmbientAirTemperature: 6 (Double)
-
+### Realm +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `_id: 1234567` in a collection named *Vehicles*. +- Ensure that this document as well contains VSS data. At the moment only 1 data point is supported, namely `Vehicle.Cabin.HVAC.AmbientAirTemperature`. Here you can see how the vehicle document within the *Vehicles* should look like in ATLAS: -Case 2: You choosed IoTDB as Database: + ``` + _id: 1234567 (Int64) + Vehicle_Cabin_HVAC_AmbientAirTemperature: 6 (Double) + ``` +### IoTDB - Not yet supported -### 3.2 Start the Database Router -Start DB-Router by executing in db-router/src directory the command - - - node websocket-server.js - +## Start the Database Router +Start DB-Router by executing in `db-router/src` directory the command -### 3.3 Look out for the Websocket Server message in the console -Now you can changed the value of Vehicle_Cabin_HVAC_AmbientAirTemperature in ATLAS cloud to let's say 23. After changing you should immediately see this line in console +```bash +node websocket-server.js +``` - * the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 +## Look out for the Websocket Server message in the console +Now you can changed the value of *Vehicle_Cabin_HVAC_AmbientAirTemperature* in ATLAS cloud to let's say `23`. After changing you should immediately see this line in console: +``` +the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 +``` -### 3.4 Connect your own Websocket Client -Connect your own websocket client by connecting to ws://localhost:8080 \ No newline at end of file +## Connect your own Websocket Client +Connect your own websocket client by connecting to `ws://localhost:8080` From 9bb7dc48bc9cf164c9415f2650cf714edef556f9 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 11:19:18 +0200 Subject: [PATCH 08/39] Updated docs, added config.js Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/db-router/README.md | 10 +++-- cdsp/information-layer/db-router/package.json | 2 +- .../db-router/src/websocket-server.js | 24 ++++++------ cdsp/information-layer/realmdb/.gitignore | 2 +- cdsp/information-layer/realmdb/README.md | 38 +++++++++++-------- .../realmdb/config/vehicle-config.js | 5 ++- 6 files changed, 47 insertions(+), 34 deletions(-) diff --git a/cdsp/information-layer/db-router/README.md b/cdsp/information-layer/db-router/README.md index 048bc17..8571f68 100644 --- a/cdsp/information-layer/db-router/README.md +++ b/cdsp/information-layer/db-router/README.md @@ -1,7 +1,9 @@ -With this component one can configure which database it shall connect to (As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now) . +With this component one can configure which database it shall connect to *(As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now)*. -### Installation of DB-Router +# Installation -Execute within db-router directory +Execute within `db-router` directory: - npm install +```bash +npm install +``` diff --git a/cdsp/information-layer/db-router/package.json b/cdsp/information-layer/db-router/package.json index 81e3e89..7fbc984 100644 --- a/cdsp/information-layer/db-router/package.json +++ b/cdsp/information-layer/db-router/package.json @@ -9,4 +9,4 @@ "dependencies": { "ws": "^7.4.6" } -} \ No newline at end of file +} diff --git a/cdsp/information-layer/db-router/src/websocket-server.js b/cdsp/information-layer/db-router/src/websocket-server.js index 4941238..d9794b8 100644 --- a/cdsp/information-layer/db-router/src/websocket-server.js +++ b/cdsp/information-layer/db-router/src/websocket-server.js @@ -1,28 +1,30 @@ -const WebSocket = require('ws'); -const { authenticateAndConnectToRealm, onMediaElementChange } = require('../../realmdb/src/realm-handler'); - +const WebSocket = require("ws"); +const { + authenticateAndConnectToRealm, + onMediaElementChange, +} = require("../../realmdb/src/realm-handler"); const server = new WebSocket.Server({ port: 8080 }); // Define clients array globally let clients = []; -server.on('connection', ws => { - console.log('Client connected'); +server.on("connection", (ws) => { + console.log("Client connected"); clients.push(ws); // Add client to the array - - ws.on('close', () => { - console.log('Client disconnected'); + + ws.on("close", () => { + console.log("Client disconnected"); // Remove disconnected client from the array - clients = clients.filter(client => client !== ws); + clients = clients.filter((client) => client !== ws); }); }); const sendMessageToClients = (message) => { - clients.forEach(client => { + clients.forEach((client) => { client.send(JSON.stringify(message)); }); }; -console.log('Starting authentication and connection to Realm...'); +console.log("Starting authentication and connection to Realm..."); authenticateAndConnectToRealm(sendMessageToClients, onMediaElementChange); diff --git a/cdsp/information-layer/realmdb/.gitignore b/cdsp/information-layer/realmdb/.gitignore index 4fed37d..7652e67 100644 --- a/cdsp/information-layer/realmdb/.gitignore +++ b/cdsp/information-layer/realmdb/.gitignore @@ -9,4 +9,4 @@ package-lock.json config.js # MAC -**/.DS_Store \ No newline at end of file +**/.DS_Store diff --git a/cdsp/information-layer/realmdb/README.md b/cdsp/information-layer/realmdb/README.md index 7e298c8..733c2bc 100644 --- a/cdsp/information-layer/realmdb/README.md +++ b/cdsp/information-layer/realmdb/README.md @@ -1,33 +1,41 @@ This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embedds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. -## 1 Installation of RealmDB-Handler +# Installation -Execute within realmdb/src directory +Execute within `realmdb` directory - npm install +```bash +npm install +``` + +# Configure RealmDB + +Before the Database-Router can start the RealmDB Handler without any errors you need to configure the RealmSDK before. -## 2 Configuring RealmDB -Before the Database-Router can start the RealmDB Handler without any errors you need to configure the RealmSDK before. +## Create a ATLAS Cloud instance -### 2.1 Create ATLAS Cloud instance To get APIKey and AppID you need to setup a [ATLAS cloud](https://cloud.mongodb.com/) instance and App Services. There is a free Tier solution (Status as of May 29, 2024) and you will find a lot of documentation in the internet how to set up everything. -### 2.2 Configuration of RealmDB Handler +## Configure of a RealmDB Handler -Create a file config.js in the existing realmdb/config directory and add this content: +Create `config/config.js` with the following format, replacing the app id and the api key with yours. ```js module.exports = { - realmAppId: 'your-realm-AppId', - realmApiKey: 'your-realm-ApiKey' + realmAppId: "your-realm-AppId", + realmApiKey: "your-realm-ApiKey", }; ``` -> **_IMPORTANT:_** Do not commit this file to github! +> **_IMPORTANT:_** Do not commit this file to github! -### 2.3 Configuration of example vehicle -In the already existing file vehicle-config.js you can change the VIN (Vehicle Identification Number) of the example vehicle. The default VIN is 1234567. If you do not want to change it ensure, that in your ATLAS cloud instance there is a vehicle document with an _id: 1234567 in a collection named Vehicles. More infos how to run an example together with ATLAS cloud you can find [here](../readme.md#case-1-you-choosed-realm-as-database). +## Configure an example vehicle -## 3 Starting RealmDB-Handler -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../readme.md#22-installation-of-database-router). +Change the VIN (Vehicle Identification Number) of the example vehicle in [vehicle-config](./config/vehicle-config.js). +The default VIN is `1234567`. +If you do not want to change it ensure, that in your ATLAS cloud instance there is a vehicle _document_ with an `_id: 1234567` in a collection named `Vehicles`. +More infos how to run an example together with ATLAS cloud you can find [here](../readme.md#case-1-you-choosed-realm-as-database). + +## Starting the RealmDB handler +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../readme.md#22-installation-of-database-router). diff --git a/cdsp/information-layer/realmdb/config/vehicle-config.js b/cdsp/information-layer/realmdb/config/vehicle-config.js index a7777ed..c469fca 100644 --- a/cdsp/information-layer/realmdb/config/vehicle-config.js +++ b/cdsp/information-layer/realmdb/config/vehicle-config.js @@ -1,3 +1,4 @@ module.exports = { - Vin: 1234567 - }; \ No newline at end of file + Vin: 1234567, +}; + From e0d7aa66025649d2fd3b08e6b5d87509ed55f7c4 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 12:45:03 +0200 Subject: [PATCH 09/39] Added handlers layer Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 15 +++++++-------- cdsp/information-layer/handlers/README.md | 4 ++++ .../{ => handlers}/iotdb/README.md | 0 .../{ => handlers}/realmdb/.gitignore | 0 .../{ => handlers}/realmdb/README.md | 0 .../realmdb/config/vehicle-config.js | 0 .../{ => handlers}/realmdb/package.json | 0 .../{ => handlers}/realmdb/src/realm-handler.js | 0 .../{db-router => router}/.gitignore | 0 .../{db-router => router}/README.md | 2 +- .../{db-router => router}/package.json | 0 .../{db-router => router}/src/websocket-server.js | 0 12 files changed, 12 insertions(+), 9 deletions(-) create mode 100644 cdsp/information-layer/handlers/README.md rename cdsp/information-layer/{ => handlers}/iotdb/README.md (100%) rename cdsp/information-layer/{ => handlers}/realmdb/.gitignore (100%) rename cdsp/information-layer/{ => handlers}/realmdb/README.md (100%) rename cdsp/information-layer/{ => handlers}/realmdb/config/vehicle-config.js (100%) rename cdsp/information-layer/{ => handlers}/realmdb/package.json (100%) rename cdsp/information-layer/{ => handlers}/realmdb/src/realm-handler.js (100%) rename cdsp/information-layer/{db-router => router}/.gitignore (100%) rename cdsp/information-layer/{db-router => router}/README.md (86%) rename cdsp/information-layer/{db-router => router}/package.json (100%) rename cdsp/information-layer/{db-router => router}/src/websocket-server.js (100%) diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index e52dfb7..3a78868 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -1,18 +1,17 @@ This directory contains files related to the [Information Layer](https://en.wikipedia.org/wiki/DIKW_pyramid) of the Central Data Service Playground. # Information Layer Playground components - - Database-Handlers - - [RealmDB-Handler](realmdb/README.md) - - [IotDB-Handler](iotdb/README.md) - - [Database-Router](db-router/README.md) + - [Database-Handlers](./handlers) + - [Database-Router](./router) # Setting up a CDSP Information Layer -Setting up an information layer in the CDSP involves running a [Database-Router](db-router/README.md), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). +Setting up an information layer in the CDSP involves running a [Database-Router](./router), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). ## Installation of Database-Handler -Install and configure your database of choice, like described here for [RealmDB](realmdb/README.md) or for [IotDB](iotdb/README.md) + +Please follow installation instructions of the chosen [handler](./handlers/) -## [Installation of Database-Router](./db-router/README.md) +## [Installation of Database-Router](./router) # Running "Hello World" example @@ -33,7 +32,7 @@ The Hello World example in our case is quite simple. We feed an updated value fo - Not yet supported ## Start the Database Router -Start DB-Router by executing in `db-router/src` directory the command +Start router by executing in [router src](./router/src/) directory the command: ```bash node websocket-server.js diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md new file mode 100644 index 0000000..cb4711b --- /dev/null +++ b/cdsp/information-layer/handlers/README.md @@ -0,0 +1,4 @@ +# Handlers + +- [IotDB](./iotdb) +- [RealmDB](./realmdb) diff --git a/cdsp/information-layer/iotdb/README.md b/cdsp/information-layer/handlers/iotdb/README.md similarity index 100% rename from cdsp/information-layer/iotdb/README.md rename to cdsp/information-layer/handlers/iotdb/README.md diff --git a/cdsp/information-layer/realmdb/.gitignore b/cdsp/information-layer/handlers/realmdb/.gitignore similarity index 100% rename from cdsp/information-layer/realmdb/.gitignore rename to cdsp/information-layer/handlers/realmdb/.gitignore diff --git a/cdsp/information-layer/realmdb/README.md b/cdsp/information-layer/handlers/realmdb/README.md similarity index 100% rename from cdsp/information-layer/realmdb/README.md rename to cdsp/information-layer/handlers/realmdb/README.md diff --git a/cdsp/information-layer/realmdb/config/vehicle-config.js b/cdsp/information-layer/handlers/realmdb/config/vehicle-config.js similarity index 100% rename from cdsp/information-layer/realmdb/config/vehicle-config.js rename to cdsp/information-layer/handlers/realmdb/config/vehicle-config.js diff --git a/cdsp/information-layer/realmdb/package.json b/cdsp/information-layer/handlers/realmdb/package.json similarity index 100% rename from cdsp/information-layer/realmdb/package.json rename to cdsp/information-layer/handlers/realmdb/package.json diff --git a/cdsp/information-layer/realmdb/src/realm-handler.js b/cdsp/information-layer/handlers/realmdb/src/realm-handler.js similarity index 100% rename from cdsp/information-layer/realmdb/src/realm-handler.js rename to cdsp/information-layer/handlers/realmdb/src/realm-handler.js diff --git a/cdsp/information-layer/db-router/.gitignore b/cdsp/information-layer/router/.gitignore similarity index 100% rename from cdsp/information-layer/db-router/.gitignore rename to cdsp/information-layer/router/.gitignore diff --git a/cdsp/information-layer/db-router/README.md b/cdsp/information-layer/router/README.md similarity index 86% rename from cdsp/information-layer/db-router/README.md rename to cdsp/information-layer/router/README.md index 8571f68..bc06681 100644 --- a/cdsp/information-layer/db-router/README.md +++ b/cdsp/information-layer/router/README.md @@ -2,7 +2,7 @@ With this component one can configure which database it shall connect to *(As th # Installation -Execute within `db-router` directory: +Execute in this directory: ```bash npm install diff --git a/cdsp/information-layer/db-router/package.json b/cdsp/information-layer/router/package.json similarity index 100% rename from cdsp/information-layer/db-router/package.json rename to cdsp/information-layer/router/package.json diff --git a/cdsp/information-layer/db-router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js similarity index 100% rename from cdsp/information-layer/db-router/src/websocket-server.js rename to cdsp/information-layer/router/src/websocket-server.js From 9722e2b07ff290ee8e76df66b82897f780b7b2cb Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 13:00:28 +0200 Subject: [PATCH 10/39] Hint for hard coded realmdb and js formatting Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 11 +-- .../handlers/realmdb/src/realm-handler.js | 73 +++++++++++-------- cdsp/information-layer/router/README.md | 15 +++- 3 files changed, 60 insertions(+), 39 deletions(-) diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 3a78868..fa1677a 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -11,7 +11,7 @@ Setting up an information layer in the CDSP involves running a [Database-Router] Please follow installation instructions of the chosen [handler](./handlers/) -## [Installation of Database-Router](./router) +## [Installation of Database-Router](./router/README.md#Install) # Running "Hello World" example @@ -31,15 +31,10 @@ The Hello World example in our case is quite simple. We feed an updated value fo ### IoTDB - Not yet supported -## Start the Database Router -Start router by executing in [router src](./router/src/) directory the command: - -```bash -node websocket-server.js -``` +## [Start](./router/README.md#Run) the Database Router ## Look out for the Websocket Server message in the console -Now you can changed the value of *Vehicle_Cabin_HVAC_AmbientAirTemperature* in ATLAS cloud to let's say `23`. After changing you should immediately see this line in console: +Now you can changed the value of `Vehicle_Cabin_HVAC_AmbientAirTemperature` in ATLAS cloud to let's say `23`. After changing you should immediately see this line in console: ``` the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 diff --git a/cdsp/information-layer/handlers/realmdb/src/realm-handler.js b/cdsp/information-layer/handlers/realmdb/src/realm-handler.js index 2ebd550..b4c41d5 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realm-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realm-handler.js @@ -1,15 +1,15 @@ -const Realm = require('realm'); -const config = require('../config/config'); -const vehicleConfig = require('../config/vehicle-config'); // Import vehicle config file -const { v4: uuidv4 } = require('uuid'); // Importing UUID generator +const Realm = require("realm"); +const config = require("../config/config"); +const vehicleConfig = require("../config/vehicle-config"); // Import vehicle config file +const { v4: uuidv4 } = require("uuid"); // Importing UUID generator const MediaElementSchema = { - primaryKey: '_id', - name: 'Vehicles', + primaryKey: "_id", + name: "Vehicles", properties: { - _id: 'int', - Vehicle_Cabin_HVAC_AmbientAirTemperature: 'double' - } + _id: "int", + Vehicle_Cabin_HVAC_AmbientAirTemperature: "double", + }, }; const app = new Realm.App({ id: config.realmAppId }); @@ -17,61 +17,76 @@ const credentials = Realm.Credentials.apiKey(config.realmApiKey); const realmConfig = { schema: [MediaElementSchema], - path: 'myrealm12.realm', + path: "myrealm12.realm", sync: { user: null, // will be assigned after authentication flexible: true, - error: error => { - console.error('Realm sync error:', error); - } - } + error: (error) => { + console.error("Realm sync error:", error); + }, + }, }; -const authenticateAndConnectToRealm = async (sendMessageToClients, onMediaElementChange) => { +const authenticateAndConnectToRealm = async ( + sendMessageToClients, + onMediaElementChange, +) => { try { const user = await app.logIn(credentials); - console.log('Successfully authenticated with Realm'); + console.log("Successfully authenticated with Realm"); realmConfig.sync.user = user; const realm = await Realm.open(realmConfig); - console.log('Realm connection established successfully'); + console.log("Realm connection established successfully"); - const MediaElements = realm.objects('Vehicles').subscribe(); + const MediaElements = realm.objects("Vehicles").subscribe(); console.log(MediaElements); const objectId = vehicleConfig.Vin; // Retrieve objectId from config file - const mediaElement = realm.objectForPrimaryKey('Vehicles', objectId); + const mediaElement = realm.objectForPrimaryKey("Vehicles", objectId); console.log(mediaElement); // Set WebSocket server ID as the same objectId const websocketId = String(objectId); - mediaElement.addListener((mediaElement, changes) => onMediaElementChange(mediaElement, changes, sendMessageToClients, websocketId)); + mediaElement.addListener((mediaElement, changes) => + onMediaElementChange( + mediaElement, + changes, + sendMessageToClients, + websocketId, + ), + ); } catch (error) { - console.error('Failed to authenticate with Realm:', error); + console.error("Failed to authenticate with Realm:", error); } }; -const onMediaElementChange = (mediaElement, changes, sendMessageToClients, websocketId) => { +const onMediaElementChange = ( + mediaElement, + changes, + sendMessageToClients, + websocketId, +) => { if (changes.deleted) { console.log(`MediaElement is deleted: ${changes.deleted}`); } else { - changes.changedProperties.forEach(prop => { + changes.changedProperties.forEach((prop) => { console.log(`* the value of "${prop}" changed to ${mediaElement[prop]}`); - + // Generate a meaningful UUID for WebSocket response const uuid = uuidv4(); const message = { - type: 'update', - tree: 'VSS', + type: "update", + tree: "VSS", id: websocketId, // Use the WebSocket server ID uuid: uuid, // Use generated UUID dateTime: new Date().toISOString(), node: { name: prop, // Sending the property name as node name - value: mediaElement[prop] // Sending the property value as node value - } + value: mediaElement[prop], // Sending the property value as node value + }, }; sendMessageToClients(message); }); @@ -80,5 +95,5 @@ const onMediaElementChange = (mediaElement, changes, sendMessageToClients, webso module.exports = { authenticateAndConnectToRealm, - onMediaElementChange + onMediaElementChange, }; diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md index bc06681..d9b9032 100644 --- a/cdsp/information-layer/router/README.md +++ b/cdsp/information-layer/router/README.md @@ -1,9 +1,20 @@ -With this component one can configure which database it shall connect to *(As this configuration capability is not yet implemented you can skip the configuration step, it's always choosen RealmDB for now)*. +With this component one can configure which database it shall connect to. -# Installation +> [!WARNING] +> As the configuration capability is not yet implemented, RealmDB is hard coded as a database! + +# Install Execute in this directory: ```bash npm install ``` + +# Run + +Start router by executing in [src](./src/) directory the command: + +```bash +node websocket-server.js +``` From dbbed43444d2b0b268983a76db153f34ff3eb9d9 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 6 Jun 2024 14:32:38 +0200 Subject: [PATCH 11/39] Fixed require path for new structure Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/router/src/websocket-server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index d9794b8..db057d8 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -2,7 +2,7 @@ const WebSocket = require("ws"); const { authenticateAndConnectToRealm, onMediaElementChange, -} = require("../../realmdb/src/realm-handler"); +} = require("../../handlers/realmdb/src/realm-handler"); const server = new WebSocket.Server({ port: 8080 }); From f98ef6f4d5530b7162c9ef8377a854952d580644 Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Tue, 18 Jun 2024 09:17:43 +0200 Subject: [PATCH 12/39] Added missing dot in readme Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index fa1677a..6b146bc 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -9,7 +9,7 @@ Setting up an information layer in the CDSP involves running a [Database-Router] ## Installation of Database-Handler -Please follow installation instructions of the chosen [handler](./handlers/) +Please follow installation instructions of the chosen [handler](./handlers/). ## [Installation of Database-Router](./router/README.md#Install) From 0da163a4d0f20f8b9d1226a8b61adf386637f3eb Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Tue, 18 Jun 2024 15:59:28 +0200 Subject: [PATCH 13/39] Fixed wrong readme link Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/handlers/realmdb/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdsp/information-layer/handlers/realmdb/README.md b/cdsp/information-layer/handlers/realmdb/README.md index 733c2bc..07e1a4a 100644 --- a/cdsp/information-layer/handlers/realmdb/README.md +++ b/cdsp/information-layer/handlers/realmdb/README.md @@ -38,4 +38,4 @@ More infos how to run an example together with ATLAS cloud you can find [here](. ## Starting the RealmDB handler -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../readme.md#22-installation-of-database-router). +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Install). From 0c83de4b601f0d3827da32f4e7c2856d1b29a69f Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Mon, 8 Jul 2024 10:10:02 +0200 Subject: [PATCH 14/39] add basic router parts Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/handlers/handler.js | 35 +++++ .../handlers/iotdb/src/iotdb-handler.js | 1 + .../handlers/realmdb/package.json | 4 +- .../handlers/realmdb/src/realm-handler.js | 99 ------------- .../handlers/realmdb/src/realmdb_handler.js | 132 ++++++++++++++++++ cdsp/information-layer/router/.gitignore | 1 + .../information-layer/router/config/config.js | 14 ++ .../router/src/websocket-server.js | 46 ++++-- .../router/utils/message_validator.js | 14 ++ 9 files changed, 235 insertions(+), 111 deletions(-) create mode 100644 cdsp/information-layer/handlers/handler.js create mode 100644 cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js delete mode 100644 cdsp/information-layer/handlers/realmdb/src/realm-handler.js create mode 100644 cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js create mode 100644 cdsp/information-layer/router/config/config.js create mode 100644 cdsp/information-layer/router/utils/message_validator.js diff --git a/cdsp/information-layer/handlers/handler.js b/cdsp/information-layer/handlers/handler.js new file mode 100644 index 0000000..f66eaed --- /dev/null +++ b/cdsp/information-layer/handlers/handler.js @@ -0,0 +1,35 @@ +class Handler { + authenticateAndConnect(sendMessageToClients) { + throw new Error("Method 'authenticateAndConnect' must be implemented."); + } + + handleMessage(message, ws) { + switch (message.type) { + case 'read': + this.read(message, ws); + break; + case 'write': + this.write(message, ws); + break; + case 'subscribe': + this.subscribe(message, ws); + break; + default: + ws.send(JSON.stringify({ error: 'Unknown message type'})) + } + } + + read(message, ws) { + throw new Error('Read method not implemented, yet!') + } + + write(message, ws) { + throw new Error('Write method not implemented, yet!') + } + + subscribe(message, ws) { + throw new Error('Subscribe method not implemented, yet!') + } +} + +module.exports = Handler; \ No newline at end of file diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js new file mode 100644 index 0000000..dad4fef --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -0,0 +1 @@ +// TODO: STUB implementation of subscribe, write and read interface methods.g \ No newline at end of file diff --git a/cdsp/information-layer/handlers/realmdb/package.json b/cdsp/information-layer/handlers/realmdb/package.json index fb5c9ee..aac0f2c 100644 --- a/cdsp/information-layer/handlers/realmdb/package.json +++ b/cdsp/information-layer/handlers/realmdb/package.json @@ -1,8 +1,8 @@ { - "name": "realm-handler", + "name": "realmdb_handler", "version": "1.0.0", "description": "Realm database handler", - "main": "realm-handler.js", + "main": "realmdb_handler.js", "dependencies": { "realm": "^12.9.0", "uuid": "^9.0.1" diff --git a/cdsp/information-layer/handlers/realmdb/src/realm-handler.js b/cdsp/information-layer/handlers/realmdb/src/realm-handler.js deleted file mode 100644 index b4c41d5..0000000 --- a/cdsp/information-layer/handlers/realmdb/src/realm-handler.js +++ /dev/null @@ -1,99 +0,0 @@ -const Realm = require("realm"); -const config = require("../config/config"); -const vehicleConfig = require("../config/vehicle-config"); // Import vehicle config file -const { v4: uuidv4 } = require("uuid"); // Importing UUID generator - -const MediaElementSchema = { - primaryKey: "_id", - name: "Vehicles", - properties: { - _id: "int", - Vehicle_Cabin_HVAC_AmbientAirTemperature: "double", - }, -}; - -const app = new Realm.App({ id: config.realmAppId }); -const credentials = Realm.Credentials.apiKey(config.realmApiKey); - -const realmConfig = { - schema: [MediaElementSchema], - path: "myrealm12.realm", - sync: { - user: null, // will be assigned after authentication - flexible: true, - error: (error) => { - console.error("Realm sync error:", error); - }, - }, -}; - -const authenticateAndConnectToRealm = async ( - sendMessageToClients, - onMediaElementChange, -) => { - try { - const user = await app.logIn(credentials); - console.log("Successfully authenticated with Realm"); - - realmConfig.sync.user = user; - const realm = await Realm.open(realmConfig); - console.log("Realm connection established successfully"); - - const MediaElements = realm.objects("Vehicles").subscribe(); - console.log(MediaElements); - - const objectId = vehicleConfig.Vin; // Retrieve objectId from config file - const mediaElement = realm.objectForPrimaryKey("Vehicles", objectId); - console.log(mediaElement); - - // Set WebSocket server ID as the same objectId - const websocketId = String(objectId); - - mediaElement.addListener((mediaElement, changes) => - onMediaElementChange( - mediaElement, - changes, - sendMessageToClients, - websocketId, - ), - ); - } catch (error) { - console.error("Failed to authenticate with Realm:", error); - } -}; - -const onMediaElementChange = ( - mediaElement, - changes, - sendMessageToClients, - websocketId, -) => { - if (changes.deleted) { - console.log(`MediaElement is deleted: ${changes.deleted}`); - } else { - changes.changedProperties.forEach((prop) => { - console.log(`* the value of "${prop}" changed to ${mediaElement[prop]}`); - - // Generate a meaningful UUID for WebSocket response - const uuid = uuidv4(); - - const message = { - type: "update", - tree: "VSS", - id: websocketId, // Use the WebSocket server ID - uuid: uuid, // Use generated UUID - dateTime: new Date().toISOString(), - node: { - name: prop, // Sending the property name as node name - value: mediaElement[prop], // Sending the property value as node value - }, - }; - sendMessageToClients(message); - }); - } -}; - -module.exports = { - authenticateAndConnectToRealm, - onMediaElementChange, -}; diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js new file mode 100644 index 0000000..2c1a82f --- /dev/null +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js @@ -0,0 +1,132 @@ +const Realm = require("realm"); +const Handler = require('../../handler') +const config = require("../config/config"); +//const vehicleConfig = require("../config/vehicle-config"); // Import vehicle config file +const { v4: uuidv4 } = require("uuid"); // Importing UUID generator + +const MediaElementSchema = { + primaryKey: "_id", + name: "Vehicles", + properties: { + _id: "int", + Vehicle_Cabin_HVAC_AmbientAirTemperature: "double", + }, +}; + +const app = new Realm.App({ id: config.realmAppId }); +const credentials = Realm.Credentials.apiKey(config.realmApiKey); + +const realmConfig = { + schema: [MediaElementSchema], + path: "myrealm12.realm", + sync: { + user: null, // will be assigned after authentication + flexible: true, + error: (error) => { + console.error("Realm sync error:", error); + }, + }, +}; + +class RealmDBHandler extends Handler { + constructor() { + super(); + this.realm = null; + this.sendMessageToClients = null; + } + + async authenticateAndConnect(sendMessageToClients) { + try { + this.sendMessageToClients = sendMessageToClients; + const user = await app.logIn(credentials); + console.log("Successfully authenticated with Realm"); + + realmConfig.sync.user = user; + this.realm = await Realm.open(realmConfig); + console.log("Realm connection established successfully"); + + const MediaElements = this.realm.objects("Vehicles").subscribe(); + console.log(MediaElements); // TODO: Is it necessary to log this? + } catch (error) { + console.error("Failed to authenticate with Realm:", error); + } + } + + async read(message, ws) { + try{ + const objectId = message.data.Vin; // Retrieve objectId from config file + const mediaElement = this.realm.objectForPrimaryKey("Vehicles", objectId); + console.log(mediaElement); + if (mediaElement) { + const response = { + type: "read_response", + data: mediaElement, + }; + ws.send(JSON.stringify(response)); + } else { + ws.send(JSON.stringify({ error: 'Object not found' })); + } + } catch (error) { + console.error("Error reading object from Realm:", error); + ws.send(JSON.stringify({ error: 'Error reading object' })); + } + } + + async write(message, ws) { + // Implement write logic for RealmDB + } + + async subscribe(message, ws) { + const sendMessageToClient = (message) => { + ws.send(JSON.stringify(message)); + }; + + try { + const objectId = message.data.Vin; + console.log(`Subscribing element: ${objectId}`) + const mediaElement = await this.realm.objectForPrimaryKey("Vehicles", objectId); + console.log(mediaElement); + + if (mediaElement) { + const websocketId = String(objectId); + mediaElement.addListener((mediaElement, changes) => + this.onMediaElementChange(mediaElement, changes, websocketId) + ); + sendMessageToClient({ success: `Subscribed to changes for object ID ${objectId}` }) + } else { + sendMessageToClient({ error: "Vehicles collection not found for subscription"}); + } + } catch (error) { + console.error("Error subscribing to object changes in Realm:", error); + sendMessageToClient({ error: 'Error subscribing to object changes' }); + } + } + + onMediaElementChange(mediaElement, changes, websocketId) { + if (changes.deleted) { + console.log(`MediaElement is deleted: ${changes.deleted}`); + } else { + changes.changedProperties.forEach((prop) => { + console.log(`* the value of "${prop}" changed to ${mediaElement[prop]}`); + + // Generate a meaningful UUID for WebSocket response + const uuid = uuidv4(); + + const message = { + type: "update", + tree: "VSS", + id: websocketId, // Use the WebSocket server ID + uuid: uuid, // Use generated UUID + dateTime: new Date().toISOString(), + node: { + name: prop, // Sending the property name as node name + value: mediaElement[prop], // Sending the property value as node value + }, + }; + this.sendMessageToClients(message); + }); + } + } +} + +module.exports = RealmDBHandler; \ No newline at end of file diff --git a/cdsp/information-layer/router/.gitignore b/cdsp/information-layer/router/.gitignore index eec8018..5154f7a 100644 --- a/cdsp/information-layer/router/.gitignore +++ b/cdsp/information-layer/router/.gitignore @@ -4,6 +4,7 @@ mongodb-realm/ # Node.js node_modules/ package-lock.json +.env # MAC **/.DS_Store \ No newline at end of file diff --git a/cdsp/information-layer/router/config/config.js b/cdsp/information-layer/router/config/config.js new file mode 100644 index 0000000..2aaa80f --- /dev/null +++ b/cdsp/information-layer/router/config/config.js @@ -0,0 +1,14 @@ +const dotenv = require('dotenv'); +dotenv.config(); + +const getHandlerType = () => { + const handlerType = process.env.HANDLER_TYPE; + if (!handlerType) { + throw new Error('Handler type must be specified as an ENV variable.'); + } + return handlerType.toLowerCase(); +}; + +module.exports = { + getHandlerType, +}; diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index db057d8..6853c78 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -1,20 +1,44 @@ -const WebSocket = require("ws"); -const { - authenticateAndConnectToRealm, - onMediaElementChange, -} = require("../../handlers/realmdb/src/realm-handler"); +const WebSocket = require('ws'); +const RealmDBHandler = require('../../handlers/realmdb/src/realmdb_handler'); +const { getHandlerType } = require('../config/config'); +const { validateMessage } = require('../utils/message_validator'); + +const handlerType = getHandlerType(); +let handler; + +switch (handlerType) { + case 'realmdb': + handler = new RealmDBHandler(); + break; + case 'iotdb': + // TODO: new IoTDBHandler() + console.error('IoTDB Handler is not implemented, yet!') + break; + default: + throw new Error('Unsupported handler type'); +} const server = new WebSocket.Server({ port: 8080 }); // Define clients array globally let clients = []; -server.on("connection", (ws) => { +server.on('connection', (ws) => { console.log("Client connected"); clients.push(ws); // Add client to the array - ws.on("close", () => { - console.log("Client disconnected"); + ws.on('message', (message) => { + console.log(`Message received: ${message}`); + const validatedMessage = validateMessage(message); + if (validatedMessage) { + handler.handleMessage(validatedMessage, ws); + } else { + ws.send(JSON.stringify({ error: 'Invalid message format' })); + } + }); + + ws.on('close', () => { + console.log('Client disconnected'); // Remove disconnected client from the array clients = clients.filter((client) => client !== ws); }); @@ -26,5 +50,7 @@ const sendMessageToClients = (message) => { }); }; -console.log("Starting authentication and connection to Realm..."); -authenticateAndConnectToRealm(sendMessageToClients, onMediaElementChange); +console.log(`Starting authentication and connection to ${handlerType} ...`); +handler.authenticateAndConnect(sendMessageToClients); + +console.log(`WebSocket server started on ws://localhost:8080 using ${handlerType} handler`); diff --git a/cdsp/information-layer/router/utils/message_validator.js b/cdsp/information-layer/router/utils/message_validator.js new file mode 100644 index 0000000..93d655c --- /dev/null +++ b/cdsp/information-layer/router/utils/message_validator.js @@ -0,0 +1,14 @@ +const validateMessage = (message) => { + try { + const parsedMessage = JSON.parse(message); + // TODO: Implement validation logic here + return parsedMessage; + } catch (error) { + return null; + } + }; + + module.exports = { + validateMessage, + }; + \ No newline at end of file From 3e36432513b5f9b72b1fdd4714187ba83b10a31c Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Tue, 9 Jul 2024 15:51:16 +0200 Subject: [PATCH 15/39] Add environment variable functionallity and update README files. Use dotenv package to laod environment variables from a .env file into the process.env Rename files and update code Remove unused file Signed-off-by: Christian Muehlbauer --- .../handlers/iotdb/src/iotdb-handler.js | 2 +- .../handlers/realmdb/README.md | 43 +++++++++++--- .../handlers/realmdb/config/vehicle-config.js | 4 -- .../handlers/realmdb/package.json | 4 +- ...{realmdb_handler.js => realmdb-handler.js} | 57 +++++++++---------- cdsp/information-layer/router/.gitignore | 1 - cdsp/information-layer/router/README.md | 12 +++- cdsp/information-layer/router/package.json | 1 + cdsp/information-layer/router/src/.env | 1 + .../router/src/websocket-server.js | 6 +- ...sage_validator.js => message-validator.js} | 0 11 files changed, 81 insertions(+), 50 deletions(-) delete mode 100644 cdsp/information-layer/handlers/realmdb/config/vehicle-config.js rename cdsp/information-layer/handlers/realmdb/src/{realmdb_handler.js => realmdb-handler.js} (66%) create mode 100644 cdsp/information-layer/router/src/.env rename cdsp/information-layer/router/utils/{message_validator.js => message-validator.js} (100%) diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index dad4fef..09cbb2e 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -1 +1 @@ -// TODO: STUB implementation of subscribe, write and read interface methods.g \ No newline at end of file +// tdb \ No newline at end of file diff --git a/cdsp/information-layer/handlers/realmdb/README.md b/cdsp/information-layer/handlers/realmdb/README.md index 07e1a4a..0166ebf 100644 --- a/cdsp/information-layer/handlers/realmdb/README.md +++ b/cdsp/information-layer/handlers/realmdb/README.md @@ -1,4 +1,10 @@ This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embedds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. +# Features + +- **Authentication**: Authenticates with MongoDB Realm using an API key. +- **Read Data**: Retrieves data from the Realm database using a primary key. +- **Subscribe to Changes**: Listens to changes in specific data objects and sends updates to WebSocket clients. +- **Error Handling**: Logs and handles errors during database operations and synchronization. # Installation @@ -29,13 +35,36 @@ module.exports = { > **_IMPORTANT:_** Do not commit this file to github! -## Configure an example vehicle +## Starting the RealmDB handler -Change the VIN (Vehicle Identification Number) of the example vehicle in [vehicle-config](./config/vehicle-config.js). -The default VIN is `1234567`. -If you do not want to change it ensure, that in your ATLAS cloud instance there is a vehicle _document_ with an `_id: 1234567` in a collection named `Vehicles`. -More infos how to run an example together with ATLAS cloud you can find [here](../readme.md#case-1-you-choosed-realm-as-database). +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). -## Starting the RealmDB handler +## Usage + +The examples use the VIN (Vehicle Identification Number) `1234567` as object identifier. + +### Reading Data + +To read data from the Realm database, send a message with the type of request and object ID: -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Install). +```json +{ + "type": "read", + "data": { + "Vin": 1234567 + } +} +``` + +### Subscribing to Changes + +To subscribe to changes in a specific object, send a message with the type of request and object ID: + +```json +{ + "type": "subscribe", + "data": { + "Vin": 1234567 + } +} +``` diff --git a/cdsp/information-layer/handlers/realmdb/config/vehicle-config.js b/cdsp/information-layer/handlers/realmdb/config/vehicle-config.js deleted file mode 100644 index c469fca..0000000 --- a/cdsp/information-layer/handlers/realmdb/config/vehicle-config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - Vin: 1234567, -}; - diff --git a/cdsp/information-layer/handlers/realmdb/package.json b/cdsp/information-layer/handlers/realmdb/package.json index aac0f2c..45c1a6e 100644 --- a/cdsp/information-layer/handlers/realmdb/package.json +++ b/cdsp/information-layer/handlers/realmdb/package.json @@ -1,8 +1,8 @@ { - "name": "realmdb_handler", + "name": "realmdb-handler", "version": "1.0.0", "description": "Realm database handler", - "main": "realmdb_handler.js", + "main": "realmdb-handler.js", "dependencies": { "realm": "^12.9.0", "uuid": "^9.0.1" diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js similarity index 66% rename from cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js rename to cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index 2c1a82f..7ef679d 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb_handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -1,7 +1,6 @@ const Realm = require("realm"); const Handler = require('../../handler') const config = require("../config/config"); -//const vehicleConfig = require("../config/vehicle-config"); // Import vehicle config file const { v4: uuidv4 } = require("uuid"); // Importing UUID generator const MediaElementSchema = { @@ -28,6 +27,10 @@ const realmConfig = { }, }; +const sendMessageToClient = (ws, message) => { + ws.send(JSON.stringify(message)); +}; + class RealmDBHandler extends Handler { constructor() { super(); @@ -45,8 +48,12 @@ class RealmDBHandler extends Handler { this.realm = await Realm.open(realmConfig); console.log("Realm connection established successfully"); - const MediaElements = this.realm.objects("Vehicles").subscribe(); - console.log(MediaElements); // TODO: Is it necessary to log this? + const MediaElements = this.realm.objects("Vehicles").subscribe(); // TODO: Is it necessary to log this, extra function? + if (MediaElements) { + console.log(MediaElements); + } else { + this.sendMessageToClients({ error: "Vehicles collection not found for subscription"}); + } } catch (error) { console.error("Failed to authenticate with Realm:", error); } @@ -55,59 +62,49 @@ class RealmDBHandler extends Handler { async read(message, ws) { try{ const objectId = message.data.Vin; // Retrieve objectId from config file - const mediaElement = this.realm.objectForPrimaryKey("Vehicles", objectId); - console.log(mediaElement); - if (mediaElement) { + const MediaElement = this.realm.objectForPrimaryKey("Vehicles", objectId); + if (MediaElement) { const response = { type: "read_response", - data: mediaElement, + data: MediaElement, }; - ws.send(JSON.stringify(response)); + sendMessageToClient(ws, JSON.stringify(response)); } else { - ws.send(JSON.stringify({ error: 'Object not found' })); + sendMessageToClient(ws, JSON.stringify({ error: 'Object not found' })); } } catch (error) { console.error("Error reading object from Realm:", error); - ws.send(JSON.stringify({ error: 'Error reading object' })); + sendMessageToClient(ws, JSON.stringify({ error: 'Error reading object' })); } } - async write(message, ws) { - // Implement write logic for RealmDB - } - - async subscribe(message, ws) { - const sendMessageToClient = (message) => { - ws.send(JSON.stringify(message)); - }; - + async subscribe(message, ws) { try { const objectId = message.data.Vin; console.log(`Subscribing element: ${objectId}`) - const mediaElement = await this.realm.objectForPrimaryKey("Vehicles", objectId); - console.log(mediaElement); + const MediaElement = await this.realm.objectForPrimaryKey("Vehicles", objectId); - if (mediaElement) { + if (MediaElement) { const websocketId = String(objectId); - mediaElement.addListener((mediaElement, changes) => - this.onMediaElementChange(mediaElement, changes, websocketId) + MediaElement.addListener((MediaElement, changes) => + this.onMediaElementChange(MediaElement, changes, websocketId) ); - sendMessageToClient({ success: `Subscribed to changes for object ID ${objectId}` }) + sendMessageToClient(ws, { success: `Subscribed to changes for object ID ${objectId}` }) } else { - sendMessageToClient({ error: "Vehicles collection not found for subscription"}); + sendMessageToClient(ws, JSON.stringify({ error: 'Object not found' })); } } catch (error) { console.error("Error subscribing to object changes in Realm:", error); - sendMessageToClient({ error: 'Error subscribing to object changes' }); + sendMessageToClient(ws, { error: 'Error subscribing to object changes' }); } } - onMediaElementChange(mediaElement, changes, websocketId) { + onMediaElementChange(MediaElement, changes, websocketId) { if (changes.deleted) { console.log(`MediaElement is deleted: ${changes.deleted}`); } else { changes.changedProperties.forEach((prop) => { - console.log(`* the value of "${prop}" changed to ${mediaElement[prop]}`); + console.log(`* the value of "${prop}" changed to ${MediaElement[prop]}`); // Generate a meaningful UUID for WebSocket response const uuid = uuidv4(); @@ -120,7 +117,7 @@ class RealmDBHandler extends Handler { dateTime: new Date().toISOString(), node: { name: prop, // Sending the property name as node name - value: mediaElement[prop], // Sending the property value as node value + value: MediaElement[prop], // Sending the property value as node value }, }; this.sendMessageToClients(message); diff --git a/cdsp/information-layer/router/.gitignore b/cdsp/information-layer/router/.gitignore index 5154f7a..eec8018 100644 --- a/cdsp/information-layer/router/.gitignore +++ b/cdsp/information-layer/router/.gitignore @@ -4,7 +4,6 @@ mongodb-realm/ # Node.js node_modules/ package-lock.json -.env # MAC **/.DS_Store \ No newline at end of file diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md index d9b9032..deb0030 100644 --- a/cdsp/information-layer/router/README.md +++ b/cdsp/information-layer/router/README.md @@ -1,7 +1,7 @@ -With this component one can configure which database it shall connect to. +With this component, you can configure which database it connects to. > [!WARNING] -> As the configuration capability is not yet implemented, RealmDB is hard coded as a database! +> While configuring Docker for environment variable definition, the `dotenv` package is used to load environment variables from an `.env` file into `process.env`. # Install @@ -9,10 +9,18 @@ Execute in this directory: ```bash npm install +npm install dotenv ``` # Run +In the `.env` file are defined the environment variables: + +- **HANDLER_TYPE**: Configure `realmdb` to start the RealmDB Handler or `iotdb` to start the IoTDB Handler. + +> [!WARNING] +> Create a `.env` file in the same directory as your `docker-compose.yml`. If it doesn't exist, create it in the same directory as `websocket-server.js`. + Start router by executing in [src](./src/) directory the command: ```bash diff --git a/cdsp/information-layer/router/package.json b/cdsp/information-layer/router/package.json index 7fbc984..51da3e1 100644 --- a/cdsp/information-layer/router/package.json +++ b/cdsp/information-layer/router/package.json @@ -7,6 +7,7 @@ "start": "node websocket-server.js" }, "dependencies": { + "dotenv": "^16.4.5", "ws": "^7.4.6" } } diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env new file mode 100644 index 0000000..16ac659 --- /dev/null +++ b/cdsp/information-layer/router/src/.env @@ -0,0 +1 @@ +HANDLER_TYPE=realmdb \ No newline at end of file diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index 6853c78..06727c5 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -1,17 +1,17 @@ const WebSocket = require('ws'); -const RealmDBHandler = require('../../handlers/realmdb/src/realmdb_handler'); +const RealmDBHandler = require('../../handlers/realmdb/src/realmdb-handler'); const { getHandlerType } = require('../config/config'); -const { validateMessage } = require('../utils/message_validator'); +const { validateMessage } = require('../utils/message-validator'); const handlerType = getHandlerType(); let handler; +console.log(`this is the handler type: ${handlerType}`) switch (handlerType) { case 'realmdb': handler = new RealmDBHandler(); break; case 'iotdb': - // TODO: new IoTDBHandler() console.error('IoTDB Handler is not implemented, yet!') break; default: diff --git a/cdsp/information-layer/router/utils/message_validator.js b/cdsp/information-layer/router/utils/message-validator.js similarity index 100% rename from cdsp/information-layer/router/utils/message_validator.js rename to cdsp/information-layer/router/utils/message-validator.js From 72ab98b09a7ac7f8794476ae63a48275b70223ed Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 24 Jul 2024 12:23:30 +0200 Subject: [PATCH 16/39] Update link URL and create a IoTDB connection using the IoTDB Handler Signed-off-by: Christian Muehlbauer --- .../handlers/iotdb/.gitignore | 9 + .../handlers/iotdb/README.md | 39 +- .../iotdb/gen-nodejs/IClientRPCService.js | 13044 ++++++++++++++++ .../handlers/iotdb/gen-nodejs/client_types.js | 7961 ++++++++++ .../handlers/iotdb/gen-nodejs/common_types.js | 2627 ++++ .../handlers/iotdb/package.json | 10 + .../handlers/iotdb/src/iotdb-handler.js | 71 +- cdsp/information-layer/router/src/.env | 2 +- .../router/src/websocket-server.js | 33 +- 9 files changed, 23778 insertions(+), 18 deletions(-) create mode 100644 cdsp/information-layer/handlers/iotdb/.gitignore create mode 100644 cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js create mode 100644 cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js create mode 100644 cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js create mode 100644 cdsp/information-layer/handlers/iotdb/package.json diff --git a/cdsp/information-layer/handlers/iotdb/.gitignore b/cdsp/information-layer/handlers/iotdb/.gitignore new file mode 100644 index 0000000..9b7b860 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/.gitignore @@ -0,0 +1,9 @@ +# Node.js +node_modules/ +package-lock.json + +# Credentials Config File +config.js + +# MAC +**/.DS_Store diff --git a/cdsp/information-layer/handlers/iotdb/README.md b/cdsp/information-layer/handlers/iotdb/README.md index fd9e641..68380ed 100644 --- a/cdsp/information-layer/handlers/iotdb/README.md +++ b/cdsp/information-layer/handlers/iotdb/README.md @@ -1 +1,38 @@ -tbd \ No newline at end of file +This directory contains the IoTDB Handler as a Node.js application. As [Apache IoTDB](https://iotdb.apache.org/) is a time-series database, the IoTDB Handler connects to an existing IoTDB instance using the Thrift protocol. The handler utilizes the [IoTDB Thrift API](https://github.com/apache/thrift) to communicate with the database and perform operations. Configuration details, such as the IoTDB host, port, user credentials, and time zone, are specified in the handler's configuration file. The IoTDB Handler is designed to manage sessions, execute queries, and interact with the IoTDB instance efficiently during runtime. + +# Features + +- **Authentication**: Authenticates with IoTDB using the IoTDB host, port, user credentials, and time zone. +- **Error Handling**: Logs and handles errors during database operations and synchronization. + +# Installation + +Execute within `iotdb` directory + +```bash +npm install +``` + +# Configure IoTDB + +Before the Database-Router can start the IoTDB Handler without any errors you need to start and run Docker containers defined in a [Docker Compose file](/docker/). + +## Configure of a IoTDB Handler + +Create `config/config.js` with the following format, replacing the app id and the api key with yours. + +```js +module.exports = { + iotdbHost: "your-iotdb-host", // Default "localhost" + iotdbPort: 6667, // Set this to the appropriate IotDB Port + iotdbUser: "your-iotdb-user", // Default "root" + iotdbPassword: "your-iotdb-password", // Default "root" + timeZone: "UTC+2", // Set this to the appropriate time zone +}; +``` + +> **_IMPORTANT:_** Do not commit this file to github! + +## Starting the IoTDB handler + +You do not need to start IotDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js b/cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js new file mode 100644 index 0000000..b7deb43 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js @@ -0,0 +1,13044 @@ +// +// Autogenerated by Thrift Compiler (0.14.1) +// +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +// +"use strict"; + +var thrift = require('thrift'); +var Thrift = thrift.Thrift; +var Q = thrift.Q; +var Int64 = require('node-int64'); + +var common_ttypes = require('./common_types'); + + +var ttypes = require('./client_types'); +//HELPER FUNCTIONS AND STRUCTURES + +var IClientRPCService_executeQueryStatementV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeQueryStatementV2_args.prototype = {}; +IClientRPCService_executeQueryStatementV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeQueryStatementV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatementV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeQueryStatementV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeQueryStatementV2_result.prototype = {}; +IClientRPCService_executeQueryStatementV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeQueryStatementV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatementV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeUpdateStatementV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeUpdateStatementV2_args.prototype = {}; +IClientRPCService_executeUpdateStatementV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeUpdateStatementV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeUpdateStatementV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeUpdateStatementV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeUpdateStatementV2_result.prototype = {}; +IClientRPCService_executeUpdateStatementV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeUpdateStatementV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeUpdateStatementV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeStatementV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeStatementV2_args.prototype = {}; +IClientRPCService_executeStatementV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeStatementV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeStatementV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeStatementV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeStatementV2_result.prototype = {}; +IClientRPCService_executeStatementV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeStatementV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeStatementV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeRawDataQueryV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSRawDataQueryReq(args.req); + } + } +}; +IClientRPCService_executeRawDataQueryV2_args.prototype = {}; +IClientRPCService_executeRawDataQueryV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSRawDataQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeRawDataQueryV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeRawDataQueryV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeRawDataQueryV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeRawDataQueryV2_result.prototype = {}; +IClientRPCService_executeRawDataQueryV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeRawDataQueryV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeRawDataQueryV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeLastDataQueryV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSLastDataQueryReq(args.req); + } + } +}; +IClientRPCService_executeLastDataQueryV2_args.prototype = {}; +IClientRPCService_executeLastDataQueryV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSLastDataQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeLastDataQueryV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeLastDataQueryV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeLastDataQueryV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeLastDataQueryV2_result.prototype = {}; +IClientRPCService_executeLastDataQueryV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeLastDataQueryV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeLastDataQueryV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSFastLastDataQueryForOneDeviceReq(args.req); + } + } +}; +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype = {}; +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSFastLastDataQueryForOneDeviceReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype = {}; +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeAggregationQueryV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSAggregationQueryReq(args.req); + } + } +}; +IClientRPCService_executeAggregationQueryV2_args.prototype = {}; +IClientRPCService_executeAggregationQueryV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSAggregationQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeAggregationQueryV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeAggregationQueryV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeAggregationQueryV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeAggregationQueryV2_result.prototype = {}; +IClientRPCService_executeAggregationQueryV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeAggregationQueryV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeAggregationQueryV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeGroupByQueryIntervalQuery_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSGroupByQueryIntervalReq(args.req); + } + } +}; +IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype = {}; +IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSGroupByQueryIntervalReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeGroupByQueryIntervalQuery_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeGroupByQueryIntervalQuery_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype = {}; +IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeGroupByQueryIntervalQuery_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchResultsV2_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSFetchResultsReq(args.req); + } + } +}; +IClientRPCService_fetchResultsV2_args.prototype = {}; +IClientRPCService_fetchResultsV2_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSFetchResultsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchResultsV2_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchResultsV2_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchResultsV2_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSFetchResultsResp(args.success); + } + } +}; +IClientRPCService_fetchResultsV2_result.prototype = {}; +IClientRPCService_fetchResultsV2_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSFetchResultsResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchResultsV2_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchResultsV2_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_openSession_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSOpenSessionReq(args.req); + } + } +}; +IClientRPCService_openSession_args.prototype = {}; +IClientRPCService_openSession_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSOpenSessionReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_openSession_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_openSession_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_openSession_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSOpenSessionResp(args.success); + } + } +}; +IClientRPCService_openSession_result.prototype = {}; +IClientRPCService_openSession_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSOpenSessionResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_openSession_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_openSession_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_closeSession_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCloseSessionReq(args.req); + } + } +}; +IClientRPCService_closeSession_args.prototype = {}; +IClientRPCService_closeSession_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCloseSessionReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_closeSession_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_closeSession_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_closeSession_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_closeSession_result.prototype = {}; +IClientRPCService_closeSession_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_closeSession_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_closeSession_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeStatement_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeStatement_args.prototype = {}; +IClientRPCService_executeStatement_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeStatement_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeStatement_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeStatement_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeStatement_result.prototype = {}; +IClientRPCService_executeStatement_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeStatement_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeStatement_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeBatchStatement_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteBatchStatementReq(args.req); + } + } +}; +IClientRPCService_executeBatchStatement_args.prototype = {}; +IClientRPCService_executeBatchStatement_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteBatchStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeBatchStatement_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeBatchStatement_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeBatchStatement_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_executeBatchStatement_result.prototype = {}; +IClientRPCService_executeBatchStatement_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeBatchStatement_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeBatchStatement_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeQueryStatement_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeQueryStatement_args.prototype = {}; +IClientRPCService_executeQueryStatement_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeQueryStatement_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatement_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeQueryStatement_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeQueryStatement_result.prototype = {}; +IClientRPCService_executeQueryStatement_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeQueryStatement_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatement_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeUpdateStatement_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSExecuteStatementReq(args.req); + } + } +}; +IClientRPCService_executeUpdateStatement_args.prototype = {}; +IClientRPCService_executeUpdateStatement_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSExecuteStatementReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeUpdateStatement_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeUpdateStatement_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeUpdateStatement_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeUpdateStatement_result.prototype = {}; +IClientRPCService_executeUpdateStatement_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeUpdateStatement_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeUpdateStatement_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchResults_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSFetchResultsReq(args.req); + } + } +}; +IClientRPCService_fetchResults_args.prototype = {}; +IClientRPCService_fetchResults_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSFetchResultsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchResults_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchResults_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchResults_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSFetchResultsResp(args.success); + } + } +}; +IClientRPCService_fetchResults_result.prototype = {}; +IClientRPCService_fetchResults_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSFetchResultsResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchResults_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchResults_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchMetadata_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSFetchMetadataReq(args.req); + } + } +}; +IClientRPCService_fetchMetadata_args.prototype = {}; +IClientRPCService_fetchMetadata_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSFetchMetadataReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchMetadata_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchMetadata_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchMetadata_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSFetchMetadataResp(args.success); + } + } +}; +IClientRPCService_fetchMetadata_result.prototype = {}; +IClientRPCService_fetchMetadata_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSFetchMetadataResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchMetadata_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchMetadata_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_cancelOperation_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCancelOperationReq(args.req); + } + } +}; +IClientRPCService_cancelOperation_args.prototype = {}; +IClientRPCService_cancelOperation_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCancelOperationReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_cancelOperation_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_cancelOperation_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_cancelOperation_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_cancelOperation_result.prototype = {}; +IClientRPCService_cancelOperation_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_cancelOperation_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_cancelOperation_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_closeOperation_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCloseOperationReq(args.req); + } + } +}; +IClientRPCService_closeOperation_args.prototype = {}; +IClientRPCService_closeOperation_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCloseOperationReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_closeOperation_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_closeOperation_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_closeOperation_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_closeOperation_result.prototype = {}; +IClientRPCService_closeOperation_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_closeOperation_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_closeOperation_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getTimeZone_args = function(args) { + this.sessionId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + } +}; +IClientRPCService_getTimeZone_args.prototype = {}; +IClientRPCService_getTimeZone_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getTimeZone_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getTimeZone_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getTimeZone_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSGetTimeZoneResp(args.success); + } + } +}; +IClientRPCService_getTimeZone_result.prototype = {}; +IClientRPCService_getTimeZone_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSGetTimeZoneResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getTimeZone_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getTimeZone_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setTimeZone_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSSetTimeZoneReq(args.req); + } + } +}; +IClientRPCService_setTimeZone_args.prototype = {}; +IClientRPCService_setTimeZone_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSSetTimeZoneReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setTimeZone_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setTimeZone_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setTimeZone_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_setTimeZone_result.prototype = {}; +IClientRPCService_setTimeZone_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setTimeZone_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setTimeZone_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getProperties_args = function(args) { +}; +IClientRPCService_getProperties_args.prototype = {}; +IClientRPCService_getProperties_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + if (ftype == Thrift.Type.STOP) { + break; + } + input.skip(ftype); + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getProperties_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getProperties_args'); + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getProperties_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.ServerProperties(args.success); + } + } +}; +IClientRPCService_getProperties_result.prototype = {}; +IClientRPCService_getProperties_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.ServerProperties(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getProperties_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getProperties_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setStorageGroup_args = function(args) { + this.sessionId = null; + this.storageGroup = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + if (args.storageGroup !== undefined && args.storageGroup !== null) { + this.storageGroup = args.storageGroup; + } + } +}; +IClientRPCService_setStorageGroup_args.prototype = {}; +IClientRPCService_setStorageGroup_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.storageGroup = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setStorageGroup_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setStorageGroup_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.storageGroup !== null && this.storageGroup !== undefined) { + output.writeFieldBegin('storageGroup', Thrift.Type.STRING, 2); + output.writeString(this.storageGroup); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setStorageGroup_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_setStorageGroup_result.prototype = {}; +IClientRPCService_setStorageGroup_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setStorageGroup_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setStorageGroup_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createTimeseries_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCreateTimeseriesReq(args.req); + } + } +}; +IClientRPCService_createTimeseries_args.prototype = {}; +IClientRPCService_createTimeseries_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCreateTimeseriesReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createTimeseries_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createTimeseries_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createTimeseries_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_createTimeseries_result.prototype = {}; +IClientRPCService_createTimeseries_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createTimeseries_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createTimeseries_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createAlignedTimeseries_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCreateAlignedTimeseriesReq(args.req); + } + } +}; +IClientRPCService_createAlignedTimeseries_args.prototype = {}; +IClientRPCService_createAlignedTimeseries_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCreateAlignedTimeseriesReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createAlignedTimeseries_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createAlignedTimeseries_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createAlignedTimeseries_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_createAlignedTimeseries_result.prototype = {}; +IClientRPCService_createAlignedTimeseries_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createAlignedTimeseries_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createAlignedTimeseries_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createMultiTimeseries_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCreateMultiTimeseriesReq(args.req); + } + } +}; +IClientRPCService_createMultiTimeseries_args.prototype = {}; +IClientRPCService_createMultiTimeseries_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCreateMultiTimeseriesReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createMultiTimeseries_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createMultiTimeseries_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createMultiTimeseries_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_createMultiTimeseries_result.prototype = {}; +IClientRPCService_createMultiTimeseries_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createMultiTimeseries_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createMultiTimeseries_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteTimeseries_args = function(args) { + this.sessionId = null; + this.path = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + if (args.path !== undefined && args.path !== null) { + this.path = Thrift.copyList(args.path, [null]); + } + } +}; +IClientRPCService_deleteTimeseries_args.prototype = {}; +IClientRPCService_deleteTimeseries_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.path = []; + var _rtmp3463 = input.readListBegin(); + var _size462 = _rtmp3463.size || 0; + for (var _i464 = 0; _i464 < _size462; ++_i464) { + var elem465 = null; + elem465 = input.readString(); + this.path.push(elem465); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteTimeseries_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteTimeseries_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.path !== null && this.path !== undefined) { + output.writeFieldBegin('path', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.path.length); + for (var iter466 in this.path) { + if (this.path.hasOwnProperty(iter466)) { + iter466 = this.path[iter466]; + output.writeString(iter466); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteTimeseries_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_deleteTimeseries_result.prototype = {}; +IClientRPCService_deleteTimeseries_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteTimeseries_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteTimeseries_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteStorageGroups_args = function(args) { + this.sessionId = null; + this.storageGroup = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + if (args.storageGroup !== undefined && args.storageGroup !== null) { + this.storageGroup = Thrift.copyList(args.storageGroup, [null]); + } + } +}; +IClientRPCService_deleteStorageGroups_args.prototype = {}; +IClientRPCService_deleteStorageGroups_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.storageGroup = []; + var _rtmp3468 = input.readListBegin(); + var _size467 = _rtmp3468.size || 0; + for (var _i469 = 0; _i469 < _size467; ++_i469) { + var elem470 = null; + elem470 = input.readString(); + this.storageGroup.push(elem470); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteStorageGroups_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteStorageGroups_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.storageGroup !== null && this.storageGroup !== undefined) { + output.writeFieldBegin('storageGroup', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.storageGroup.length); + for (var iter471 in this.storageGroup) { + if (this.storageGroup.hasOwnProperty(iter471)) { + iter471 = this.storageGroup[iter471]; + output.writeString(iter471); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteStorageGroups_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_deleteStorageGroups_result.prototype = {}; +IClientRPCService_deleteStorageGroups_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteStorageGroups_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteStorageGroups_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecord_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordReq(args.req); + } + } +}; +IClientRPCService_insertRecord_args.prototype = {}; +IClientRPCService_insertRecord_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecord_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecord_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecord_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertRecord_result.prototype = {}; +IClientRPCService_insertRecord_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecord_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecord_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecord_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertStringRecordReq(args.req); + } + } +}; +IClientRPCService_insertStringRecord_args.prototype = {}; +IClientRPCService_insertStringRecord_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertStringRecordReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecord_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecord_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecord_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertStringRecord_result.prototype = {}; +IClientRPCService_insertStringRecord_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecord_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecord_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertTablet_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertTabletReq(args.req); + } + } +}; +IClientRPCService_insertTablet_args.prototype = {}; +IClientRPCService_insertTablet_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertTabletReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertTablet_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertTablet_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertTablet_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertTablet_result.prototype = {}; +IClientRPCService_insertTablet_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertTablet_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertTablet_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertTablets_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertTabletsReq(args.req); + } + } +}; +IClientRPCService_insertTablets_args.prototype = {}; +IClientRPCService_insertTablets_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertTabletsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertTablets_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertTablets_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertTablets_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertTablets_result.prototype = {}; +IClientRPCService_insertTablets_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertTablets_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertTablets_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecords_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordsReq(args.req); + } + } +}; +IClientRPCService_insertRecords_args.prototype = {}; +IClientRPCService_insertRecords_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecords_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecords_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecords_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertRecords_result.prototype = {}; +IClientRPCService_insertRecords_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecords_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecords_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecordsOfOneDevice_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(args.req); + } + } +}; +IClientRPCService_insertRecordsOfOneDevice_args.prototype = {}; +IClientRPCService_insertRecordsOfOneDevice_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecordsOfOneDevice_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecordsOfOneDevice_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertRecordsOfOneDevice_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertRecordsOfOneDevice_result.prototype = {}; +IClientRPCService_insertRecordsOfOneDevice_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertRecordsOfOneDevice_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertRecordsOfOneDevice_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecordsOfOneDevice_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertStringRecordsOfOneDeviceReq(args.req); + } + } +}; +IClientRPCService_insertStringRecordsOfOneDevice_args.prototype = {}; +IClientRPCService_insertStringRecordsOfOneDevice_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertStringRecordsOfOneDeviceReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecordsOfOneDevice_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecordsOfOneDevice_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecordsOfOneDevice_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertStringRecordsOfOneDevice_result.prototype = {}; +IClientRPCService_insertStringRecordsOfOneDevice_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecordsOfOneDevice_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecordsOfOneDevice_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecords_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertStringRecordsReq(args.req); + } + } +}; +IClientRPCService_insertStringRecords_args.prototype = {}; +IClientRPCService_insertStringRecords_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertStringRecordsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecords_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecords_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_insertStringRecords_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_insertStringRecords_result.prototype = {}; +IClientRPCService_insertStringRecords_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_insertStringRecords_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_insertStringRecords_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertTablet_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertTabletReq(args.req); + } + } +}; +IClientRPCService_testInsertTablet_args.prototype = {}; +IClientRPCService_testInsertTablet_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertTabletReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertTablet_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertTablet_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertTablet_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertTablet_result.prototype = {}; +IClientRPCService_testInsertTablet_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertTablet_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertTablet_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertTablets_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertTabletsReq(args.req); + } + } +}; +IClientRPCService_testInsertTablets_args.prototype = {}; +IClientRPCService_testInsertTablets_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertTabletsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertTablets_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertTablets_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertTablets_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertTablets_result.prototype = {}; +IClientRPCService_testInsertTablets_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertTablets_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertTablets_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecord_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordReq(args.req); + } + } +}; +IClientRPCService_testInsertRecord_args.prototype = {}; +IClientRPCService_testInsertRecord_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecord_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecord_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecord_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertRecord_result.prototype = {}; +IClientRPCService_testInsertRecord_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecord_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecord_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertStringRecord_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertStringRecordReq(args.req); + } + } +}; +IClientRPCService_testInsertStringRecord_args.prototype = {}; +IClientRPCService_testInsertStringRecord_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertStringRecordReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertStringRecord_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertStringRecord_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertStringRecord_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertStringRecord_result.prototype = {}; +IClientRPCService_testInsertStringRecord_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertStringRecord_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertStringRecord_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecords_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordsReq(args.req); + } + } +}; +IClientRPCService_testInsertRecords_args.prototype = {}; +IClientRPCService_testInsertRecords_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecords_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecords_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecords_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertRecords_result.prototype = {}; +IClientRPCService_testInsertRecords_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecords_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecords_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecordsOfOneDevice_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(args.req); + } + } +}; +IClientRPCService_testInsertRecordsOfOneDevice_args.prototype = {}; +IClientRPCService_testInsertRecordsOfOneDevice_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecordsOfOneDevice_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecordsOfOneDevice_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertRecordsOfOneDevice_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertRecordsOfOneDevice_result.prototype = {}; +IClientRPCService_testInsertRecordsOfOneDevice_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertRecordsOfOneDevice_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertRecordsOfOneDevice_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertStringRecords_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSInsertStringRecordsReq(args.req); + } + } +}; +IClientRPCService_testInsertStringRecords_args.prototype = {}; +IClientRPCService_testInsertStringRecords_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSInsertStringRecordsReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertStringRecords_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertStringRecords_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testInsertStringRecords_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testInsertStringRecords_result.prototype = {}; +IClientRPCService_testInsertStringRecords_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testInsertStringRecords_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testInsertStringRecords_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteData_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSDeleteDataReq(args.req); + } + } +}; +IClientRPCService_deleteData_args.prototype = {}; +IClientRPCService_deleteData_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSDeleteDataReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteData_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteData_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_deleteData_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_deleteData_result.prototype = {}; +IClientRPCService_deleteData_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_deleteData_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_deleteData_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeRawDataQuery_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSRawDataQueryReq(args.req); + } + } +}; +IClientRPCService_executeRawDataQuery_args.prototype = {}; +IClientRPCService_executeRawDataQuery_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSRawDataQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeRawDataQuery_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeRawDataQuery_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeRawDataQuery_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeRawDataQuery_result.prototype = {}; +IClientRPCService_executeRawDataQuery_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeRawDataQuery_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeRawDataQuery_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeLastDataQuery_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSLastDataQueryReq(args.req); + } + } +}; +IClientRPCService_executeLastDataQuery_args.prototype = {}; +IClientRPCService_executeLastDataQuery_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSLastDataQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeLastDataQuery_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeLastDataQuery_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeLastDataQuery_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeLastDataQuery_result.prototype = {}; +IClientRPCService_executeLastDataQuery_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeLastDataQuery_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeLastDataQuery_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeAggregationQuery_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSAggregationQueryReq(args.req); + } + } +}; +IClientRPCService_executeAggregationQuery_args.prototype = {}; +IClientRPCService_executeAggregationQuery_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSAggregationQueryReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeAggregationQuery_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeAggregationQuery_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_executeAggregationQuery_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSExecuteStatementResp(args.success); + } + } +}; +IClientRPCService_executeAggregationQuery_result.prototype = {}; +IClientRPCService_executeAggregationQuery_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSExecuteStatementResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_executeAggregationQuery_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_executeAggregationQuery_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_requestStatementId_args = function(args) { + this.sessionId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + } +}; +IClientRPCService_requestStatementId_args.prototype = {}; +IClientRPCService_requestStatementId_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_requestStatementId_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_requestStatementId_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_requestStatementId_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = args.success; + } + } +}; +IClientRPCService_requestStatementId_result.prototype = {}; +IClientRPCService_requestStatementId_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.I64) { + this.success = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_requestStatementId_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_requestStatementId_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.I64, 0); + output.writeI64(this.success); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSCreateSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_createSchemaTemplate_args.prototype = {}; +IClientRPCService_createSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSCreateSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_createSchemaTemplate_result.prototype = {}; +IClientRPCService_createSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_appendSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSAppendSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_appendSchemaTemplate_args.prototype = {}; +IClientRPCService_appendSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSAppendSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_appendSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_appendSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_appendSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_appendSchemaTemplate_result.prototype = {}; +IClientRPCService_appendSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_appendSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_appendSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pruneSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSPruneSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_pruneSchemaTemplate_args.prototype = {}; +IClientRPCService_pruneSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSPruneSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pruneSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pruneSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pruneSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_pruneSchemaTemplate_result.prototype = {}; +IClientRPCService_pruneSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pruneSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pruneSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_querySchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSQueryTemplateReq(args.req); + } + } +}; +IClientRPCService_querySchemaTemplate_args.prototype = {}; +IClientRPCService_querySchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSQueryTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_querySchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_querySchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_querySchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSQueryTemplateResp(args.success); + } + } +}; +IClientRPCService_querySchemaTemplate_result.prototype = {}; +IClientRPCService_querySchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSQueryTemplateResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_querySchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_querySchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_showConfigurationTemplate_args = function(args) { +}; +IClientRPCService_showConfigurationTemplate_args.prototype = {}; +IClientRPCService_showConfigurationTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + if (ftype == Thrift.Type.STOP) { + break; + } + input.skip(ftype); + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_showConfigurationTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_showConfigurationTemplate_args'); + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_showConfigurationTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TShowConfigurationTemplateResp(args.success); + } + } +}; +IClientRPCService_showConfigurationTemplate_result.prototype = {}; +IClientRPCService_showConfigurationTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TShowConfigurationTemplateResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_showConfigurationTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_showConfigurationTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_showConfiguration_args = function(args) { + this.nodeId = null; + if (args) { + if (args.nodeId !== undefined && args.nodeId !== null) { + this.nodeId = args.nodeId; + } + } +}; +IClientRPCService_showConfiguration_args.prototype = {}; +IClientRPCService_showConfiguration_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.nodeId = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_showConfiguration_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_showConfiguration_args'); + if (this.nodeId !== null && this.nodeId !== undefined) { + output.writeFieldBegin('nodeId', Thrift.Type.I32, 1); + output.writeI32(this.nodeId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_showConfiguration_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TShowConfigurationResp(args.success); + } + } +}; +IClientRPCService_showConfiguration_result.prototype = {}; +IClientRPCService_showConfiguration_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TShowConfigurationResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_showConfiguration_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_showConfiguration_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSSetSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_setSchemaTemplate_args.prototype = {}; +IClientRPCService_setSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSSetSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_setSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_setSchemaTemplate_result.prototype = {}; +IClientRPCService_setSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_setSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_setSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_unsetSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSUnsetSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_unsetSchemaTemplate_args.prototype = {}; +IClientRPCService_unsetSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSUnsetSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_unsetSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_unsetSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_unsetSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_unsetSchemaTemplate_result.prototype = {}; +IClientRPCService_unsetSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_unsetSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_unsetSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_dropSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TSDropSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_dropSchemaTemplate_args.prototype = {}; +IClientRPCService_dropSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TSDropSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_dropSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_dropSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_dropSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_dropSchemaTemplate_result.prototype = {}; +IClientRPCService_dropSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_dropSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_dropSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createTimeseriesUsingSchemaTemplate_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TCreateTimeseriesUsingSchemaTemplateReq(args.req); + } + } +}; +IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype = {}; +IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TCreateTimeseriesUsingSchemaTemplateReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createTimeseriesUsingSchemaTemplate_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_createTimeseriesUsingSchemaTemplate_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype = {}; +IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_createTimeseriesUsingSchemaTemplate_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_handshake_args = function(args) { + this.info = null; + if (args) { + if (args.info !== undefined && args.info !== null) { + this.info = new ttypes.TSyncIdentityInfo(args.info); + } + } +}; +IClientRPCService_handshake_args.prototype = {}; +IClientRPCService_handshake_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case -1: + if (ftype == Thrift.Type.STRUCT) { + this.info = new ttypes.TSyncIdentityInfo(); + this.info.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_handshake_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_handshake_args'); + if (this.info !== null && this.info !== undefined) { + output.writeFieldBegin('info', Thrift.Type.STRUCT, -1); + this.info.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_handshake_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_handshake_result.prototype = {}; +IClientRPCService_handshake_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_handshake_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_handshake_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_sendPipeData_args = function(args) { + this.buff = null; + if (args) { + if (args.buff !== undefined && args.buff !== null) { + this.buff = args.buff; + } + } +}; +IClientRPCService_sendPipeData_args.prototype = {}; +IClientRPCService_sendPipeData_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.buff = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_sendPipeData_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_sendPipeData_args'); + if (this.buff !== null && this.buff !== undefined) { + output.writeFieldBegin('buff', Thrift.Type.STRING, 1); + output.writeBinary(this.buff); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_sendPipeData_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_sendPipeData_result.prototype = {}; +IClientRPCService_sendPipeData_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_sendPipeData_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_sendPipeData_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_sendFile_args = function(args) { + this.metaInfo = null; + this.buff = null; + if (args) { + if (args.metaInfo !== undefined && args.metaInfo !== null) { + this.metaInfo = new ttypes.TSyncTransportMetaInfo(args.metaInfo); + } + if (args.buff !== undefined && args.buff !== null) { + this.buff = args.buff; + } + } +}; +IClientRPCService_sendFile_args.prototype = {}; +IClientRPCService_sendFile_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.metaInfo = new ttypes.TSyncTransportMetaInfo(); + this.metaInfo.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.buff = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_sendFile_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_sendFile_args'); + if (this.metaInfo !== null && this.metaInfo !== undefined) { + output.writeFieldBegin('metaInfo', Thrift.Type.STRUCT, 1); + this.metaInfo.write(output); + output.writeFieldEnd(); + } + if (this.buff !== null && this.buff !== undefined) { + output.writeFieldBegin('buff', Thrift.Type.STRING, 2); + output.writeBinary(this.buff); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_sendFile_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_sendFile_result.prototype = {}; +IClientRPCService_sendFile_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_sendFile_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_sendFile_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pipeTransfer_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TPipeTransferReq(args.req); + } + } +}; +IClientRPCService_pipeTransfer_args.prototype = {}; +IClientRPCService_pipeTransfer_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case -1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TPipeTransferReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pipeTransfer_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pipeTransfer_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, -1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pipeTransfer_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TPipeTransferResp(args.success); + } + } +}; +IClientRPCService_pipeTransfer_result.prototype = {}; +IClientRPCService_pipeTransfer_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TPipeTransferResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pipeTransfer_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pipeTransfer_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pipeSubscribe_args = function(args) { + this.req = null; + if (args) { + if (args.req !== undefined && args.req !== null) { + this.req = new ttypes.TPipeSubscribeReq(args.req); + } + } +}; +IClientRPCService_pipeSubscribe_args.prototype = {}; +IClientRPCService_pipeSubscribe_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case -1: + if (ftype == Thrift.Type.STRUCT) { + this.req = new ttypes.TPipeSubscribeReq(); + this.req.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pipeSubscribe_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pipeSubscribe_args'); + if (this.req !== null && this.req !== undefined) { + output.writeFieldBegin('req', Thrift.Type.STRUCT, -1); + this.req.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_pipeSubscribe_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TPipeSubscribeResp(args.success); + } + } +}; +IClientRPCService_pipeSubscribe_result.prototype = {}; +IClientRPCService_pipeSubscribe_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TPipeSubscribeResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_pipeSubscribe_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_pipeSubscribe_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getBackupConfiguration_args = function(args) { +}; +IClientRPCService_getBackupConfiguration_args.prototype = {}; +IClientRPCService_getBackupConfiguration_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + if (ftype == Thrift.Type.STOP) { + break; + } + input.skip(ftype); + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getBackupConfiguration_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getBackupConfiguration_args'); + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_getBackupConfiguration_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSBackupConfigurationResp(args.success); + } + } +}; +IClientRPCService_getBackupConfiguration_result.prototype = {}; +IClientRPCService_getBackupConfiguration_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSBackupConfigurationResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_getBackupConfiguration_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_getBackupConfiguration_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchAllConnectionsInfo_args = function(args) { +}; +IClientRPCService_fetchAllConnectionsInfo_args.prototype = {}; +IClientRPCService_fetchAllConnectionsInfo_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + if (ftype == Thrift.Type.STOP) { + break; + } + input.skip(ftype); + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchAllConnectionsInfo_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchAllConnectionsInfo_args'); + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_fetchAllConnectionsInfo_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new ttypes.TSConnectionInfoResp(args.success); + } + } +}; +IClientRPCService_fetchAllConnectionsInfo_result.prototype = {}; +IClientRPCService_fetchAllConnectionsInfo_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new ttypes.TSConnectionInfoResp(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_fetchAllConnectionsInfo_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_fetchAllConnectionsInfo_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testConnectionEmptyRPC_args = function(args) { +}; +IClientRPCService_testConnectionEmptyRPC_args.prototype = {}; +IClientRPCService_testConnectionEmptyRPC_args.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + if (ftype == Thrift.Type.STOP) { + break; + } + input.skip(ftype); + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testConnectionEmptyRPC_args.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testConnectionEmptyRPC_args'); + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCService_testConnectionEmptyRPC_result = function(args) { + this.success = null; + if (args) { + if (args.success !== undefined && args.success !== null) { + this.success = new common_ttypes.TSStatus(args.success); + } + } +}; +IClientRPCService_testConnectionEmptyRPC_result.prototype = {}; +IClientRPCService_testConnectionEmptyRPC_result.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 0: + if (ftype == Thrift.Type.STRUCT) { + this.success = new common_ttypes.TSStatus(); + this.success.read(input); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +IClientRPCService_testConnectionEmptyRPC_result.prototype.write = function(output) { + output.writeStructBegin('IClientRPCService_testConnectionEmptyRPC_result'); + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); + this.success.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var IClientRPCServiceClient = exports.Client = function(output, pClass) { + this.output = output; + this.pClass = pClass; + this._seqid = 0; + this._reqs = {}; +}; +IClientRPCServiceClient.prototype = {}; +IClientRPCServiceClient.prototype.seqid = function() { return this._seqid; }; +IClientRPCServiceClient.prototype.new_seqid = function() { return this._seqid += 1; }; + +IClientRPCServiceClient.prototype.executeQueryStatementV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeQueryStatementV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeQueryStatementV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeQueryStatementV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeQueryStatementV2_args(params); + try { + output.writeMessageBegin('executeQueryStatementV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeQueryStatementV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeQueryStatementV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeQueryStatementV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeUpdateStatementV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeUpdateStatementV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeUpdateStatementV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeUpdateStatementV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeUpdateStatementV2_args(params); + try { + output.writeMessageBegin('executeUpdateStatementV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeUpdateStatementV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeUpdateStatementV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeUpdateStatementV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeStatementV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeStatementV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeStatementV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeStatementV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeStatementV2_args(params); + try { + output.writeMessageBegin('executeStatementV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeStatementV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeStatementV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeStatementV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeRawDataQueryV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeRawDataQueryV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeRawDataQueryV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeRawDataQueryV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeRawDataQueryV2_args(params); + try { + output.writeMessageBegin('executeRawDataQueryV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeRawDataQueryV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeRawDataQueryV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeRawDataQueryV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeLastDataQueryV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeLastDataQueryV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeLastDataQueryV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeLastDataQueryV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeLastDataQueryV2_args(params); + try { + output.writeMessageBegin('executeLastDataQueryV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeLastDataQueryV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeLastDataQueryV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeLastDataQueryV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeFastLastDataQueryForOneDeviceV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeFastLastDataQueryForOneDeviceV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeFastLastDataQueryForOneDeviceV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeFastLastDataQueryForOneDeviceV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args(params); + try { + output.writeMessageBegin('executeFastLastDataQueryForOneDeviceV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeFastLastDataQueryForOneDeviceV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeFastLastDataQueryForOneDeviceV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeAggregationQueryV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeAggregationQueryV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeAggregationQueryV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeAggregationQueryV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeAggregationQueryV2_args(params); + try { + output.writeMessageBegin('executeAggregationQueryV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeAggregationQueryV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeAggregationQueryV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeAggregationQueryV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeGroupByQueryIntervalQuery = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeGroupByQueryIntervalQuery(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeGroupByQueryIntervalQuery(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeGroupByQueryIntervalQuery = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeGroupByQueryIntervalQuery_args(params); + try { + output.writeMessageBegin('executeGroupByQueryIntervalQuery', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeGroupByQueryIntervalQuery = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeGroupByQueryIntervalQuery_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeGroupByQueryIntervalQuery failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.fetchResultsV2 = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_fetchResultsV2(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_fetchResultsV2(req); + } +}; + +IClientRPCServiceClient.prototype.send_fetchResultsV2 = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_fetchResultsV2_args(params); + try { + output.writeMessageBegin('fetchResultsV2', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_fetchResultsV2 = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_fetchResultsV2_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('fetchResultsV2 failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.openSession = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_openSession(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_openSession(req); + } +}; + +IClientRPCServiceClient.prototype.send_openSession = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_openSession_args(params); + try { + output.writeMessageBegin('openSession', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_openSession = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_openSession_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('openSession failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.closeSession = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_closeSession(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_closeSession(req); + } +}; + +IClientRPCServiceClient.prototype.send_closeSession = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_closeSession_args(params); + try { + output.writeMessageBegin('closeSession', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_closeSession = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_closeSession_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('closeSession failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeStatement = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeStatement(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeStatement(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeStatement = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeStatement_args(params); + try { + output.writeMessageBegin('executeStatement', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeStatement = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeStatement_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeStatement failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeBatchStatement = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeBatchStatement(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeBatchStatement(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeBatchStatement = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeBatchStatement_args(params); + try { + output.writeMessageBegin('executeBatchStatement', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeBatchStatement = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeBatchStatement_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeBatchStatement failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeQueryStatement = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeQueryStatement(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeQueryStatement(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeQueryStatement = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeQueryStatement_args(params); + try { + output.writeMessageBegin('executeQueryStatement', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeQueryStatement = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeQueryStatement_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeQueryStatement failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeUpdateStatement = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeUpdateStatement(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeUpdateStatement(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeUpdateStatement = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeUpdateStatement_args(params); + try { + output.writeMessageBegin('executeUpdateStatement', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeUpdateStatement = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeUpdateStatement_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeUpdateStatement failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.fetchResults = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_fetchResults(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_fetchResults(req); + } +}; + +IClientRPCServiceClient.prototype.send_fetchResults = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_fetchResults_args(params); + try { + output.writeMessageBegin('fetchResults', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_fetchResults = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_fetchResults_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('fetchResults failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.fetchMetadata = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_fetchMetadata(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_fetchMetadata(req); + } +}; + +IClientRPCServiceClient.prototype.send_fetchMetadata = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_fetchMetadata_args(params); + try { + output.writeMessageBegin('fetchMetadata', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_fetchMetadata = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_fetchMetadata_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('fetchMetadata failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.cancelOperation = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_cancelOperation(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_cancelOperation(req); + } +}; + +IClientRPCServiceClient.prototype.send_cancelOperation = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_cancelOperation_args(params); + try { + output.writeMessageBegin('cancelOperation', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_cancelOperation = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_cancelOperation_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('cancelOperation failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.closeOperation = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_closeOperation(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_closeOperation(req); + } +}; + +IClientRPCServiceClient.prototype.send_closeOperation = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_closeOperation_args(params); + try { + output.writeMessageBegin('closeOperation', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_closeOperation = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_closeOperation_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('closeOperation failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.getTimeZone = function(sessionId, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_getTimeZone(sessionId); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_getTimeZone(sessionId); + } +}; + +IClientRPCServiceClient.prototype.send_getTimeZone = function(sessionId) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId + }; + var args = new IClientRPCService_getTimeZone_args(params); + try { + output.writeMessageBegin('getTimeZone', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_getTimeZone = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_getTimeZone_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('getTimeZone failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.setTimeZone = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_setTimeZone(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_setTimeZone(req); + } +}; + +IClientRPCServiceClient.prototype.send_setTimeZone = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_setTimeZone_args(params); + try { + output.writeMessageBegin('setTimeZone', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_setTimeZone = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_setTimeZone_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('setTimeZone failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.getProperties = function(callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_getProperties(); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_getProperties(); + } +}; + +IClientRPCServiceClient.prototype.send_getProperties = function() { + var output = new this.pClass(this.output); + var args = new IClientRPCService_getProperties_args(); + try { + output.writeMessageBegin('getProperties', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_getProperties = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_getProperties_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('getProperties failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.setStorageGroup = function(sessionId, storageGroup, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_setStorageGroup(sessionId, storageGroup); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_setStorageGroup(sessionId, storageGroup); + } +}; + +IClientRPCServiceClient.prototype.send_setStorageGroup = function(sessionId, storageGroup) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId, + storageGroup: storageGroup + }; + var args = new IClientRPCService_setStorageGroup_args(params); + try { + output.writeMessageBegin('setStorageGroup', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_setStorageGroup = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_setStorageGroup_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('setStorageGroup failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.createTimeseries = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_createTimeseries(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_createTimeseries(req); + } +}; + +IClientRPCServiceClient.prototype.send_createTimeseries = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_createTimeseries_args(params); + try { + output.writeMessageBegin('createTimeseries', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_createTimeseries = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_createTimeseries_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('createTimeseries failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.createAlignedTimeseries = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_createAlignedTimeseries(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_createAlignedTimeseries(req); + } +}; + +IClientRPCServiceClient.prototype.send_createAlignedTimeseries = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_createAlignedTimeseries_args(params); + try { + output.writeMessageBegin('createAlignedTimeseries', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_createAlignedTimeseries = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_createAlignedTimeseries_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('createAlignedTimeseries failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.createMultiTimeseries = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_createMultiTimeseries(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_createMultiTimeseries(req); + } +}; + +IClientRPCServiceClient.prototype.send_createMultiTimeseries = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_createMultiTimeseries_args(params); + try { + output.writeMessageBegin('createMultiTimeseries', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_createMultiTimeseries = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_createMultiTimeseries_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('createMultiTimeseries failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.deleteTimeseries = function(sessionId, path, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_deleteTimeseries(sessionId, path); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_deleteTimeseries(sessionId, path); + } +}; + +IClientRPCServiceClient.prototype.send_deleteTimeseries = function(sessionId, path) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId, + path: path + }; + var args = new IClientRPCService_deleteTimeseries_args(params); + try { + output.writeMessageBegin('deleteTimeseries', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_deleteTimeseries = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_deleteTimeseries_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('deleteTimeseries failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.deleteStorageGroups = function(sessionId, storageGroup, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_deleteStorageGroups(sessionId, storageGroup); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_deleteStorageGroups(sessionId, storageGroup); + } +}; + +IClientRPCServiceClient.prototype.send_deleteStorageGroups = function(sessionId, storageGroup) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId, + storageGroup: storageGroup + }; + var args = new IClientRPCService_deleteStorageGroups_args(params); + try { + output.writeMessageBegin('deleteStorageGroups', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_deleteStorageGroups = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_deleteStorageGroups_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('deleteStorageGroups failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertRecord = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertRecord(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertRecord(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertRecord = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertRecord_args(params); + try { + output.writeMessageBegin('insertRecord', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertRecord = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertRecord_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertRecord failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertStringRecord = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertStringRecord(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertStringRecord(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertStringRecord = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertStringRecord_args(params); + try { + output.writeMessageBegin('insertStringRecord', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertStringRecord = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertStringRecord_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertStringRecord failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertTablet = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertTablet(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertTablet(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertTablet = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertTablet_args(params); + try { + output.writeMessageBegin('insertTablet', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertTablet = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertTablet_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertTablet failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertTablets = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertTablets(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertTablets(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertTablets = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertTablets_args(params); + try { + output.writeMessageBegin('insertTablets', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertTablets = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertTablets_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertTablets failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertRecords = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertRecords(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertRecords(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertRecords = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertRecords_args(params); + try { + output.writeMessageBegin('insertRecords', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertRecords = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertRecords_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertRecords failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertRecordsOfOneDevice = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertRecordsOfOneDevice(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertRecordsOfOneDevice(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertRecordsOfOneDevice = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertRecordsOfOneDevice_args(params); + try { + output.writeMessageBegin('insertRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertRecordsOfOneDevice = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertRecordsOfOneDevice_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertRecordsOfOneDevice failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertStringRecordsOfOneDevice = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertStringRecordsOfOneDevice(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertStringRecordsOfOneDevice(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertStringRecordsOfOneDevice = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertStringRecordsOfOneDevice_args(params); + try { + output.writeMessageBegin('insertStringRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertStringRecordsOfOneDevice = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertStringRecordsOfOneDevice_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertStringRecordsOfOneDevice failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.insertStringRecords = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_insertStringRecords(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertStringRecords(req); + } +}; + +IClientRPCServiceClient.prototype.send_insertStringRecords = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertStringRecords_args(params); + try { + output.writeMessageBegin('insertStringRecords', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_insertStringRecords = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertStringRecords_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertStringRecords failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertTablet = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertTablet(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertTablet(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertTablet = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertTablet_args(params); + try { + output.writeMessageBegin('testInsertTablet', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertTablet = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertTablet_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertTablet failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertTablets = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertTablets(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertTablets(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertTablets = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertTablets_args(params); + try { + output.writeMessageBegin('testInsertTablets', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertTablets = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertTablets_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertTablets failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertRecord = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertRecord(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertRecord(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertRecord = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertRecord_args(params); + try { + output.writeMessageBegin('testInsertRecord', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertRecord = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertRecord_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertRecord failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertStringRecord = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertStringRecord(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertStringRecord(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertStringRecord = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertStringRecord_args(params); + try { + output.writeMessageBegin('testInsertStringRecord', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertStringRecord = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertStringRecord_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertStringRecord failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertRecords = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertRecords(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertRecords(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertRecords = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertRecords_args(params); + try { + output.writeMessageBegin('testInsertRecords', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertRecords = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertRecords_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertRecords failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertRecordsOfOneDevice = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertRecordsOfOneDevice(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertRecordsOfOneDevice(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertRecordsOfOneDevice = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertRecordsOfOneDevice_args(params); + try { + output.writeMessageBegin('testInsertRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertRecordsOfOneDevice = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertRecordsOfOneDevice_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertRecordsOfOneDevice failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testInsertStringRecords = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testInsertStringRecords(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testInsertStringRecords(req); + } +}; + +IClientRPCServiceClient.prototype.send_testInsertStringRecords = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_testInsertStringRecords_args(params); + try { + output.writeMessageBegin('testInsertStringRecords', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testInsertStringRecords = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testInsertStringRecords_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testInsertStringRecords failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.deleteData = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_deleteData(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_deleteData(req); + } +}; + +IClientRPCServiceClient.prototype.send_deleteData = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_deleteData_args(params); + try { + output.writeMessageBegin('deleteData', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_deleteData = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_deleteData_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('deleteData failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeRawDataQuery = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeRawDataQuery(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeRawDataQuery(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeRawDataQuery = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeRawDataQuery_args(params); + try { + output.writeMessageBegin('executeRawDataQuery', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeRawDataQuery = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeRawDataQuery_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeRawDataQuery failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeLastDataQuery = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeLastDataQuery(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeLastDataQuery(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeLastDataQuery = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeLastDataQuery_args(params); + try { + output.writeMessageBegin('executeLastDataQuery', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeLastDataQuery = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeLastDataQuery_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeLastDataQuery failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.executeAggregationQuery = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_executeAggregationQuery(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeAggregationQuery(req); + } +}; + +IClientRPCServiceClient.prototype.send_executeAggregationQuery = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeAggregationQuery_args(params); + try { + output.writeMessageBegin('executeAggregationQuery', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_executeAggregationQuery = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_executeAggregationQuery_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('executeAggregationQuery failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.requestStatementId = function(sessionId, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_requestStatementId(sessionId); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_requestStatementId(sessionId); + } +}; + +IClientRPCServiceClient.prototype.send_requestStatementId = function(sessionId) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId + }; + var args = new IClientRPCService_requestStatementId_args(params); + try { + output.writeMessageBegin('requestStatementId', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_requestStatementId = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_requestStatementId_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('requestStatementId failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.createSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_createSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_createSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_createSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_createSchemaTemplate_args(params); + try { + output.writeMessageBegin('createSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_createSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_createSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('createSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.appendSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_appendSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_appendSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_appendSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_appendSchemaTemplate_args(params); + try { + output.writeMessageBegin('appendSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_appendSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_appendSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('appendSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.pruneSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_pruneSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_pruneSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_pruneSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_pruneSchemaTemplate_args(params); + try { + output.writeMessageBegin('pruneSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_pruneSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_pruneSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('pruneSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.querySchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_querySchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_querySchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_querySchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_querySchemaTemplate_args(params); + try { + output.writeMessageBegin('querySchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_querySchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_querySchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('querySchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.showConfigurationTemplate = function(callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_showConfigurationTemplate(); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_showConfigurationTemplate(); + } +}; + +IClientRPCServiceClient.prototype.send_showConfigurationTemplate = function() { + var output = new this.pClass(this.output); + var args = new IClientRPCService_showConfigurationTemplate_args(); + try { + output.writeMessageBegin('showConfigurationTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_showConfigurationTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_showConfigurationTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('showConfigurationTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.showConfiguration = function(nodeId, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_showConfiguration(nodeId); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_showConfiguration(nodeId); + } +}; + +IClientRPCServiceClient.prototype.send_showConfiguration = function(nodeId) { + var output = new this.pClass(this.output); + var params = { + nodeId: nodeId + }; + var args = new IClientRPCService_showConfiguration_args(params); + try { + output.writeMessageBegin('showConfiguration', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_showConfiguration = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_showConfiguration_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('showConfiguration failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.setSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_setSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_setSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_setSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_setSchemaTemplate_args(params); + try { + output.writeMessageBegin('setSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_setSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_setSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('setSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.unsetSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_unsetSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_unsetSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_unsetSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_unsetSchemaTemplate_args(params); + try { + output.writeMessageBegin('unsetSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_unsetSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_unsetSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('unsetSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.dropSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_dropSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_dropSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_dropSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_dropSchemaTemplate_args(params); + try { + output.writeMessageBegin('dropSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_dropSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_dropSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('dropSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.createTimeseriesUsingSchemaTemplate = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_createTimeseriesUsingSchemaTemplate(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_createTimeseriesUsingSchemaTemplate(req); + } +}; + +IClientRPCServiceClient.prototype.send_createTimeseriesUsingSchemaTemplate = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_createTimeseriesUsingSchemaTemplate_args(params); + try { + output.writeMessageBegin('createTimeseriesUsingSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_createTimeseriesUsingSchemaTemplate = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('createTimeseriesUsingSchemaTemplate failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.handshake = function(info, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_handshake(info); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_handshake(info); + } +}; + +IClientRPCServiceClient.prototype.send_handshake = function(info) { + var output = new this.pClass(this.output); + var params = { + info: info + }; + var args = new IClientRPCService_handshake_args(params); + try { + output.writeMessageBegin('handshake', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_handshake = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_handshake_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('handshake failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.sendPipeData = function(buff, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_sendPipeData(buff); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_sendPipeData(buff); + } +}; + +IClientRPCServiceClient.prototype.send_sendPipeData = function(buff) { + var output = new this.pClass(this.output); + var params = { + buff: buff + }; + var args = new IClientRPCService_sendPipeData_args(params); + try { + output.writeMessageBegin('sendPipeData', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_sendPipeData = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_sendPipeData_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('sendPipeData failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.sendFile = function(metaInfo, buff, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_sendFile(metaInfo, buff); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_sendFile(metaInfo, buff); + } +}; + +IClientRPCServiceClient.prototype.send_sendFile = function(metaInfo, buff) { + var output = new this.pClass(this.output); + var params = { + metaInfo: metaInfo, + buff: buff + }; + var args = new IClientRPCService_sendFile_args(params); + try { + output.writeMessageBegin('sendFile', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_sendFile = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_sendFile_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('sendFile failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.pipeTransfer = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_pipeTransfer(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_pipeTransfer(req); + } +}; + +IClientRPCServiceClient.prototype.send_pipeTransfer = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_pipeTransfer_args(params); + try { + output.writeMessageBegin('pipeTransfer', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_pipeTransfer = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_pipeTransfer_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('pipeTransfer failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.pipeSubscribe = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_pipeSubscribe(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_pipeSubscribe(req); + } +}; + +IClientRPCServiceClient.prototype.send_pipeSubscribe = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_pipeSubscribe_args(params); + try { + output.writeMessageBegin('pipeSubscribe', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_pipeSubscribe = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_pipeSubscribe_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('pipeSubscribe failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.getBackupConfiguration = function(callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_getBackupConfiguration(); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_getBackupConfiguration(); + } +}; + +IClientRPCServiceClient.prototype.send_getBackupConfiguration = function() { + var output = new this.pClass(this.output); + var args = new IClientRPCService_getBackupConfiguration_args(); + try { + output.writeMessageBegin('getBackupConfiguration', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_getBackupConfiguration = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_getBackupConfiguration_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('getBackupConfiguration failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.fetchAllConnectionsInfo = function(callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_fetchAllConnectionsInfo(); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_fetchAllConnectionsInfo(); + } +}; + +IClientRPCServiceClient.prototype.send_fetchAllConnectionsInfo = function() { + var output = new this.pClass(this.output); + var args = new IClientRPCService_fetchAllConnectionsInfo_args(); + try { + output.writeMessageBegin('fetchAllConnectionsInfo', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_fetchAllConnectionsInfo = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_fetchAllConnectionsInfo_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('fetchAllConnectionsInfo failed: unknown result'); +}; + +IClientRPCServiceClient.prototype.testConnectionEmptyRPC = function(callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); + } else { + _defer.resolve(result); + } + }; + this.send_testConnectionEmptyRPC(); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_testConnectionEmptyRPC(); + } +}; + +IClientRPCServiceClient.prototype.send_testConnectionEmptyRPC = function() { + var output = new this.pClass(this.output); + var args = new IClientRPCService_testConnectionEmptyRPC_args(); + try { + output.writeMessageBegin('testConnectionEmptyRPC', Thrift.MessageType.CALL, this.seqid()); + args.write(output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; + } +}; + +IClientRPCServiceClient.prototype.recv_testConnectionEmptyRPC = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x.read(input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_testConnectionEmptyRPC_result(); + result.read(input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('testConnectionEmptyRPC failed: unknown result'); +}; +var IClientRPCServiceProcessor = exports.Processor = function(handler) { + this._handler = handler; +}; +IClientRPCServiceProcessor.prototype.process = function(input, output) { + var r = input.readMessageBegin(); + if (this['process_' + r.fname]) { + return this['process_' + r.fname].call(this, r.rseqid, input, output); + } else { + input.skip(Thrift.Type.STRUCT); + input.readMessageEnd(); + var x = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, 'Unknown function ' + r.fname); + output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid); + x.write(output); + output.writeMessageEnd(); + output.flush(); + } +}; +IClientRPCServiceProcessor.prototype.process_executeQueryStatementV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeQueryStatementV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeQueryStatementV2.length === 1) { + Q.fcall(this._handler.executeQueryStatementV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeQueryStatementV2_result({success: result}); + output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeQueryStatementV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeQueryStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeUpdateStatementV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeUpdateStatementV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeUpdateStatementV2.length === 1) { + Q.fcall(this._handler.executeUpdateStatementV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeUpdateStatementV2_result({success: result}); + output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeUpdateStatementV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeUpdateStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeStatementV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeStatementV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeStatementV2.length === 1) { + Q.fcall(this._handler.executeStatementV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeStatementV2_result({success: result}); + output.writeMessageBegin("executeStatementV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeStatementV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeStatementV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeStatementV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeStatementV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeRawDataQueryV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeRawDataQueryV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeRawDataQueryV2.length === 1) { + Q.fcall(this._handler.executeRawDataQueryV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeRawDataQueryV2_result({success: result}); + output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeRawDataQueryV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeRawDataQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeLastDataQueryV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeLastDataQueryV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeLastDataQueryV2.length === 1) { + Q.fcall(this._handler.executeLastDataQueryV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeLastDataQueryV2_result({success: result}); + output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeLastDataQueryV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeLastDataQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeFastLastDataQueryForOneDeviceV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeFastLastDataQueryForOneDeviceV2.length === 1) { + Q.fcall(this._handler.executeFastLastDataQueryForOneDeviceV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result({success: result}); + output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeFastLastDataQueryForOneDeviceV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeAggregationQueryV2 = function(seqid, input, output) { + var args = new IClientRPCService_executeAggregationQueryV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeAggregationQueryV2.length === 1) { + Q.fcall(this._handler.executeAggregationQueryV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeAggregationQueryV2_result({success: result}); + output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeAggregationQueryV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeAggregationQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeGroupByQueryIntervalQuery = function(seqid, input, output) { + var args = new IClientRPCService_executeGroupByQueryIntervalQuery_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeGroupByQueryIntervalQuery.length === 1) { + Q.fcall(this._handler.executeGroupByQueryIntervalQuery.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeGroupByQueryIntervalQuery_result({success: result}); + output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeGroupByQueryIntervalQuery(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeGroupByQueryIntervalQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_fetchResultsV2 = function(seqid, input, output) { + var args = new IClientRPCService_fetchResultsV2_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.fetchResultsV2.length === 1) { + Q.fcall(this._handler.fetchResultsV2.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_fetchResultsV2_result({success: result}); + output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.fetchResultsV2(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_fetchResultsV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_openSession = function(seqid, input, output) { + var args = new IClientRPCService_openSession_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.openSession.length === 1) { + Q.fcall(this._handler.openSession.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_openSession_result({success: result}); + output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.openSession(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_openSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_closeSession = function(seqid, input, output) { + var args = new IClientRPCService_closeSession_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.closeSession.length === 1) { + Q.fcall(this._handler.closeSession.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_closeSession_result({success: result}); + output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.closeSession(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_closeSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeStatement = function(seqid, input, output) { + var args = new IClientRPCService_executeStatement_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeStatement.length === 1) { + Q.fcall(this._handler.executeStatement.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeStatement_result({success: result}); + output.writeMessageBegin("executeStatement", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeStatement", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeStatement(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeStatement", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeStatement", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeBatchStatement = function(seqid, input, output) { + var args = new IClientRPCService_executeBatchStatement_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeBatchStatement.length === 1) { + Q.fcall(this._handler.executeBatchStatement.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeBatchStatement_result({success: result}); + output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeBatchStatement(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeBatchStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeQueryStatement = function(seqid, input, output) { + var args = new IClientRPCService_executeQueryStatement_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeQueryStatement.length === 1) { + Q.fcall(this._handler.executeQueryStatement.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeQueryStatement_result({success: result}); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeQueryStatement(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeQueryStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeUpdateStatement = function(seqid, input, output) { + var args = new IClientRPCService_executeUpdateStatement_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeUpdateStatement.length === 1) { + Q.fcall(this._handler.executeUpdateStatement.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeUpdateStatement_result({success: result}); + output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeUpdateStatement(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeUpdateStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_fetchResults = function(seqid, input, output) { + var args = new IClientRPCService_fetchResults_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.fetchResults.length === 1) { + Q.fcall(this._handler.fetchResults.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_fetchResults_result({success: result}); + output.writeMessageBegin("fetchResults", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchResults", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.fetchResults(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_fetchResults_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("fetchResults", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchResults", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_fetchMetadata = function(seqid, input, output) { + var args = new IClientRPCService_fetchMetadata_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.fetchMetadata.length === 1) { + Q.fcall(this._handler.fetchMetadata.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_fetchMetadata_result({success: result}); + output.writeMessageBegin("fetchMetadata", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchMetadata", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.fetchMetadata(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_fetchMetadata_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("fetchMetadata", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchMetadata", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_cancelOperation = function(seqid, input, output) { + var args = new IClientRPCService_cancelOperation_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.cancelOperation.length === 1) { + Q.fcall(this._handler.cancelOperation.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_cancelOperation_result({success: result}); + output.writeMessageBegin("cancelOperation", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("cancelOperation", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.cancelOperation(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_cancelOperation_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("cancelOperation", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("cancelOperation", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_closeOperation = function(seqid, input, output) { + var args = new IClientRPCService_closeOperation_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.closeOperation.length === 1) { + Q.fcall(this._handler.closeOperation.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_closeOperation_result({success: result}); + output.writeMessageBegin("closeOperation", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("closeOperation", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.closeOperation(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_closeOperation_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("closeOperation", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("closeOperation", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_getTimeZone = function(seqid, input, output) { + var args = new IClientRPCService_getTimeZone_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.getTimeZone.length === 1) { + Q.fcall(this._handler.getTimeZone.bind(this._handler), + args.sessionId + ).then(function(result) { + var result_obj = new IClientRPCService_getTimeZone_result({success: result}); + output.writeMessageBegin("getTimeZone", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getTimeZone", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.getTimeZone(args.sessionId, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_getTimeZone_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("getTimeZone", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getTimeZone", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_setTimeZone = function(seqid, input, output) { + var args = new IClientRPCService_setTimeZone_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.setTimeZone.length === 1) { + Q.fcall(this._handler.setTimeZone.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_setTimeZone_result({success: result}); + output.writeMessageBegin("setTimeZone", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setTimeZone", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.setTimeZone(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_setTimeZone_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("setTimeZone", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setTimeZone", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_getProperties = function(seqid, input, output) { + var args = new IClientRPCService_getProperties_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.getProperties.length === 0) { + Q.fcall(this._handler.getProperties.bind(this._handler) + ).then(function(result) { + var result_obj = new IClientRPCService_getProperties_result({success: result}); + output.writeMessageBegin("getProperties", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getProperties", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.getProperties(function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_getProperties_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("getProperties", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getProperties", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_setStorageGroup = function(seqid, input, output) { + var args = new IClientRPCService_setStorageGroup_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.setStorageGroup.length === 2) { + Q.fcall(this._handler.setStorageGroup.bind(this._handler), + args.sessionId, + args.storageGroup + ).then(function(result) { + var result_obj = new IClientRPCService_setStorageGroup_result({success: result}); + output.writeMessageBegin("setStorageGroup", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setStorageGroup", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.setStorageGroup(args.sessionId, args.storageGroup, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_setStorageGroup_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("setStorageGroup", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setStorageGroup", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_createTimeseries = function(seqid, input, output) { + var args = new IClientRPCService_createTimeseries_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.createTimeseries.length === 1) { + Q.fcall(this._handler.createTimeseries.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_createTimeseries_result({success: result}); + output.writeMessageBegin("createTimeseries", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createTimeseries", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.createTimeseries(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_createTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("createTimeseries", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createTimeseries", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_createAlignedTimeseries = function(seqid, input, output) { + var args = new IClientRPCService_createAlignedTimeseries_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.createAlignedTimeseries.length === 1) { + Q.fcall(this._handler.createAlignedTimeseries.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_createAlignedTimeseries_result({success: result}); + output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.createAlignedTimeseries(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_createAlignedTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_createMultiTimeseries = function(seqid, input, output) { + var args = new IClientRPCService_createMultiTimeseries_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.createMultiTimeseries.length === 1) { + Q.fcall(this._handler.createMultiTimeseries.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_createMultiTimeseries_result({success: result}); + output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.createMultiTimeseries(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_createMultiTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_deleteTimeseries = function(seqid, input, output) { + var args = new IClientRPCService_deleteTimeseries_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.deleteTimeseries.length === 2) { + Q.fcall(this._handler.deleteTimeseries.bind(this._handler), + args.sessionId, + args.path + ).then(function(result) { + var result_obj = new IClientRPCService_deleteTimeseries_result({success: result}); + output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.deleteTimeseries(args.sessionId, args.path, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_deleteTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_deleteStorageGroups = function(seqid, input, output) { + var args = new IClientRPCService_deleteStorageGroups_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.deleteStorageGroups.length === 2) { + Q.fcall(this._handler.deleteStorageGroups.bind(this._handler), + args.sessionId, + args.storageGroup + ).then(function(result) { + var result_obj = new IClientRPCService_deleteStorageGroups_result({success: result}); + output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.deleteStorageGroups(args.sessionId, args.storageGroup, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_deleteStorageGroups_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertRecord = function(seqid, input, output) { + var args = new IClientRPCService_insertRecord_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertRecord.length === 1) { + Q.fcall(this._handler.insertRecord.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertRecord_result({success: result}); + output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertRecord(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertStringRecord = function(seqid, input, output) { + var args = new IClientRPCService_insertStringRecord_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertStringRecord.length === 1) { + Q.fcall(this._handler.insertStringRecord.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertStringRecord_result({success: result}); + output.writeMessageBegin("insertStringRecord", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecord", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertStringRecord(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertStringRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertStringRecord", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecord", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertTablet = function(seqid, input, output) { + var args = new IClientRPCService_insertTablet_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertTablet.length === 1) { + Q.fcall(this._handler.insertTablet.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertTablet_result({success: result}); + output.writeMessageBegin("insertTablet", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertTablet", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertTablet(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertTablet_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertTablet", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertTablet", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertTablets = function(seqid, input, output) { + var args = new IClientRPCService_insertTablets_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertTablets.length === 1) { + Q.fcall(this._handler.insertTablets.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertTablets_result({success: result}); + output.writeMessageBegin("insertTablets", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertTablets", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertTablets(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertTablets_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertTablets", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertTablets", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertRecords = function(seqid, input, output) { + var args = new IClientRPCService_insertRecords_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertRecords.length === 1) { + Q.fcall(this._handler.insertRecords.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertRecords_result({success: result}); + output.writeMessageBegin("insertRecords", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecords", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertRecords(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertRecords", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecords", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertRecordsOfOneDevice = function(seqid, input, output) { + var args = new IClientRPCService_insertRecordsOfOneDevice_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertRecordsOfOneDevice.length === 1) { + Q.fcall(this._handler.insertRecordsOfOneDevice.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertRecordsOfOneDevice_result({success: result}); + output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertRecordsOfOneDevice(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertStringRecordsOfOneDevice = function(seqid, input, output) { + var args = new IClientRPCService_insertStringRecordsOfOneDevice_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertStringRecordsOfOneDevice.length === 1) { + Q.fcall(this._handler.insertStringRecordsOfOneDevice.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertStringRecordsOfOneDevice_result({success: result}); + output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertStringRecordsOfOneDevice(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertStringRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_insertStringRecords = function(seqid, input, output) { + var args = new IClientRPCService_insertStringRecords_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.insertStringRecords.length === 1) { + Q.fcall(this._handler.insertStringRecords.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_insertStringRecords_result({success: result}); + output.writeMessageBegin("insertStringRecords", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecords", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.insertStringRecords(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_insertStringRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertStringRecords", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("insertStringRecords", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertTablet = function(seqid, input, output) { + var args = new IClientRPCService_testInsertTablet_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertTablet.length === 1) { + Q.fcall(this._handler.testInsertTablet.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertTablet_result({success: result}); + output.writeMessageBegin("testInsertTablet", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertTablet", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertTablet(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertTablet_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertTablet", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertTablet", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertTablets = function(seqid, input, output) { + var args = new IClientRPCService_testInsertTablets_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertTablets.length === 1) { + Q.fcall(this._handler.testInsertTablets.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertTablets_result({success: result}); + output.writeMessageBegin("testInsertTablets", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertTablets", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertTablets(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertTablets_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertTablets", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertTablets", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertRecord = function(seqid, input, output) { + var args = new IClientRPCService_testInsertRecord_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertRecord.length === 1) { + Q.fcall(this._handler.testInsertRecord.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertRecord_result({success: result}); + output.writeMessageBegin("testInsertRecord", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecord", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertRecord(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertRecord", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecord", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertStringRecord = function(seqid, input, output) { + var args = new IClientRPCService_testInsertStringRecord_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertStringRecord.length === 1) { + Q.fcall(this._handler.testInsertStringRecord.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertStringRecord_result({success: result}); + output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertStringRecord(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertStringRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertRecords = function(seqid, input, output) { + var args = new IClientRPCService_testInsertRecords_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertRecords.length === 1) { + Q.fcall(this._handler.testInsertRecords.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertRecords_result({success: result}); + output.writeMessageBegin("testInsertRecords", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecords", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertRecords(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertRecords", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecords", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertRecordsOfOneDevice = function(seqid, input, output) { + var args = new IClientRPCService_testInsertRecordsOfOneDevice_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertRecordsOfOneDevice.length === 1) { + Q.fcall(this._handler.testInsertRecordsOfOneDevice.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertRecordsOfOneDevice_result({success: result}); + output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertRecordsOfOneDevice(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testInsertStringRecords = function(seqid, input, output) { + var args = new IClientRPCService_testInsertStringRecords_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testInsertStringRecords.length === 1) { + Q.fcall(this._handler.testInsertStringRecords.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_testInsertStringRecords_result({success: result}); + output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testInsertStringRecords(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testInsertStringRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_deleteData = function(seqid, input, output) { + var args = new IClientRPCService_deleteData_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.deleteData.length === 1) { + Q.fcall(this._handler.deleteData.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_deleteData_result({success: result}); + output.writeMessageBegin("deleteData", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteData", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.deleteData(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_deleteData_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("deleteData", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("deleteData", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeRawDataQuery = function(seqid, input, output) { + var args = new IClientRPCService_executeRawDataQuery_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeRawDataQuery.length === 1) { + Q.fcall(this._handler.executeRawDataQuery.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeRawDataQuery_result({success: result}); + output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeRawDataQuery(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeRawDataQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeLastDataQuery = function(seqid, input, output) { + var args = new IClientRPCService_executeLastDataQuery_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeLastDataQuery.length === 1) { + Q.fcall(this._handler.executeLastDataQuery.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeLastDataQuery_result({success: result}); + output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeLastDataQuery(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeLastDataQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_executeAggregationQuery = function(seqid, input, output) { + var args = new IClientRPCService_executeAggregationQuery_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.executeAggregationQuery.length === 1) { + Q.fcall(this._handler.executeAggregationQuery.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_executeAggregationQuery_result({success: result}); + output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.executeAggregationQuery(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_executeAggregationQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_requestStatementId = function(seqid, input, output) { + var args = new IClientRPCService_requestStatementId_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.requestStatementId.length === 1) { + Q.fcall(this._handler.requestStatementId.bind(this._handler), + args.sessionId + ).then(function(result) { + var result_obj = new IClientRPCService_requestStatementId_result({success: result}); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.requestStatementId(args.sessionId, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_requestStatementId_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_createSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_createSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.createSchemaTemplate.length === 1) { + Q.fcall(this._handler.createSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_createSchemaTemplate_result({success: result}); + output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.createSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_createSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_appendSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_appendSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.appendSchemaTemplate.length === 1) { + Q.fcall(this._handler.appendSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_appendSchemaTemplate_result({success: result}); + output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.appendSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_appendSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_pruneSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_pruneSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.pruneSchemaTemplate.length === 1) { + Q.fcall(this._handler.pruneSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_pruneSchemaTemplate_result({success: result}); + output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.pruneSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_pruneSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_querySchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_querySchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.querySchemaTemplate.length === 1) { + Q.fcall(this._handler.querySchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_querySchemaTemplate_result({success: result}); + output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.querySchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_querySchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_showConfigurationTemplate = function(seqid, input, output) { + var args = new IClientRPCService_showConfigurationTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.showConfigurationTemplate.length === 0) { + Q.fcall(this._handler.showConfigurationTemplate.bind(this._handler) + ).then(function(result) { + var result_obj = new IClientRPCService_showConfigurationTemplate_result({success: result}); + output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.showConfigurationTemplate(function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_showConfigurationTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_showConfiguration = function(seqid, input, output) { + var args = new IClientRPCService_showConfiguration_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.showConfiguration.length === 1) { + Q.fcall(this._handler.showConfiguration.bind(this._handler), + args.nodeId + ).then(function(result) { + var result_obj = new IClientRPCService_showConfiguration_result({success: result}); + output.writeMessageBegin("showConfiguration", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("showConfiguration", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.showConfiguration(args.nodeId, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_showConfiguration_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("showConfiguration", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("showConfiguration", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_setSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_setSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.setSchemaTemplate.length === 1) { + Q.fcall(this._handler.setSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_setSchemaTemplate_result({success: result}); + output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.setSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_setSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_unsetSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_unsetSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.unsetSchemaTemplate.length === 1) { + Q.fcall(this._handler.unsetSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_unsetSchemaTemplate_result({success: result}); + output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.unsetSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_unsetSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_dropSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_dropSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.dropSchemaTemplate.length === 1) { + Q.fcall(this._handler.dropSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_dropSchemaTemplate_result({success: result}); + output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.dropSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_dropSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_createTimeseriesUsingSchemaTemplate = function(seqid, input, output) { + var args = new IClientRPCService_createTimeseriesUsingSchemaTemplate_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.createTimeseriesUsingSchemaTemplate.length === 1) { + Q.fcall(this._handler.createTimeseriesUsingSchemaTemplate.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result({success: result}); + output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.createTimeseriesUsingSchemaTemplate(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_handshake = function(seqid, input, output) { + var args = new IClientRPCService_handshake_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.handshake.length === 1) { + Q.fcall(this._handler.handshake.bind(this._handler), + args.info + ).then(function(result) { + var result_obj = new IClientRPCService_handshake_result({success: result}); + output.writeMessageBegin("handshake", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("handshake", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.handshake(args.info, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_handshake_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("handshake", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("handshake", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_sendPipeData = function(seqid, input, output) { + var args = new IClientRPCService_sendPipeData_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.sendPipeData.length === 1) { + Q.fcall(this._handler.sendPipeData.bind(this._handler), + args.buff + ).then(function(result) { + var result_obj = new IClientRPCService_sendPipeData_result({success: result}); + output.writeMessageBegin("sendPipeData", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("sendPipeData", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.sendPipeData(args.buff, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_sendPipeData_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("sendPipeData", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("sendPipeData", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_sendFile = function(seqid, input, output) { + var args = new IClientRPCService_sendFile_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.sendFile.length === 2) { + Q.fcall(this._handler.sendFile.bind(this._handler), + args.metaInfo, + args.buff + ).then(function(result) { + var result_obj = new IClientRPCService_sendFile_result({success: result}); + output.writeMessageBegin("sendFile", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("sendFile", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.sendFile(args.metaInfo, args.buff, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_sendFile_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("sendFile", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("sendFile", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_pipeTransfer = function(seqid, input, output) { + var args = new IClientRPCService_pipeTransfer_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.pipeTransfer.length === 1) { + Q.fcall(this._handler.pipeTransfer.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_pipeTransfer_result({success: result}); + output.writeMessageBegin("pipeTransfer", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pipeTransfer", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.pipeTransfer(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_pipeTransfer_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("pipeTransfer", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pipeTransfer", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_pipeSubscribe = function(seqid, input, output) { + var args = new IClientRPCService_pipeSubscribe_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.pipeSubscribe.length === 1) { + Q.fcall(this._handler.pipeSubscribe.bind(this._handler), + args.req + ).then(function(result) { + var result_obj = new IClientRPCService_pipeSubscribe_result({success: result}); + output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.pipeSubscribe(args.req, function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_pipeSubscribe_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_getBackupConfiguration = function(seqid, input, output) { + var args = new IClientRPCService_getBackupConfiguration_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.getBackupConfiguration.length === 0) { + Q.fcall(this._handler.getBackupConfiguration.bind(this._handler) + ).then(function(result) { + var result_obj = new IClientRPCService_getBackupConfiguration_result({success: result}); + output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.getBackupConfiguration(function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_getBackupConfiguration_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_fetchAllConnectionsInfo = function(seqid, input, output) { + var args = new IClientRPCService_fetchAllConnectionsInfo_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.fetchAllConnectionsInfo.length === 0) { + Q.fcall(this._handler.fetchAllConnectionsInfo.bind(this._handler) + ).then(function(result) { + var result_obj = new IClientRPCService_fetchAllConnectionsInfo_result({success: result}); + output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.fetchAllConnectionsInfo(function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_fetchAllConnectionsInfo_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; +IClientRPCServiceProcessor.prototype.process_testConnectionEmptyRPC = function(seqid, input, output) { + var args = new IClientRPCService_testConnectionEmptyRPC_args(); + args.read(input); + input.readMessageEnd(); + if (this._handler.testConnectionEmptyRPC.length === 0) { + Q.fcall(this._handler.testConnectionEmptyRPC.bind(this._handler) + ).then(function(result) { + var result_obj = new IClientRPCService_testConnectionEmptyRPC_result({success: result}); + output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.REPLY, seqid); + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }).catch(function (err) { + var result; + result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.EXCEPTION, seqid); + result.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } else { + this._handler.testConnectionEmptyRPC(function (err, result) { + var result_obj; + if ((err === null || typeof err === 'undefined')) { + result_obj = new IClientRPCService_testConnectionEmptyRPC_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.REPLY, seqid); + } else { + result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); + output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.EXCEPTION, seqid); + } + result_obj.write(output); + output.writeMessageEnd(); + output.flush(); + }); + } +}; diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js b/cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js new file mode 100644 index 0000000..018aec1 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js @@ -0,0 +1,7961 @@ +// +// Autogenerated by Thrift Compiler (0.14.1) +// +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +// +"use strict"; + +var thrift = require('thrift'); +var Thrift = thrift.Thrift; +var Q = thrift.Q; +var Int64 = require('node-int64'); + +var common_ttypes = require('./common_types'); + + +var ttypes = module.exports = {}; +ttypes.TSProtocolVersion = { + 'IOTDB_SERVICE_PROTOCOL_V1' : 0, + 'IOTDB_SERVICE_PROTOCOL_V2' : 1, + 'IOTDB_SERVICE_PROTOCOL_V3' : 2 +}; +ttypes.TSConnectionType = { + 'THRIFT_BASED' : 0, + 'MQTT_BASED' : 1, + 'INTERNAL' : 2, + 'REST_BASED' : 3 +}; +var TSQueryDataSet = module.exports.TSQueryDataSet = function(args) { + this.time = null; + this.valueList = null; + this.bitmapList = null; + if (args) { + if (args.time !== undefined && args.time !== null) { + this.time = args.time; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field time is unset!'); + } + if (args.valueList !== undefined && args.valueList !== null) { + this.valueList = Thrift.copyList(args.valueList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valueList is unset!'); + } + if (args.bitmapList !== undefined && args.bitmapList !== null) { + this.bitmapList = Thrift.copyList(args.bitmapList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field bitmapList is unset!'); + } + } +}; +TSQueryDataSet.prototype = {}; +TSQueryDataSet.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.time = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.valueList = []; + var _rtmp31 = input.readListBegin(); + var _size0 = _rtmp31.size || 0; + for (var _i2 = 0; _i2 < _size0; ++_i2) { + var elem3 = null; + elem3 = input.readBinary(); + this.valueList.push(elem3); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.bitmapList = []; + var _rtmp35 = input.readListBegin(); + var _size4 = _rtmp35.size || 0; + for (var _i6 = 0; _i6 < _size4; ++_i6) { + var elem7 = null; + elem7 = input.readBinary(); + this.bitmapList.push(elem7); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSQueryDataSet.prototype.write = function(output) { + output.writeStructBegin('TSQueryDataSet'); + if (this.time !== null && this.time !== undefined) { + output.writeFieldBegin('time', Thrift.Type.STRING, 1); + output.writeBinary(this.time); + output.writeFieldEnd(); + } + if (this.valueList !== null && this.valueList !== undefined) { + output.writeFieldBegin('valueList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.valueList.length); + for (var iter8 in this.valueList) { + if (this.valueList.hasOwnProperty(iter8)) { + iter8 = this.valueList[iter8]; + output.writeBinary(iter8); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.bitmapList !== null && this.bitmapList !== undefined) { + output.writeFieldBegin('bitmapList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.bitmapList.length); + for (var iter9 in this.bitmapList) { + if (this.bitmapList.hasOwnProperty(iter9)) { + iter9 = this.bitmapList[iter9]; + output.writeBinary(iter9); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSQueryNonAlignDataSet = module.exports.TSQueryNonAlignDataSet = function(args) { + this.timeList = null; + this.valueList = null; + if (args) { + if (args.timeList !== undefined && args.timeList !== null) { + this.timeList = Thrift.copyList(args.timeList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeList is unset!'); + } + if (args.valueList !== undefined && args.valueList !== null) { + this.valueList = Thrift.copyList(args.valueList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valueList is unset!'); + } + } +}; +TSQueryNonAlignDataSet.prototype = {}; +TSQueryNonAlignDataSet.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.timeList = []; + var _rtmp311 = input.readListBegin(); + var _size10 = _rtmp311.size || 0; + for (var _i12 = 0; _i12 < _size10; ++_i12) { + var elem13 = null; + elem13 = input.readBinary(); + this.timeList.push(elem13); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.valueList = []; + var _rtmp315 = input.readListBegin(); + var _size14 = _rtmp315.size || 0; + for (var _i16 = 0; _i16 < _size14; ++_i16) { + var elem17 = null; + elem17 = input.readBinary(); + this.valueList.push(elem17); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSQueryNonAlignDataSet.prototype.write = function(output) { + output.writeStructBegin('TSQueryNonAlignDataSet'); + if (this.timeList !== null && this.timeList !== undefined) { + output.writeFieldBegin('timeList', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.timeList.length); + for (var iter18 in this.timeList) { + if (this.timeList.hasOwnProperty(iter18)) { + iter18 = this.timeList[iter18]; + output.writeBinary(iter18); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valueList !== null && this.valueList !== undefined) { + output.writeFieldBegin('valueList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.valueList.length); + for (var iter19 in this.valueList) { + if (this.valueList.hasOwnProperty(iter19)) { + iter19 = this.valueList[iter19]; + output.writeBinary(iter19); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSTracingInfo = module.exports.TSTracingInfo = function(args) { + this.activityList = null; + this.elapsedTimeList = null; + this.seriesPathNum = null; + this.seqFileNum = null; + this.unSeqFileNum = null; + this.sequenceChunkNum = null; + this.sequenceChunkPointNum = null; + this.unsequenceChunkNum = null; + this.unsequenceChunkPointNum = null; + this.totalPageNum = null; + this.overlappedPageNum = null; + if (args) { + if (args.activityList !== undefined && args.activityList !== null) { + this.activityList = Thrift.copyList(args.activityList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field activityList is unset!'); + } + if (args.elapsedTimeList !== undefined && args.elapsedTimeList !== null) { + this.elapsedTimeList = Thrift.copyList(args.elapsedTimeList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field elapsedTimeList is unset!'); + } + if (args.seriesPathNum !== undefined && args.seriesPathNum !== null) { + this.seriesPathNum = args.seriesPathNum; + } + if (args.seqFileNum !== undefined && args.seqFileNum !== null) { + this.seqFileNum = args.seqFileNum; + } + if (args.unSeqFileNum !== undefined && args.unSeqFileNum !== null) { + this.unSeqFileNum = args.unSeqFileNum; + } + if (args.sequenceChunkNum !== undefined && args.sequenceChunkNum !== null) { + this.sequenceChunkNum = args.sequenceChunkNum; + } + if (args.sequenceChunkPointNum !== undefined && args.sequenceChunkPointNum !== null) { + this.sequenceChunkPointNum = args.sequenceChunkPointNum; + } + if (args.unsequenceChunkNum !== undefined && args.unsequenceChunkNum !== null) { + this.unsequenceChunkNum = args.unsequenceChunkNum; + } + if (args.unsequenceChunkPointNum !== undefined && args.unsequenceChunkPointNum !== null) { + this.unsequenceChunkPointNum = args.unsequenceChunkPointNum; + } + if (args.totalPageNum !== undefined && args.totalPageNum !== null) { + this.totalPageNum = args.totalPageNum; + } + if (args.overlappedPageNum !== undefined && args.overlappedPageNum !== null) { + this.overlappedPageNum = args.overlappedPageNum; + } + } +}; +TSTracingInfo.prototype = {}; +TSTracingInfo.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.activityList = []; + var _rtmp321 = input.readListBegin(); + var _size20 = _rtmp321.size || 0; + for (var _i22 = 0; _i22 < _size20; ++_i22) { + var elem23 = null; + elem23 = input.readString(); + this.activityList.push(elem23); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.elapsedTimeList = []; + var _rtmp325 = input.readListBegin(); + var _size24 = _rtmp325.size || 0; + for (var _i26 = 0; _i26 < _size24; ++_i26) { + var elem27 = null; + elem27 = input.readI64(); + this.elapsedTimeList.push(elem27); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.seriesPathNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.seqFileNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.unSeqFileNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I32) { + this.sequenceChunkNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.I64) { + this.sequenceChunkPointNum = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.I32) { + this.unsequenceChunkNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I64) { + this.unsequenceChunkPointNum = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.I32) { + this.totalPageNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 11: + if (ftype == Thrift.Type.I32) { + this.overlappedPageNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSTracingInfo.prototype.write = function(output) { + output.writeStructBegin('TSTracingInfo'); + if (this.activityList !== null && this.activityList !== undefined) { + output.writeFieldBegin('activityList', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.activityList.length); + for (var iter28 in this.activityList) { + if (this.activityList.hasOwnProperty(iter28)) { + iter28 = this.activityList[iter28]; + output.writeString(iter28); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.elapsedTimeList !== null && this.elapsedTimeList !== undefined) { + output.writeFieldBegin('elapsedTimeList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.I64, this.elapsedTimeList.length); + for (var iter29 in this.elapsedTimeList) { + if (this.elapsedTimeList.hasOwnProperty(iter29)) { + iter29 = this.elapsedTimeList[iter29]; + output.writeI64(iter29); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.seriesPathNum !== null && this.seriesPathNum !== undefined) { + output.writeFieldBegin('seriesPathNum', Thrift.Type.I32, 3); + output.writeI32(this.seriesPathNum); + output.writeFieldEnd(); + } + if (this.seqFileNum !== null && this.seqFileNum !== undefined) { + output.writeFieldBegin('seqFileNum', Thrift.Type.I32, 4); + output.writeI32(this.seqFileNum); + output.writeFieldEnd(); + } + if (this.unSeqFileNum !== null && this.unSeqFileNum !== undefined) { + output.writeFieldBegin('unSeqFileNum', Thrift.Type.I32, 5); + output.writeI32(this.unSeqFileNum); + output.writeFieldEnd(); + } + if (this.sequenceChunkNum !== null && this.sequenceChunkNum !== undefined) { + output.writeFieldBegin('sequenceChunkNum', Thrift.Type.I32, 6); + output.writeI32(this.sequenceChunkNum); + output.writeFieldEnd(); + } + if (this.sequenceChunkPointNum !== null && this.sequenceChunkPointNum !== undefined) { + output.writeFieldBegin('sequenceChunkPointNum', Thrift.Type.I64, 7); + output.writeI64(this.sequenceChunkPointNum); + output.writeFieldEnd(); + } + if (this.unsequenceChunkNum !== null && this.unsequenceChunkNum !== undefined) { + output.writeFieldBegin('unsequenceChunkNum', Thrift.Type.I32, 8); + output.writeI32(this.unsequenceChunkNum); + output.writeFieldEnd(); + } + if (this.unsequenceChunkPointNum !== null && this.unsequenceChunkPointNum !== undefined) { + output.writeFieldBegin('unsequenceChunkPointNum', Thrift.Type.I64, 9); + output.writeI64(this.unsequenceChunkPointNum); + output.writeFieldEnd(); + } + if (this.totalPageNum !== null && this.totalPageNum !== undefined) { + output.writeFieldBegin('totalPageNum', Thrift.Type.I32, 10); + output.writeI32(this.totalPageNum); + output.writeFieldEnd(); + } + if (this.overlappedPageNum !== null && this.overlappedPageNum !== undefined) { + output.writeFieldBegin('overlappedPageNum', Thrift.Type.I32, 11); + output.writeI32(this.overlappedPageNum); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSExecuteStatementResp = module.exports.TSExecuteStatementResp = function(args) { + this.status = null; + this.queryId = null; + this.columns = null; + this.operationType = null; + this.ignoreTimeStamp = null; + this.dataTypeList = null; + this.queryDataSet = null; + this.nonAlignQueryDataSet = null; + this.columnNameIndexMap = null; + this.sgColumns = null; + this.aliasColumns = null; + this.tracingInfo = null; + this.queryResult = null; + this.moreData = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } + if (args.columns !== undefined && args.columns !== null) { + this.columns = Thrift.copyList(args.columns, [null]); + } + if (args.operationType !== undefined && args.operationType !== null) { + this.operationType = args.operationType; + } + if (args.ignoreTimeStamp !== undefined && args.ignoreTimeStamp !== null) { + this.ignoreTimeStamp = args.ignoreTimeStamp; + } + if (args.dataTypeList !== undefined && args.dataTypeList !== null) { + this.dataTypeList = Thrift.copyList(args.dataTypeList, [null]); + } + if (args.queryDataSet !== undefined && args.queryDataSet !== null) { + this.queryDataSet = new ttypes.TSQueryDataSet(args.queryDataSet); + } + if (args.nonAlignQueryDataSet !== undefined && args.nonAlignQueryDataSet !== null) { + this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(args.nonAlignQueryDataSet); + } + if (args.columnNameIndexMap !== undefined && args.columnNameIndexMap !== null) { + this.columnNameIndexMap = Thrift.copyMap(args.columnNameIndexMap, [null]); + } + if (args.sgColumns !== undefined && args.sgColumns !== null) { + this.sgColumns = Thrift.copyList(args.sgColumns, [null]); + } + if (args.aliasColumns !== undefined && args.aliasColumns !== null) { + this.aliasColumns = Thrift.copyList(args.aliasColumns, [null]); + } + if (args.tracingInfo !== undefined && args.tracingInfo !== null) { + this.tracingInfo = new ttypes.TSTracingInfo(args.tracingInfo); + } + if (args.queryResult !== undefined && args.queryResult !== null) { + this.queryResult = Thrift.copyList(args.queryResult, [null]); + } + if (args.moreData !== undefined && args.moreData !== null) { + this.moreData = args.moreData; + } + } +}; +TSExecuteStatementResp.prototype = {}; +TSExecuteStatementResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.columns = []; + var _rtmp331 = input.readListBegin(); + var _size30 = _rtmp331.size || 0; + for (var _i32 = 0; _i32 < _size30; ++_i32) { + var elem33 = null; + elem33 = input.readString(); + this.columns.push(elem33); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.operationType = input.readString(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.BOOL) { + this.ignoreTimeStamp = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.dataTypeList = []; + var _rtmp335 = input.readListBegin(); + var _size34 = _rtmp335.size || 0; + for (var _i36 = 0; _i36 < _size34; ++_i36) { + var elem37 = null; + elem37 = input.readString(); + this.dataTypeList.push(elem37); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.STRUCT) { + this.queryDataSet = new ttypes.TSQueryDataSet(); + this.queryDataSet.read(input); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.STRUCT) { + this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(); + this.nonAlignQueryDataSet.read(input); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.MAP) { + this.columnNameIndexMap = {}; + var _rtmp339 = input.readMapBegin(); + var _size38 = _rtmp339.size || 0; + for (var _i40 = 0; _i40 < _size38; ++_i40) { + var key41 = null; + var val42 = null; + key41 = input.readString(); + val42 = input.readI32(); + this.columnNameIndexMap[key41] = val42; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.LIST) { + this.sgColumns = []; + var _rtmp344 = input.readListBegin(); + var _size43 = _rtmp344.size || 0; + for (var _i45 = 0; _i45 < _size43; ++_i45) { + var elem46 = null; + elem46 = input.readString(); + this.sgColumns.push(elem46); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 11: + if (ftype == Thrift.Type.LIST) { + this.aliasColumns = []; + var _rtmp348 = input.readListBegin(); + var _size47 = _rtmp348.size || 0; + for (var _i49 = 0; _i49 < _size47; ++_i49) { + var elem50 = null; + elem50 = input.readByte(); + this.aliasColumns.push(elem50); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 12: + if (ftype == Thrift.Type.STRUCT) { + this.tracingInfo = new ttypes.TSTracingInfo(); + this.tracingInfo.read(input); + } else { + input.skip(ftype); + } + break; + case 13: + if (ftype == Thrift.Type.LIST) { + this.queryResult = []; + var _rtmp352 = input.readListBegin(); + var _size51 = _rtmp352.size || 0; + for (var _i53 = 0; _i53 < _size51; ++_i53) { + var elem54 = null; + elem54 = input.readBinary(); + this.queryResult.push(elem54); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 14: + if (ftype == Thrift.Type.BOOL) { + this.moreData = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSExecuteStatementResp.prototype.write = function(output) { + output.writeStructBegin('TSExecuteStatementResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 2); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + if (this.columns !== null && this.columns !== undefined) { + output.writeFieldBegin('columns', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.columns.length); + for (var iter55 in this.columns) { + if (this.columns.hasOwnProperty(iter55)) { + iter55 = this.columns[iter55]; + output.writeString(iter55); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.operationType !== null && this.operationType !== undefined) { + output.writeFieldBegin('operationType', Thrift.Type.STRING, 4); + output.writeString(this.operationType); + output.writeFieldEnd(); + } + if (this.ignoreTimeStamp !== null && this.ignoreTimeStamp !== undefined) { + output.writeFieldBegin('ignoreTimeStamp', Thrift.Type.BOOL, 5); + output.writeBool(this.ignoreTimeStamp); + output.writeFieldEnd(); + } + if (this.dataTypeList !== null && this.dataTypeList !== undefined) { + output.writeFieldBegin('dataTypeList', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.STRING, this.dataTypeList.length); + for (var iter56 in this.dataTypeList) { + if (this.dataTypeList.hasOwnProperty(iter56)) { + iter56 = this.dataTypeList[iter56]; + output.writeString(iter56); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.queryDataSet !== null && this.queryDataSet !== undefined) { + output.writeFieldBegin('queryDataSet', Thrift.Type.STRUCT, 7); + this.queryDataSet.write(output); + output.writeFieldEnd(); + } + if (this.nonAlignQueryDataSet !== null && this.nonAlignQueryDataSet !== undefined) { + output.writeFieldBegin('nonAlignQueryDataSet', Thrift.Type.STRUCT, 8); + this.nonAlignQueryDataSet.write(output); + output.writeFieldEnd(); + } + if (this.columnNameIndexMap !== null && this.columnNameIndexMap !== undefined) { + output.writeFieldBegin('columnNameIndexMap', Thrift.Type.MAP, 9); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.I32, Thrift.objectLength(this.columnNameIndexMap)); + for (var kiter57 in this.columnNameIndexMap) { + if (this.columnNameIndexMap.hasOwnProperty(kiter57)) { + var viter58 = this.columnNameIndexMap[kiter57]; + output.writeString(kiter57); + output.writeI32(viter58); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.sgColumns !== null && this.sgColumns !== undefined) { + output.writeFieldBegin('sgColumns', Thrift.Type.LIST, 10); + output.writeListBegin(Thrift.Type.STRING, this.sgColumns.length); + for (var iter59 in this.sgColumns) { + if (this.sgColumns.hasOwnProperty(iter59)) { + iter59 = this.sgColumns[iter59]; + output.writeString(iter59); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.aliasColumns !== null && this.aliasColumns !== undefined) { + output.writeFieldBegin('aliasColumns', Thrift.Type.LIST, 11); + output.writeListBegin(Thrift.Type.BYTE, this.aliasColumns.length); + for (var iter60 in this.aliasColumns) { + if (this.aliasColumns.hasOwnProperty(iter60)) { + iter60 = this.aliasColumns[iter60]; + output.writeByte(iter60); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.tracingInfo !== null && this.tracingInfo !== undefined) { + output.writeFieldBegin('tracingInfo', Thrift.Type.STRUCT, 12); + this.tracingInfo.write(output); + output.writeFieldEnd(); + } + if (this.queryResult !== null && this.queryResult !== undefined) { + output.writeFieldBegin('queryResult', Thrift.Type.LIST, 13); + output.writeListBegin(Thrift.Type.STRING, this.queryResult.length); + for (var iter61 in this.queryResult) { + if (this.queryResult.hasOwnProperty(iter61)) { + iter61 = this.queryResult[iter61]; + output.writeBinary(iter61); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.moreData !== null && this.moreData !== undefined) { + output.writeFieldBegin('moreData', Thrift.Type.BOOL, 14); + output.writeBool(this.moreData); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSOpenSessionResp = module.exports.TSOpenSessionResp = function(args) { + this.status = null; + this.serverProtocolVersion = 0; + this.sessionId = null; + this.configuration = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.serverProtocolVersion !== undefined && args.serverProtocolVersion !== null) { + this.serverProtocolVersion = args.serverProtocolVersion; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serverProtocolVersion is unset!'); + } + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } + if (args.configuration !== undefined && args.configuration !== null) { + this.configuration = Thrift.copyMap(args.configuration, [null]); + } + } +}; +TSOpenSessionResp.prototype = {}; +TSOpenSessionResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.serverProtocolVersion = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.MAP) { + this.configuration = {}; + var _rtmp363 = input.readMapBegin(); + var _size62 = _rtmp363.size || 0; + for (var _i64 = 0; _i64 < _size62; ++_i64) { + var key65 = null; + var val66 = null; + key65 = input.readString(); + val66 = input.readString(); + this.configuration[key65] = val66; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSOpenSessionResp.prototype.write = function(output) { + output.writeStructBegin('TSOpenSessionResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.serverProtocolVersion !== null && this.serverProtocolVersion !== undefined) { + output.writeFieldBegin('serverProtocolVersion', Thrift.Type.I32, 2); + output.writeI32(this.serverProtocolVersion); + output.writeFieldEnd(); + } + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 3); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.configuration !== null && this.configuration !== undefined) { + output.writeFieldBegin('configuration', Thrift.Type.MAP, 4); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configuration)); + for (var kiter67 in this.configuration) { + if (this.configuration.hasOwnProperty(kiter67)) { + var viter68 = this.configuration[kiter67]; + output.writeString(kiter67); + output.writeString(viter68); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSOpenSessionReq = module.exports.TSOpenSessionReq = function(args) { + this.client_protocol = 2; + this.zoneId = null; + this.username = null; + this.password = null; + this.configuration = null; + if (args) { + if (args.client_protocol !== undefined && args.client_protocol !== null) { + this.client_protocol = args.client_protocol; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field client_protocol is unset!'); + } + if (args.zoneId !== undefined && args.zoneId !== null) { + this.zoneId = args.zoneId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field zoneId is unset!'); + } + if (args.username !== undefined && args.username !== null) { + this.username = args.username; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field username is unset!'); + } + if (args.password !== undefined && args.password !== null) { + this.password = args.password; + } + if (args.configuration !== undefined && args.configuration !== null) { + this.configuration = Thrift.copyMap(args.configuration, [null]); + } + } +}; +TSOpenSessionReq.prototype = {}; +TSOpenSessionReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.client_protocol = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.zoneId = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.username = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.password = input.readString(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.MAP) { + this.configuration = {}; + var _rtmp370 = input.readMapBegin(); + var _size69 = _rtmp370.size || 0; + for (var _i71 = 0; _i71 < _size69; ++_i71) { + var key72 = null; + var val73 = null; + key72 = input.readString(); + val73 = input.readString(); + this.configuration[key72] = val73; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSOpenSessionReq.prototype.write = function(output) { + output.writeStructBegin('TSOpenSessionReq'); + if (this.client_protocol !== null && this.client_protocol !== undefined) { + output.writeFieldBegin('client_protocol', Thrift.Type.I32, 1); + output.writeI32(this.client_protocol); + output.writeFieldEnd(); + } + if (this.zoneId !== null && this.zoneId !== undefined) { + output.writeFieldBegin('zoneId', Thrift.Type.STRING, 2); + output.writeString(this.zoneId); + output.writeFieldEnd(); + } + if (this.username !== null && this.username !== undefined) { + output.writeFieldBegin('username', Thrift.Type.STRING, 3); + output.writeString(this.username); + output.writeFieldEnd(); + } + if (this.password !== null && this.password !== undefined) { + output.writeFieldBegin('password', Thrift.Type.STRING, 4); + output.writeString(this.password); + output.writeFieldEnd(); + } + if (this.configuration !== null && this.configuration !== undefined) { + output.writeFieldBegin('configuration', Thrift.Type.MAP, 5); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configuration)); + for (var kiter74 in this.configuration) { + if (this.configuration.hasOwnProperty(kiter74)) { + var viter75 = this.configuration[kiter74]; + output.writeString(kiter74); + output.writeString(viter75); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCloseSessionReq = module.exports.TSCloseSessionReq = function(args) { + this.sessionId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + } +}; +TSCloseSessionReq.prototype = {}; +TSCloseSessionReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCloseSessionReq.prototype.write = function(output) { + output.writeStructBegin('TSCloseSessionReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSExecuteStatementReq = module.exports.TSExecuteStatementReq = function(args) { + this.sessionId = null; + this.statement = null; + this.statementId = null; + this.fetchSize = null; + this.timeout = null; + this.enableRedirectQuery = null; + this.jdbcQuery = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statement !== undefined && args.statement !== null) { + this.statement = args.statement; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statement is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { + this.enableRedirectQuery = args.enableRedirectQuery; + } + if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { + this.jdbcQuery = args.jdbcQuery; + } + } +}; +TSExecuteStatementReq.prototype = {}; +TSExecuteStatementReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.statement = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.enableRedirectQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.BOOL) { + this.jdbcQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSExecuteStatementReq.prototype.write = function(output) { + output.writeStructBegin('TSExecuteStatementReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statement !== null && this.statement !== undefined) { + output.writeFieldBegin('statement', Thrift.Type.STRING, 2); + output.writeString(this.statement); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 3); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 4); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 5); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { + output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 6); + output.writeBool(this.enableRedirectQuery); + output.writeFieldEnd(); + } + if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { + output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 7); + output.writeBool(this.jdbcQuery); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSExecuteBatchStatementReq = module.exports.TSExecuteBatchStatementReq = function(args) { + this.sessionId = null; + this.statements = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statements !== undefined && args.statements !== null) { + this.statements = Thrift.copyList(args.statements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statements is unset!'); + } + } +}; +TSExecuteBatchStatementReq.prototype = {}; +TSExecuteBatchStatementReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.statements = []; + var _rtmp377 = input.readListBegin(); + var _size76 = _rtmp377.size || 0; + for (var _i78 = 0; _i78 < _size76; ++_i78) { + var elem79 = null; + elem79 = input.readString(); + this.statements.push(elem79); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSExecuteBatchStatementReq.prototype.write = function(output) { + output.writeStructBegin('TSExecuteBatchStatementReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statements !== null && this.statements !== undefined) { + output.writeFieldBegin('statements', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.statements.length); + for (var iter80 in this.statements) { + if (this.statements.hasOwnProperty(iter80)) { + iter80 = this.statements[iter80]; + output.writeString(iter80); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSGetOperationStatusReq = module.exports.TSGetOperationStatusReq = function(args) { + this.sessionId = null; + this.queryId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); + } + } +}; +TSGetOperationStatusReq.prototype = {}; +TSGetOperationStatusReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSGetOperationStatusReq.prototype.write = function(output) { + output.writeStructBegin('TSGetOperationStatusReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 2); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCancelOperationReq = module.exports.TSCancelOperationReq = function(args) { + this.sessionId = null; + this.queryId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); + } + } +}; +TSCancelOperationReq.prototype = {}; +TSCancelOperationReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCancelOperationReq.prototype.write = function(output) { + output.writeStructBegin('TSCancelOperationReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 2); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCloseOperationReq = module.exports.TSCloseOperationReq = function(args) { + this.sessionId = null; + this.queryId = null; + this.statementId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } + } +}; +TSCloseOperationReq.prototype = {}; +TSCloseOperationReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCloseOperationReq.prototype.write = function(output) { + output.writeStructBegin('TSCloseOperationReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 2); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 3); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSFetchResultsReq = module.exports.TSFetchResultsReq = function(args) { + this.sessionId = null; + this.statement = null; + this.fetchSize = null; + this.queryId = null; + this.isAlign = null; + this.timeout = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statement !== undefined && args.statement !== null) { + this.statement = args.statement; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statement is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fetchSize is unset!'); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); + } + if (args.isAlign !== undefined && args.isAlign !== null) { + this.isAlign = args.isAlign; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAlign is unset!'); + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + } +}; +TSFetchResultsReq.prototype = {}; +TSFetchResultsReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.statement = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.BOOL) { + this.isAlign = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSFetchResultsReq.prototype.write = function(output) { + output.writeStructBegin('TSFetchResultsReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statement !== null && this.statement !== undefined) { + output.writeFieldBegin('statement', Thrift.Type.STRING, 2); + output.writeString(this.statement); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 4); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + if (this.isAlign !== null && this.isAlign !== undefined) { + output.writeFieldBegin('isAlign', Thrift.Type.BOOL, 5); + output.writeBool(this.isAlign); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 6); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSFetchResultsResp = module.exports.TSFetchResultsResp = function(args) { + this.status = null; + this.hasResultSet = null; + this.isAlign = null; + this.queryDataSet = null; + this.nonAlignQueryDataSet = null; + this.queryResult = null; + this.moreData = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.hasResultSet !== undefined && args.hasResultSet !== null) { + this.hasResultSet = args.hasResultSet; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field hasResultSet is unset!'); + } + if (args.isAlign !== undefined && args.isAlign !== null) { + this.isAlign = args.isAlign; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAlign is unset!'); + } + if (args.queryDataSet !== undefined && args.queryDataSet !== null) { + this.queryDataSet = new ttypes.TSQueryDataSet(args.queryDataSet); + } + if (args.nonAlignQueryDataSet !== undefined && args.nonAlignQueryDataSet !== null) { + this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(args.nonAlignQueryDataSet); + } + if (args.queryResult !== undefined && args.queryResult !== null) { + this.queryResult = Thrift.copyList(args.queryResult, [null]); + } + if (args.moreData !== undefined && args.moreData !== null) { + this.moreData = args.moreData; + } + } +}; +TSFetchResultsResp.prototype = {}; +TSFetchResultsResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.BOOL) { + this.hasResultSet = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.BOOL) { + this.isAlign = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRUCT) { + this.queryDataSet = new ttypes.TSQueryDataSet(); + this.queryDataSet.read(input); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.STRUCT) { + this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(); + this.nonAlignQueryDataSet.read(input); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.queryResult = []; + var _rtmp382 = input.readListBegin(); + var _size81 = _rtmp382.size || 0; + for (var _i83 = 0; _i83 < _size81; ++_i83) { + var elem84 = null; + elem84 = input.readBinary(); + this.queryResult.push(elem84); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.BOOL) { + this.moreData = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSFetchResultsResp.prototype.write = function(output) { + output.writeStructBegin('TSFetchResultsResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.hasResultSet !== null && this.hasResultSet !== undefined) { + output.writeFieldBegin('hasResultSet', Thrift.Type.BOOL, 2); + output.writeBool(this.hasResultSet); + output.writeFieldEnd(); + } + if (this.isAlign !== null && this.isAlign !== undefined) { + output.writeFieldBegin('isAlign', Thrift.Type.BOOL, 3); + output.writeBool(this.isAlign); + output.writeFieldEnd(); + } + if (this.queryDataSet !== null && this.queryDataSet !== undefined) { + output.writeFieldBegin('queryDataSet', Thrift.Type.STRUCT, 4); + this.queryDataSet.write(output); + output.writeFieldEnd(); + } + if (this.nonAlignQueryDataSet !== null && this.nonAlignQueryDataSet !== undefined) { + output.writeFieldBegin('nonAlignQueryDataSet', Thrift.Type.STRUCT, 5); + this.nonAlignQueryDataSet.write(output); + output.writeFieldEnd(); + } + if (this.queryResult !== null && this.queryResult !== undefined) { + output.writeFieldBegin('queryResult', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.STRING, this.queryResult.length); + for (var iter85 in this.queryResult) { + if (this.queryResult.hasOwnProperty(iter85)) { + iter85 = this.queryResult[iter85]; + output.writeBinary(iter85); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.moreData !== null && this.moreData !== undefined) { + output.writeFieldBegin('moreData', Thrift.Type.BOOL, 7); + output.writeBool(this.moreData); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSFetchMetadataResp = module.exports.TSFetchMetadataResp = function(args) { + this.status = null; + this.metadataInJson = null; + this.columnsList = null; + this.dataType = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.metadataInJson !== undefined && args.metadataInJson !== null) { + this.metadataInJson = args.metadataInJson; + } + if (args.columnsList !== undefined && args.columnsList !== null) { + this.columnsList = Thrift.copyList(args.columnsList, [null]); + } + if (args.dataType !== undefined && args.dataType !== null) { + this.dataType = args.dataType; + } + } +}; +TSFetchMetadataResp.prototype = {}; +TSFetchMetadataResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.metadataInJson = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.columnsList = []; + var _rtmp387 = input.readListBegin(); + var _size86 = _rtmp387.size || 0; + for (var _i88 = 0; _i88 < _size86; ++_i88) { + var elem89 = null; + elem89 = input.readString(); + this.columnsList.push(elem89); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.dataType = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSFetchMetadataResp.prototype.write = function(output) { + output.writeStructBegin('TSFetchMetadataResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.metadataInJson !== null && this.metadataInJson !== undefined) { + output.writeFieldBegin('metadataInJson', Thrift.Type.STRING, 2); + output.writeString(this.metadataInJson); + output.writeFieldEnd(); + } + if (this.columnsList !== null && this.columnsList !== undefined) { + output.writeFieldBegin('columnsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.columnsList.length); + for (var iter90 in this.columnsList) { + if (this.columnsList.hasOwnProperty(iter90)) { + iter90 = this.columnsList[iter90]; + output.writeString(iter90); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataType !== null && this.dataType !== undefined) { + output.writeFieldBegin('dataType', Thrift.Type.STRING, 4); + output.writeString(this.dataType); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSFetchMetadataReq = module.exports.TSFetchMetadataReq = function(args) { + this.sessionId = null; + this.type = null; + this.columnPath = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + if (args.columnPath !== undefined && args.columnPath !== null) { + this.columnPath = args.columnPath; + } + } +}; +TSFetchMetadataReq.prototype = {}; +TSFetchMetadataReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.type = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.columnPath = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSFetchMetadataReq.prototype.write = function(output) { + output.writeStructBegin('TSFetchMetadataReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.STRING, 2); + output.writeString(this.type); + output.writeFieldEnd(); + } + if (this.columnPath !== null && this.columnPath !== undefined) { + output.writeFieldBegin('columnPath', Thrift.Type.STRING, 3); + output.writeString(this.columnPath); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSGetTimeZoneResp = module.exports.TSGetTimeZoneResp = function(args) { + this.status = null; + this.timeZone = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.timeZone !== undefined && args.timeZone !== null) { + this.timeZone = args.timeZone; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeZone is unset!'); + } + } +}; +TSGetTimeZoneResp.prototype = {}; +TSGetTimeZoneResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.timeZone = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSGetTimeZoneResp.prototype.write = function(output) { + output.writeStructBegin('TSGetTimeZoneResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.timeZone !== null && this.timeZone !== undefined) { + output.writeFieldBegin('timeZone', Thrift.Type.STRING, 2); + output.writeString(this.timeZone); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSSetTimeZoneReq = module.exports.TSSetTimeZoneReq = function(args) { + this.sessionId = null; + this.timeZone = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.timeZone !== undefined && args.timeZone !== null) { + this.timeZone = args.timeZone; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeZone is unset!'); + } + } +}; +TSSetTimeZoneReq.prototype = {}; +TSSetTimeZoneReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.timeZone = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSSetTimeZoneReq.prototype.write = function(output) { + output.writeStructBegin('TSSetTimeZoneReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.timeZone !== null && this.timeZone !== undefined) { + output.writeFieldBegin('timeZone', Thrift.Type.STRING, 2); + output.writeString(this.timeZone); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertRecordReq = module.exports.TSInsertRecordReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurements = null; + this.values = null; + this.timestamp = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.values !== undefined && args.values !== null) { + this.values = args.values; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); + } + if (args.timestamp !== undefined && args.timestamp !== null) { + this.timestamp = args.timestamp; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamp is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertRecordReq.prototype = {}; +TSInsertRecordReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp392 = input.readListBegin(); + var _size91 = _rtmp392.size || 0; + for (var _i93 = 0; _i93 < _size91; ++_i93) { + var elem94 = null; + elem94 = input.readString(); + this.measurements.push(elem94); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.values = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.timestamp = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertRecordReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertRecordReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter95 in this.measurements) { + if (this.measurements.hasOwnProperty(iter95)) { + iter95 = this.measurements[iter95]; + output.writeString(iter95); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.values !== null && this.values !== undefined) { + output.writeFieldBegin('values', Thrift.Type.STRING, 4); + output.writeBinary(this.values); + output.writeFieldEnd(); + } + if (this.timestamp !== null && this.timestamp !== undefined) { + output.writeFieldBegin('timestamp', Thrift.Type.I64, 5); + output.writeI64(this.timestamp); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertStringRecordReq = module.exports.TSInsertStringRecordReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurements = null; + this.values = null; + this.timestamp = null; + this.isAligned = null; + this.timeout = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.values !== undefined && args.values !== null) { + this.values = Thrift.copyList(args.values, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); + } + if (args.timestamp !== undefined && args.timestamp !== null) { + this.timestamp = args.timestamp; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamp is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + } +}; +TSInsertStringRecordReq.prototype = {}; +TSInsertStringRecordReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp397 = input.readListBegin(); + var _size96 = _rtmp397.size || 0; + for (var _i98 = 0; _i98 < _size96; ++_i98) { + var elem99 = null; + elem99 = input.readString(); + this.measurements.push(elem99); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.values = []; + var _rtmp3101 = input.readListBegin(); + var _size100 = _rtmp3101.size || 0; + for (var _i102 = 0; _i102 < _size100; ++_i102) { + var elem103 = null; + elem103 = input.readString(); + this.values.push(elem103); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.timestamp = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertStringRecordReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertStringRecordReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter104 in this.measurements) { + if (this.measurements.hasOwnProperty(iter104)) { + iter104 = this.measurements[iter104]; + output.writeString(iter104); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.values !== null && this.values !== undefined) { + output.writeFieldBegin('values', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.values.length); + for (var iter105 in this.values) { + if (this.values.hasOwnProperty(iter105)) { + iter105 = this.values[iter105]; + output.writeString(iter105); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestamp !== null && this.timestamp !== undefined) { + output.writeFieldBegin('timestamp', Thrift.Type.I64, 5); + output.writeI64(this.timestamp); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 7); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertTabletReq = module.exports.TSInsertTabletReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurements = null; + this.values = null; + this.timestamps = null; + this.types = null; + this.size = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.values !== undefined && args.values !== null) { + this.values = args.values; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); + } + if (args.timestamps !== undefined && args.timestamps !== null) { + this.timestamps = args.timestamps; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); + } + if (args.types !== undefined && args.types !== null) { + this.types = Thrift.copyList(args.types, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field types is unset!'); + } + if (args.size !== undefined && args.size !== null) { + this.size = args.size; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field size is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertTabletReq.prototype = {}; +TSInsertTabletReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp3107 = input.readListBegin(); + var _size106 = _rtmp3107.size || 0; + for (var _i108 = 0; _i108 < _size106; ++_i108) { + var elem109 = null; + elem109 = input.readString(); + this.measurements.push(elem109); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.values = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.STRING) { + this.timestamps = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.types = []; + var _rtmp3111 = input.readListBegin(); + var _size110 = _rtmp3111.size || 0; + for (var _i112 = 0; _i112 < _size110; ++_i112) { + var elem113 = null; + elem113 = input.readI32(); + this.types.push(elem113); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.I32) { + this.size = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertTabletReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertTabletReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter114 in this.measurements) { + if (this.measurements.hasOwnProperty(iter114)) { + iter114 = this.measurements[iter114]; + output.writeString(iter114); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.values !== null && this.values !== undefined) { + output.writeFieldBegin('values', Thrift.Type.STRING, 4); + output.writeBinary(this.values); + output.writeFieldEnd(); + } + if (this.timestamps !== null && this.timestamps !== undefined) { + output.writeFieldBegin('timestamps', Thrift.Type.STRING, 5); + output.writeBinary(this.timestamps); + output.writeFieldEnd(); + } + if (this.types !== null && this.types !== undefined) { + output.writeFieldBegin('types', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.I32, this.types.length); + for (var iter115 in this.types) { + if (this.types.hasOwnProperty(iter115)) { + iter115 = this.types[iter115]; + output.writeI32(iter115); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.size !== null && this.size !== undefined) { + output.writeFieldBegin('size', Thrift.Type.I32, 7); + output.writeI32(this.size); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 8); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertTabletsReq = module.exports.TSInsertTabletsReq = function(args) { + this.sessionId = null; + this.prefixPaths = null; + this.measurementsList = null; + this.valuesList = null; + this.timestampsList = null; + this.typesList = null; + this.sizeList = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPaths !== undefined && args.prefixPaths !== null) { + this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); + } + if (args.measurementsList !== undefined && args.measurementsList !== null) { + this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); + } + if (args.valuesList !== undefined && args.valuesList !== null) { + this.valuesList = Thrift.copyList(args.valuesList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); + } + if (args.timestampsList !== undefined && args.timestampsList !== null) { + this.timestampsList = Thrift.copyList(args.timestampsList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestampsList is unset!'); + } + if (args.typesList !== undefined && args.typesList !== null) { + this.typesList = Thrift.copyList(args.typesList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field typesList is unset!'); + } + if (args.sizeList !== undefined && args.sizeList !== null) { + this.sizeList = Thrift.copyList(args.sizeList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sizeList is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertTabletsReq.prototype = {}; +TSInsertTabletsReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.prefixPaths = []; + var _rtmp3117 = input.readListBegin(); + var _size116 = _rtmp3117.size || 0; + for (var _i118 = 0; _i118 < _size116; ++_i118) { + var elem119 = null; + elem119 = input.readString(); + this.prefixPaths.push(elem119); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurementsList = []; + var _rtmp3121 = input.readListBegin(); + var _size120 = _rtmp3121.size || 0; + for (var _i122 = 0; _i122 < _size120; ++_i122) { + var elem123 = null; + elem123 = []; + var _rtmp3125 = input.readListBegin(); + var _size124 = _rtmp3125.size || 0; + for (var _i126 = 0; _i126 < _size124; ++_i126) { + var elem127 = null; + elem127 = input.readString(); + elem123.push(elem127); + } + input.readListEnd(); + this.measurementsList.push(elem123); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.valuesList = []; + var _rtmp3129 = input.readListBegin(); + var _size128 = _rtmp3129.size || 0; + for (var _i130 = 0; _i130 < _size128; ++_i130) { + var elem131 = null; + elem131 = input.readBinary(); + this.valuesList.push(elem131); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.timestampsList = []; + var _rtmp3133 = input.readListBegin(); + var _size132 = _rtmp3133.size || 0; + for (var _i134 = 0; _i134 < _size132; ++_i134) { + var elem135 = null; + elem135 = input.readBinary(); + this.timestampsList.push(elem135); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.typesList = []; + var _rtmp3137 = input.readListBegin(); + var _size136 = _rtmp3137.size || 0; + for (var _i138 = 0; _i138 < _size136; ++_i138) { + var elem139 = null; + elem139 = []; + var _rtmp3141 = input.readListBegin(); + var _size140 = _rtmp3141.size || 0; + for (var _i142 = 0; _i142 < _size140; ++_i142) { + var elem143 = null; + elem143 = input.readI32(); + elem139.push(elem143); + } + input.readListEnd(); + this.typesList.push(elem139); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.LIST) { + this.sizeList = []; + var _rtmp3145 = input.readListBegin(); + var _size144 = _rtmp3145.size || 0; + for (var _i146 = 0; _i146 < _size144; ++_i146) { + var elem147 = null; + elem147 = input.readI32(); + this.sizeList.push(elem147); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertTabletsReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertTabletsReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPaths !== null && this.prefixPaths !== undefined) { + output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); + for (var iter148 in this.prefixPaths) { + if (this.prefixPaths.hasOwnProperty(iter148)) { + iter148 = this.prefixPaths[iter148]; + output.writeString(iter148); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.measurementsList !== null && this.measurementsList !== undefined) { + output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); + for (var iter149 in this.measurementsList) { + if (this.measurementsList.hasOwnProperty(iter149)) { + iter149 = this.measurementsList[iter149]; + output.writeListBegin(Thrift.Type.STRING, iter149.length); + for (var iter150 in iter149) { + if (iter149.hasOwnProperty(iter150)) { + iter150 = iter149[iter150]; + output.writeString(iter150); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valuesList !== null && this.valuesList !== undefined) { + output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); + for (var iter151 in this.valuesList) { + if (this.valuesList.hasOwnProperty(iter151)) { + iter151 = this.valuesList[iter151]; + output.writeBinary(iter151); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestampsList !== null && this.timestampsList !== undefined) { + output.writeFieldBegin('timestampsList', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.STRING, this.timestampsList.length); + for (var iter152 in this.timestampsList) { + if (this.timestampsList.hasOwnProperty(iter152)) { + iter152 = this.timestampsList[iter152]; + output.writeBinary(iter152); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.typesList !== null && this.typesList !== undefined) { + output.writeFieldBegin('typesList', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.LIST, this.typesList.length); + for (var iter153 in this.typesList) { + if (this.typesList.hasOwnProperty(iter153)) { + iter153 = this.typesList[iter153]; + output.writeListBegin(Thrift.Type.I32, iter153.length); + for (var iter154 in iter153) { + if (iter153.hasOwnProperty(iter154)) { + iter154 = iter153[iter154]; + output.writeI32(iter154); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.sizeList !== null && this.sizeList !== undefined) { + output.writeFieldBegin('sizeList', Thrift.Type.LIST, 7); + output.writeListBegin(Thrift.Type.I32, this.sizeList.length); + for (var iter155 in this.sizeList) { + if (this.sizeList.hasOwnProperty(iter155)) { + iter155 = this.sizeList[iter155]; + output.writeI32(iter155); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 8); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertRecordsReq = module.exports.TSInsertRecordsReq = function(args) { + this.sessionId = null; + this.prefixPaths = null; + this.measurementsList = null; + this.valuesList = null; + this.timestamps = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPaths !== undefined && args.prefixPaths !== null) { + this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); + } + if (args.measurementsList !== undefined && args.measurementsList !== null) { + this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); + } + if (args.valuesList !== undefined && args.valuesList !== null) { + this.valuesList = Thrift.copyList(args.valuesList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); + } + if (args.timestamps !== undefined && args.timestamps !== null) { + this.timestamps = Thrift.copyList(args.timestamps, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertRecordsReq.prototype = {}; +TSInsertRecordsReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.prefixPaths = []; + var _rtmp3157 = input.readListBegin(); + var _size156 = _rtmp3157.size || 0; + for (var _i158 = 0; _i158 < _size156; ++_i158) { + var elem159 = null; + elem159 = input.readString(); + this.prefixPaths.push(elem159); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurementsList = []; + var _rtmp3161 = input.readListBegin(); + var _size160 = _rtmp3161.size || 0; + for (var _i162 = 0; _i162 < _size160; ++_i162) { + var elem163 = null; + elem163 = []; + var _rtmp3165 = input.readListBegin(); + var _size164 = _rtmp3165.size || 0; + for (var _i166 = 0; _i166 < _size164; ++_i166) { + var elem167 = null; + elem167 = input.readString(); + elem163.push(elem167); + } + input.readListEnd(); + this.measurementsList.push(elem163); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.valuesList = []; + var _rtmp3169 = input.readListBegin(); + var _size168 = _rtmp3169.size || 0; + for (var _i170 = 0; _i170 < _size168; ++_i170) { + var elem171 = null; + elem171 = input.readBinary(); + this.valuesList.push(elem171); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.timestamps = []; + var _rtmp3173 = input.readListBegin(); + var _size172 = _rtmp3173.size || 0; + for (var _i174 = 0; _i174 < _size172; ++_i174) { + var elem175 = null; + elem175 = input.readI64(); + this.timestamps.push(elem175); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertRecordsReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertRecordsReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPaths !== null && this.prefixPaths !== undefined) { + output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); + for (var iter176 in this.prefixPaths) { + if (this.prefixPaths.hasOwnProperty(iter176)) { + iter176 = this.prefixPaths[iter176]; + output.writeString(iter176); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.measurementsList !== null && this.measurementsList !== undefined) { + output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); + for (var iter177 in this.measurementsList) { + if (this.measurementsList.hasOwnProperty(iter177)) { + iter177 = this.measurementsList[iter177]; + output.writeListBegin(Thrift.Type.STRING, iter177.length); + for (var iter178 in iter177) { + if (iter177.hasOwnProperty(iter178)) { + iter178 = iter177[iter178]; + output.writeString(iter178); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valuesList !== null && this.valuesList !== undefined) { + output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); + for (var iter179 in this.valuesList) { + if (this.valuesList.hasOwnProperty(iter179)) { + iter179 = this.valuesList[iter179]; + output.writeBinary(iter179); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestamps !== null && this.timestamps !== undefined) { + output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I64, this.timestamps.length); + for (var iter180 in this.timestamps) { + if (this.timestamps.hasOwnProperty(iter180)) { + iter180 = this.timestamps[iter180]; + output.writeI64(iter180); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertRecordsOfOneDeviceReq = module.exports.TSInsertRecordsOfOneDeviceReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurementsList = null; + this.valuesList = null; + this.timestamps = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurementsList !== undefined && args.measurementsList !== null) { + this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); + } + if (args.valuesList !== undefined && args.valuesList !== null) { + this.valuesList = Thrift.copyList(args.valuesList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); + } + if (args.timestamps !== undefined && args.timestamps !== null) { + this.timestamps = Thrift.copyList(args.timestamps, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertRecordsOfOneDeviceReq.prototype = {}; +TSInsertRecordsOfOneDeviceReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurementsList = []; + var _rtmp3182 = input.readListBegin(); + var _size181 = _rtmp3182.size || 0; + for (var _i183 = 0; _i183 < _size181; ++_i183) { + var elem184 = null; + elem184 = []; + var _rtmp3186 = input.readListBegin(); + var _size185 = _rtmp3186.size || 0; + for (var _i187 = 0; _i187 < _size185; ++_i187) { + var elem188 = null; + elem188 = input.readString(); + elem184.push(elem188); + } + input.readListEnd(); + this.measurementsList.push(elem184); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.valuesList = []; + var _rtmp3190 = input.readListBegin(); + var _size189 = _rtmp3190.size || 0; + for (var _i191 = 0; _i191 < _size189; ++_i191) { + var elem192 = null; + elem192 = input.readBinary(); + this.valuesList.push(elem192); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.timestamps = []; + var _rtmp3194 = input.readListBegin(); + var _size193 = _rtmp3194.size || 0; + for (var _i195 = 0; _i195 < _size193; ++_i195) { + var elem196 = null; + elem196 = input.readI64(); + this.timestamps.push(elem196); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertRecordsOfOneDeviceReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertRecordsOfOneDeviceReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurementsList !== null && this.measurementsList !== undefined) { + output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); + for (var iter197 in this.measurementsList) { + if (this.measurementsList.hasOwnProperty(iter197)) { + iter197 = this.measurementsList[iter197]; + output.writeListBegin(Thrift.Type.STRING, iter197.length); + for (var iter198 in iter197) { + if (iter197.hasOwnProperty(iter198)) { + iter198 = iter197[iter198]; + output.writeString(iter198); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valuesList !== null && this.valuesList !== undefined) { + output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); + for (var iter199 in this.valuesList) { + if (this.valuesList.hasOwnProperty(iter199)) { + iter199 = this.valuesList[iter199]; + output.writeBinary(iter199); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestamps !== null && this.timestamps !== undefined) { + output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I64, this.timestamps.length); + for (var iter200 in this.timestamps) { + if (this.timestamps.hasOwnProperty(iter200)) { + iter200 = this.timestamps[iter200]; + output.writeI64(iter200); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertStringRecordsOfOneDeviceReq = module.exports.TSInsertStringRecordsOfOneDeviceReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurementsList = null; + this.valuesList = null; + this.timestamps = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurementsList !== undefined && args.measurementsList !== null) { + this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); + } + if (args.valuesList !== undefined && args.valuesList !== null) { + this.valuesList = Thrift.copyList(args.valuesList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); + } + if (args.timestamps !== undefined && args.timestamps !== null) { + this.timestamps = Thrift.copyList(args.timestamps, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertStringRecordsOfOneDeviceReq.prototype = {}; +TSInsertStringRecordsOfOneDeviceReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurementsList = []; + var _rtmp3202 = input.readListBegin(); + var _size201 = _rtmp3202.size || 0; + for (var _i203 = 0; _i203 < _size201; ++_i203) { + var elem204 = null; + elem204 = []; + var _rtmp3206 = input.readListBegin(); + var _size205 = _rtmp3206.size || 0; + for (var _i207 = 0; _i207 < _size205; ++_i207) { + var elem208 = null; + elem208 = input.readString(); + elem204.push(elem208); + } + input.readListEnd(); + this.measurementsList.push(elem204); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.valuesList = []; + var _rtmp3210 = input.readListBegin(); + var _size209 = _rtmp3210.size || 0; + for (var _i211 = 0; _i211 < _size209; ++_i211) { + var elem212 = null; + elem212 = []; + var _rtmp3214 = input.readListBegin(); + var _size213 = _rtmp3214.size || 0; + for (var _i215 = 0; _i215 < _size213; ++_i215) { + var elem216 = null; + elem216 = input.readString(); + elem212.push(elem216); + } + input.readListEnd(); + this.valuesList.push(elem212); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.timestamps = []; + var _rtmp3218 = input.readListBegin(); + var _size217 = _rtmp3218.size || 0; + for (var _i219 = 0; _i219 < _size217; ++_i219) { + var elem220 = null; + elem220 = input.readI64(); + this.timestamps.push(elem220); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertStringRecordsOfOneDeviceReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertStringRecordsOfOneDeviceReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurementsList !== null && this.measurementsList !== undefined) { + output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); + for (var iter221 in this.measurementsList) { + if (this.measurementsList.hasOwnProperty(iter221)) { + iter221 = this.measurementsList[iter221]; + output.writeListBegin(Thrift.Type.STRING, iter221.length); + for (var iter222 in iter221) { + if (iter221.hasOwnProperty(iter222)) { + iter222 = iter221[iter222]; + output.writeString(iter222); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valuesList !== null && this.valuesList !== undefined) { + output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.LIST, this.valuesList.length); + for (var iter223 in this.valuesList) { + if (this.valuesList.hasOwnProperty(iter223)) { + iter223 = this.valuesList[iter223]; + output.writeListBegin(Thrift.Type.STRING, iter223.length); + for (var iter224 in iter223) { + if (iter223.hasOwnProperty(iter224)) { + iter224 = iter223[iter224]; + output.writeString(iter224); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestamps !== null && this.timestamps !== undefined) { + output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I64, this.timestamps.length); + for (var iter225 in this.timestamps) { + if (this.timestamps.hasOwnProperty(iter225)) { + iter225 = this.timestamps[iter225]; + output.writeI64(iter225); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertStringRecordsReq = module.exports.TSInsertStringRecordsReq = function(args) { + this.sessionId = null; + this.prefixPaths = null; + this.measurementsList = null; + this.valuesList = null; + this.timestamps = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPaths !== undefined && args.prefixPaths !== null) { + this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); + } + if (args.measurementsList !== undefined && args.measurementsList !== null) { + this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); + } + if (args.valuesList !== undefined && args.valuesList !== null) { + this.valuesList = Thrift.copyList(args.valuesList, [Thrift.copyList, null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); + } + if (args.timestamps !== undefined && args.timestamps !== null) { + this.timestamps = Thrift.copyList(args.timestamps, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertStringRecordsReq.prototype = {}; +TSInsertStringRecordsReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.prefixPaths = []; + var _rtmp3227 = input.readListBegin(); + var _size226 = _rtmp3227.size || 0; + for (var _i228 = 0; _i228 < _size226; ++_i228) { + var elem229 = null; + elem229 = input.readString(); + this.prefixPaths.push(elem229); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurementsList = []; + var _rtmp3231 = input.readListBegin(); + var _size230 = _rtmp3231.size || 0; + for (var _i232 = 0; _i232 < _size230; ++_i232) { + var elem233 = null; + elem233 = []; + var _rtmp3235 = input.readListBegin(); + var _size234 = _rtmp3235.size || 0; + for (var _i236 = 0; _i236 < _size234; ++_i236) { + var elem237 = null; + elem237 = input.readString(); + elem233.push(elem237); + } + input.readListEnd(); + this.measurementsList.push(elem233); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.valuesList = []; + var _rtmp3239 = input.readListBegin(); + var _size238 = _rtmp3239.size || 0; + for (var _i240 = 0; _i240 < _size238; ++_i240) { + var elem241 = null; + elem241 = []; + var _rtmp3243 = input.readListBegin(); + var _size242 = _rtmp3243.size || 0; + for (var _i244 = 0; _i244 < _size242; ++_i244) { + var elem245 = null; + elem245 = input.readString(); + elem241.push(elem245); + } + input.readListEnd(); + this.valuesList.push(elem241); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.timestamps = []; + var _rtmp3247 = input.readListBegin(); + var _size246 = _rtmp3247.size || 0; + for (var _i248 = 0; _i248 < _size246; ++_i248) { + var elem249 = null; + elem249 = input.readI64(); + this.timestamps.push(elem249); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertStringRecordsReq.prototype.write = function(output) { + output.writeStructBegin('TSInsertStringRecordsReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPaths !== null && this.prefixPaths !== undefined) { + output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); + for (var iter250 in this.prefixPaths) { + if (this.prefixPaths.hasOwnProperty(iter250)) { + iter250 = this.prefixPaths[iter250]; + output.writeString(iter250); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.measurementsList !== null && this.measurementsList !== undefined) { + output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); + for (var iter251 in this.measurementsList) { + if (this.measurementsList.hasOwnProperty(iter251)) { + iter251 = this.measurementsList[iter251]; + output.writeListBegin(Thrift.Type.STRING, iter251.length); + for (var iter252 in iter251) { + if (iter251.hasOwnProperty(iter252)) { + iter252 = iter251[iter252]; + output.writeString(iter252); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.valuesList !== null && this.valuesList !== undefined) { + output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.LIST, this.valuesList.length); + for (var iter253 in this.valuesList) { + if (this.valuesList.hasOwnProperty(iter253)) { + iter253 = this.valuesList[iter253]; + output.writeListBegin(Thrift.Type.STRING, iter253.length); + for (var iter254 in iter253) { + if (iter253.hasOwnProperty(iter254)) { + iter254 = iter253[iter254]; + output.writeString(iter254); + } + } + output.writeListEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestamps !== null && this.timestamps !== undefined) { + output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I64, this.timestamps.length); + for (var iter255 in this.timestamps) { + if (this.timestamps.hasOwnProperty(iter255)) { + iter255 = this.timestamps[iter255]; + output.writeI64(iter255); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSDeleteDataReq = module.exports.TSDeleteDataReq = function(args) { + this.sessionId = null; + this.paths = null; + this.startTime = null; + this.endTime = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + if (args.startTime !== undefined && args.startTime !== null) { + this.startTime = args.startTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); + } + if (args.endTime !== undefined && args.endTime !== null) { + this.endTime = args.endTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endTime is unset!'); + } + } +}; +TSDeleteDataReq.prototype = {}; +TSDeleteDataReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp3257 = input.readListBegin(); + var _size256 = _rtmp3257.size || 0; + for (var _i258 = 0; _i258 < _size256; ++_i258) { + var elem259 = null; + elem259 = input.readString(); + this.paths.push(elem259); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.startTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I64) { + this.endTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSDeleteDataReq.prototype.write = function(output) { + output.writeStructBegin('TSDeleteDataReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter260 in this.paths) { + if (this.paths.hasOwnProperty(iter260)) { + iter260 = this.paths[iter260]; + output.writeString(iter260); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.startTime !== null && this.startTime !== undefined) { + output.writeFieldBegin('startTime', Thrift.Type.I64, 3); + output.writeI64(this.startTime); + output.writeFieldEnd(); + } + if (this.endTime !== null && this.endTime !== undefined) { + output.writeFieldBegin('endTime', Thrift.Type.I64, 4); + output.writeI64(this.endTime); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCreateTimeseriesReq = module.exports.TSCreateTimeseriesReq = function(args) { + this.sessionId = null; + this.path = null; + this.dataType = null; + this.encoding = null; + this.compressor = null; + this.props = null; + this.tags = null; + this.attributes = null; + this.measurementAlias = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.path !== undefined && args.path !== null) { + this.path = args.path; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field path is unset!'); + } + if (args.dataType !== undefined && args.dataType !== null) { + this.dataType = args.dataType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataType is unset!'); + } + if (args.encoding !== undefined && args.encoding !== null) { + this.encoding = args.encoding; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encoding is unset!'); + } + if (args.compressor !== undefined && args.compressor !== null) { + this.compressor = args.compressor; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressor is unset!'); + } + if (args.props !== undefined && args.props !== null) { + this.props = Thrift.copyMap(args.props, [null]); + } + if (args.tags !== undefined && args.tags !== null) { + this.tags = Thrift.copyMap(args.tags, [null]); + } + if (args.attributes !== undefined && args.attributes !== null) { + this.attributes = Thrift.copyMap(args.attributes, [null]); + } + if (args.measurementAlias !== undefined && args.measurementAlias !== null) { + this.measurementAlias = args.measurementAlias; + } + } +}; +TSCreateTimeseriesReq.prototype = {}; +TSCreateTimeseriesReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.path = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.dataType = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.encoding = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.compressor = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.MAP) { + this.props = {}; + var _rtmp3262 = input.readMapBegin(); + var _size261 = _rtmp3262.size || 0; + for (var _i263 = 0; _i263 < _size261; ++_i263) { + var key264 = null; + var val265 = null; + key264 = input.readString(); + val265 = input.readString(); + this.props[key264] = val265; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.MAP) { + this.tags = {}; + var _rtmp3267 = input.readMapBegin(); + var _size266 = _rtmp3267.size || 0; + for (var _i268 = 0; _i268 < _size266; ++_i268) { + var key269 = null; + var val270 = null; + key269 = input.readString(); + val270 = input.readString(); + this.tags[key269] = val270; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.MAP) { + this.attributes = {}; + var _rtmp3272 = input.readMapBegin(); + var _size271 = _rtmp3272.size || 0; + for (var _i273 = 0; _i273 < _size271; ++_i273) { + var key274 = null; + var val275 = null; + key274 = input.readString(); + val275 = input.readString(); + this.attributes[key274] = val275; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.STRING) { + this.measurementAlias = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCreateTimeseriesReq.prototype.write = function(output) { + output.writeStructBegin('TSCreateTimeseriesReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.path !== null && this.path !== undefined) { + output.writeFieldBegin('path', Thrift.Type.STRING, 2); + output.writeString(this.path); + output.writeFieldEnd(); + } + if (this.dataType !== null && this.dataType !== undefined) { + output.writeFieldBegin('dataType', Thrift.Type.I32, 3); + output.writeI32(this.dataType); + output.writeFieldEnd(); + } + if (this.encoding !== null && this.encoding !== undefined) { + output.writeFieldBegin('encoding', Thrift.Type.I32, 4); + output.writeI32(this.encoding); + output.writeFieldEnd(); + } + if (this.compressor !== null && this.compressor !== undefined) { + output.writeFieldBegin('compressor', Thrift.Type.I32, 5); + output.writeI32(this.compressor); + output.writeFieldEnd(); + } + if (this.props !== null && this.props !== undefined) { + output.writeFieldBegin('props', Thrift.Type.MAP, 6); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.props)); + for (var kiter276 in this.props) { + if (this.props.hasOwnProperty(kiter276)) { + var viter277 = this.props[kiter276]; + output.writeString(kiter276); + output.writeString(viter277); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.tags !== null && this.tags !== undefined) { + output.writeFieldBegin('tags', Thrift.Type.MAP, 7); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.tags)); + for (var kiter278 in this.tags) { + if (this.tags.hasOwnProperty(kiter278)) { + var viter279 = this.tags[kiter278]; + output.writeString(kiter278); + output.writeString(viter279); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.attributes !== null && this.attributes !== undefined) { + output.writeFieldBegin('attributes', Thrift.Type.MAP, 8); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.attributes)); + for (var kiter280 in this.attributes) { + if (this.attributes.hasOwnProperty(kiter280)) { + var viter281 = this.attributes[kiter280]; + output.writeString(kiter280); + output.writeString(viter281); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.measurementAlias !== null && this.measurementAlias !== undefined) { + output.writeFieldBegin('measurementAlias', Thrift.Type.STRING, 9); + output.writeString(this.measurementAlias); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCreateAlignedTimeseriesReq = module.exports.TSCreateAlignedTimeseriesReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurements = null; + this.dataTypes = null; + this.encodings = null; + this.compressors = null; + this.measurementAlias = null; + this.tagsList = null; + this.attributesList = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.dataTypes !== undefined && args.dataTypes !== null) { + this.dataTypes = Thrift.copyList(args.dataTypes, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); + } + if (args.encodings !== undefined && args.encodings !== null) { + this.encodings = Thrift.copyList(args.encodings, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); + } + if (args.compressors !== undefined && args.compressors !== null) { + this.compressors = Thrift.copyList(args.compressors, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); + } + if (args.measurementAlias !== undefined && args.measurementAlias !== null) { + this.measurementAlias = Thrift.copyList(args.measurementAlias, [null]); + } + if (args.tagsList !== undefined && args.tagsList !== null) { + this.tagsList = Thrift.copyList(args.tagsList, [Thrift.copyMap, null]); + } + if (args.attributesList !== undefined && args.attributesList !== null) { + this.attributesList = Thrift.copyList(args.attributesList, [Thrift.copyMap, null]); + } + } +}; +TSCreateAlignedTimeseriesReq.prototype = {}; +TSCreateAlignedTimeseriesReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp3283 = input.readListBegin(); + var _size282 = _rtmp3283.size || 0; + for (var _i284 = 0; _i284 < _size282; ++_i284) { + var elem285 = null; + elem285 = input.readString(); + this.measurements.push(elem285); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.dataTypes = []; + var _rtmp3287 = input.readListBegin(); + var _size286 = _rtmp3287.size || 0; + for (var _i288 = 0; _i288 < _size286; ++_i288) { + var elem289 = null; + elem289 = input.readI32(); + this.dataTypes.push(elem289); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.encodings = []; + var _rtmp3291 = input.readListBegin(); + var _size290 = _rtmp3291.size || 0; + for (var _i292 = 0; _i292 < _size290; ++_i292) { + var elem293 = null; + elem293 = input.readI32(); + this.encodings.push(elem293); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.compressors = []; + var _rtmp3295 = input.readListBegin(); + var _size294 = _rtmp3295.size || 0; + for (var _i296 = 0; _i296 < _size294; ++_i296) { + var elem297 = null; + elem297 = input.readI32(); + this.compressors.push(elem297); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.LIST) { + this.measurementAlias = []; + var _rtmp3299 = input.readListBegin(); + var _size298 = _rtmp3299.size || 0; + for (var _i300 = 0; _i300 < _size298; ++_i300) { + var elem301 = null; + elem301 = input.readString(); + this.measurementAlias.push(elem301); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.LIST) { + this.tagsList = []; + var _rtmp3303 = input.readListBegin(); + var _size302 = _rtmp3303.size || 0; + for (var _i304 = 0; _i304 < _size302; ++_i304) { + var elem305 = null; + elem305 = {}; + var _rtmp3307 = input.readMapBegin(); + var _size306 = _rtmp3307.size || 0; + for (var _i308 = 0; _i308 < _size306; ++_i308) { + var key309 = null; + var val310 = null; + key309 = input.readString(); + val310 = input.readString(); + elem305[key309] = val310; + } + input.readMapEnd(); + this.tagsList.push(elem305); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.LIST) { + this.attributesList = []; + var _rtmp3312 = input.readListBegin(); + var _size311 = _rtmp3312.size || 0; + for (var _i313 = 0; _i313 < _size311; ++_i313) { + var elem314 = null; + elem314 = {}; + var _rtmp3316 = input.readMapBegin(); + var _size315 = _rtmp3316.size || 0; + for (var _i317 = 0; _i317 < _size315; ++_i317) { + var key318 = null; + var val319 = null; + key318 = input.readString(); + val319 = input.readString(); + elem314[key318] = val319; + } + input.readMapEnd(); + this.attributesList.push(elem314); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCreateAlignedTimeseriesReq.prototype.write = function(output) { + output.writeStructBegin('TSCreateAlignedTimeseriesReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter320 in this.measurements) { + if (this.measurements.hasOwnProperty(iter320)) { + iter320 = this.measurements[iter320]; + output.writeString(iter320); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataTypes !== null && this.dataTypes !== undefined) { + output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); + for (var iter321 in this.dataTypes) { + if (this.dataTypes.hasOwnProperty(iter321)) { + iter321 = this.dataTypes[iter321]; + output.writeI32(iter321); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.encodings !== null && this.encodings !== undefined) { + output.writeFieldBegin('encodings', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I32, this.encodings.length); + for (var iter322 in this.encodings) { + if (this.encodings.hasOwnProperty(iter322)) { + iter322 = this.encodings[iter322]; + output.writeI32(iter322); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.compressors !== null && this.compressors !== undefined) { + output.writeFieldBegin('compressors', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.I32, this.compressors.length); + for (var iter323 in this.compressors) { + if (this.compressors.hasOwnProperty(iter323)) { + iter323 = this.compressors[iter323]; + output.writeI32(iter323); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.measurementAlias !== null && this.measurementAlias !== undefined) { + output.writeFieldBegin('measurementAlias', Thrift.Type.LIST, 7); + output.writeListBegin(Thrift.Type.STRING, this.measurementAlias.length); + for (var iter324 in this.measurementAlias) { + if (this.measurementAlias.hasOwnProperty(iter324)) { + iter324 = this.measurementAlias[iter324]; + output.writeString(iter324); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.tagsList !== null && this.tagsList !== undefined) { + output.writeFieldBegin('tagsList', Thrift.Type.LIST, 8); + output.writeListBegin(Thrift.Type.MAP, this.tagsList.length); + for (var iter325 in this.tagsList) { + if (this.tagsList.hasOwnProperty(iter325)) { + iter325 = this.tagsList[iter325]; + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter325)); + for (var kiter326 in iter325) { + if (iter325.hasOwnProperty(kiter326)) { + var viter327 = iter325[kiter326]; + output.writeString(kiter326); + output.writeString(viter327); + } + } + output.writeMapEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.attributesList !== null && this.attributesList !== undefined) { + output.writeFieldBegin('attributesList', Thrift.Type.LIST, 9); + output.writeListBegin(Thrift.Type.MAP, this.attributesList.length); + for (var iter328 in this.attributesList) { + if (this.attributesList.hasOwnProperty(iter328)) { + iter328 = this.attributesList[iter328]; + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter328)); + for (var kiter329 in iter328) { + if (iter328.hasOwnProperty(kiter329)) { + var viter330 = iter328[kiter329]; + output.writeString(kiter329); + output.writeString(viter330); + } + } + output.writeMapEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSRawDataQueryReq = module.exports.TSRawDataQueryReq = function(args) { + this.sessionId = null; + this.paths = null; + this.fetchSize = null; + this.startTime = null; + this.endTime = null; + this.statementId = null; + this.enableRedirectQuery = null; + this.jdbcQuery = null; + this.timeout = null; + this.legalPathNodes = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.startTime !== undefined && args.startTime !== null) { + this.startTime = args.startTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); + } + if (args.endTime !== undefined && args.endTime !== null) { + this.endTime = args.endTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endTime is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { + this.enableRedirectQuery = args.enableRedirectQuery; + } + if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { + this.jdbcQuery = args.jdbcQuery; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { + this.legalPathNodes = args.legalPathNodes; + } + } +}; +TSRawDataQueryReq.prototype = {}; +TSRawDataQueryReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp3332 = input.readListBegin(); + var _size331 = _rtmp3332.size || 0; + for (var _i333 = 0; _i333 < _size331; ++_i333) { + var elem334 = null; + elem334 = input.readString(); + this.paths.push(elem334); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I64) { + this.startTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.endTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.BOOL) { + this.enableRedirectQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.BOOL) { + this.jdbcQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.BOOL) { + this.legalPathNodes = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSRawDataQueryReq.prototype.write = function(output) { + output.writeStructBegin('TSRawDataQueryReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter335 in this.paths) { + if (this.paths.hasOwnProperty(iter335)) { + iter335 = this.paths[iter335]; + output.writeString(iter335); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.startTime !== null && this.startTime !== undefined) { + output.writeFieldBegin('startTime', Thrift.Type.I64, 4); + output.writeI64(this.startTime); + output.writeFieldEnd(); + } + if (this.endTime !== null && this.endTime !== undefined) { + output.writeFieldBegin('endTime', Thrift.Type.I64, 5); + output.writeI64(this.endTime); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 6); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { + output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 7); + output.writeBool(this.enableRedirectQuery); + output.writeFieldEnd(); + } + if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { + output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 8); + output.writeBool(this.jdbcQuery); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 9); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { + output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 10); + output.writeBool(this.legalPathNodes); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSLastDataQueryReq = module.exports.TSLastDataQueryReq = function(args) { + this.sessionId = null; + this.paths = null; + this.fetchSize = null; + this.time = null; + this.statementId = null; + this.enableRedirectQuery = null; + this.jdbcQuery = null; + this.timeout = null; + this.legalPathNodes = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.time !== undefined && args.time !== null) { + this.time = args.time; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field time is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { + this.enableRedirectQuery = args.enableRedirectQuery; + } + if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { + this.jdbcQuery = args.jdbcQuery; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { + this.legalPathNodes = args.legalPathNodes; + } + } +}; +TSLastDataQueryReq.prototype = {}; +TSLastDataQueryReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp3337 = input.readListBegin(); + var _size336 = _rtmp3337.size || 0; + for (var _i338 = 0; _i338 < _size336; ++_i338) { + var elem339 = null; + elem339 = input.readString(); + this.paths.push(elem339); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I64) { + this.time = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.enableRedirectQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.BOOL) { + this.jdbcQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.BOOL) { + this.legalPathNodes = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSLastDataQueryReq.prototype.write = function(output) { + output.writeStructBegin('TSLastDataQueryReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter340 in this.paths) { + if (this.paths.hasOwnProperty(iter340)) { + iter340 = this.paths[iter340]; + output.writeString(iter340); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.time !== null && this.time !== undefined) { + output.writeFieldBegin('time', Thrift.Type.I64, 4); + output.writeI64(this.time); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 5); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { + output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 6); + output.writeBool(this.enableRedirectQuery); + output.writeFieldEnd(); + } + if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { + output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 7); + output.writeBool(this.jdbcQuery); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 8); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { + output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 9); + output.writeBool(this.legalPathNodes); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSFastLastDataQueryForOneDeviceReq = module.exports.TSFastLastDataQueryForOneDeviceReq = function(args) { + this.sessionId = null; + this.db = null; + this.deviceId = null; + this.sensors = null; + this.fetchSize = null; + this.statementId = null; + this.enableRedirectQuery = null; + this.jdbcQuery = null; + this.timeout = null; + this.legalPathNodes = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.db !== undefined && args.db !== null) { + this.db = args.db; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field db is unset!'); + } + if (args.deviceId !== undefined && args.deviceId !== null) { + this.deviceId = args.deviceId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field deviceId is unset!'); + } + if (args.sensors !== undefined && args.sensors !== null) { + this.sensors = Thrift.copyList(args.sensors, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sensors is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { + this.enableRedirectQuery = args.enableRedirectQuery; + } + if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { + this.jdbcQuery = args.jdbcQuery; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { + this.legalPathNodes = args.legalPathNodes; + } + } +}; +TSFastLastDataQueryForOneDeviceReq.prototype = {}; +TSFastLastDataQueryForOneDeviceReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.db = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.deviceId = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.sensors = []; + var _rtmp3342 = input.readListBegin(); + var _size341 = _rtmp3342.size || 0; + for (var _i343 = 0; _i343 < _size341; ++_i343) { + var elem344 = null; + elem344 = input.readString(); + this.sensors.push(elem344); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.BOOL) { + this.enableRedirectQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.BOOL) { + this.jdbcQuery = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.BOOL) { + this.legalPathNodes = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSFastLastDataQueryForOneDeviceReq.prototype.write = function(output) { + output.writeStructBegin('TSFastLastDataQueryForOneDeviceReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.db !== null && this.db !== undefined) { + output.writeFieldBegin('db', Thrift.Type.STRING, 2); + output.writeString(this.db); + output.writeFieldEnd(); + } + if (this.deviceId !== null && this.deviceId !== undefined) { + output.writeFieldBegin('deviceId', Thrift.Type.STRING, 3); + output.writeString(this.deviceId); + output.writeFieldEnd(); + } + if (this.sensors !== null && this.sensors !== undefined) { + output.writeFieldBegin('sensors', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.sensors.length); + for (var iter345 in this.sensors) { + if (this.sensors.hasOwnProperty(iter345)) { + iter345 = this.sensors[iter345]; + output.writeString(iter345); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 5); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 6); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { + output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 7); + output.writeBool(this.enableRedirectQuery); + output.writeFieldEnd(); + } + if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { + output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 8); + output.writeBool(this.jdbcQuery); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 9); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { + output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 10); + output.writeBool(this.legalPathNodes); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSAggregationQueryReq = module.exports.TSAggregationQueryReq = function(args) { + this.sessionId = null; + this.statementId = null; + this.paths = null; + this.aggregations = null; + this.startTime = null; + this.endTime = null; + this.interval = null; + this.slidingStep = null; + this.fetchSize = null; + this.timeout = null; + this.legalPathNodes = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + if (args.aggregations !== undefined && args.aggregations !== null) { + this.aggregations = Thrift.copyList(args.aggregations, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field aggregations is unset!'); + } + if (args.startTime !== undefined && args.startTime !== null) { + this.startTime = args.startTime; + } + if (args.endTime !== undefined && args.endTime !== null) { + this.endTime = args.endTime; + } + if (args.interval !== undefined && args.interval !== null) { + this.interval = args.interval; + } + if (args.slidingStep !== undefined && args.slidingStep !== null) { + this.slidingStep = args.slidingStep; + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { + this.legalPathNodes = args.legalPathNodes; + } + } +}; +TSAggregationQueryReq.prototype = {}; +TSAggregationQueryReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp3347 = input.readListBegin(); + var _size346 = _rtmp3347.size || 0; + for (var _i348 = 0; _i348 < _size346; ++_i348) { + var elem349 = null; + elem349 = input.readString(); + this.paths.push(elem349); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.aggregations = []; + var _rtmp3351 = input.readListBegin(); + var _size350 = _rtmp3351.size || 0; + for (var _i352 = 0; _i352 < _size350; ++_i352) { + var elem353 = null; + elem353 = input.readI32(); + this.aggregations.push(elem353); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.startTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I64) { + this.endTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.I64) { + this.interval = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.I64) { + this.slidingStep = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 11: + if (ftype == Thrift.Type.BOOL) { + this.legalPathNodes = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSAggregationQueryReq.prototype.write = function(output) { + output.writeStructBegin('TSAggregationQueryReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 2); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter354 in this.paths) { + if (this.paths.hasOwnProperty(iter354)) { + iter354 = this.paths[iter354]; + output.writeString(iter354); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.aggregations !== null && this.aggregations !== undefined) { + output.writeFieldBegin('aggregations', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.I32, this.aggregations.length); + for (var iter355 in this.aggregations) { + if (this.aggregations.hasOwnProperty(iter355)) { + iter355 = this.aggregations[iter355]; + output.writeI32(iter355); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.startTime !== null && this.startTime !== undefined) { + output.writeFieldBegin('startTime', Thrift.Type.I64, 5); + output.writeI64(this.startTime); + output.writeFieldEnd(); + } + if (this.endTime !== null && this.endTime !== undefined) { + output.writeFieldBegin('endTime', Thrift.Type.I64, 6); + output.writeI64(this.endTime); + output.writeFieldEnd(); + } + if (this.interval !== null && this.interval !== undefined) { + output.writeFieldBegin('interval', Thrift.Type.I64, 7); + output.writeI64(this.interval); + output.writeFieldEnd(); + } + if (this.slidingStep !== null && this.slidingStep !== undefined) { + output.writeFieldBegin('slidingStep', Thrift.Type.I64, 8); + output.writeI64(this.slidingStep); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 9); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 10); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { + output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 11); + output.writeBool(this.legalPathNodes); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSGroupByQueryIntervalReq = module.exports.TSGroupByQueryIntervalReq = function(args) { + this.sessionId = null; + this.statementId = null; + this.device = null; + this.measurement = null; + this.dataType = null; + this.aggregationType = null; + this.database = null; + this.startTime = null; + this.endTime = null; + this.interval = null; + this.fetchSize = null; + this.timeout = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.device !== undefined && args.device !== null) { + this.device = args.device; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field device is unset!'); + } + if (args.measurement !== undefined && args.measurement !== null) { + this.measurement = args.measurement; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurement is unset!'); + } + if (args.dataType !== undefined && args.dataType !== null) { + this.dataType = args.dataType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataType is unset!'); + } + if (args.aggregationType !== undefined && args.aggregationType !== null) { + this.aggregationType = args.aggregationType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field aggregationType is unset!'); + } + if (args.database !== undefined && args.database !== null) { + this.database = args.database; + } + if (args.startTime !== undefined && args.startTime !== null) { + this.startTime = args.startTime; + } + if (args.endTime !== undefined && args.endTime !== null) { + this.endTime = args.endTime; + } + if (args.interval !== undefined && args.interval !== null) { + this.interval = args.interval; + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + } +}; +TSGroupByQueryIntervalReq.prototype = {}; +TSGroupByQueryIntervalReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.device = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.measurement = input.readString(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.dataType = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I32) { + this.aggregationType = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.STRING) { + this.database = input.readString(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.I64) { + this.startTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I64) { + this.endTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 10: + if (ftype == Thrift.Type.I64) { + this.interval = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 11: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 12: + if (ftype == Thrift.Type.I64) { + this.timeout = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSGroupByQueryIntervalReq.prototype.write = function(output) { + output.writeStructBegin('TSGroupByQueryIntervalReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 2); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.device !== null && this.device !== undefined) { + output.writeFieldBegin('device', Thrift.Type.STRING, 3); + output.writeString(this.device); + output.writeFieldEnd(); + } + if (this.measurement !== null && this.measurement !== undefined) { + output.writeFieldBegin('measurement', Thrift.Type.STRING, 4); + output.writeString(this.measurement); + output.writeFieldEnd(); + } + if (this.dataType !== null && this.dataType !== undefined) { + output.writeFieldBegin('dataType', Thrift.Type.I32, 5); + output.writeI32(this.dataType); + output.writeFieldEnd(); + } + if (this.aggregationType !== null && this.aggregationType !== undefined) { + output.writeFieldBegin('aggregationType', Thrift.Type.I32, 6); + output.writeI32(this.aggregationType); + output.writeFieldEnd(); + } + if (this.database !== null && this.database !== undefined) { + output.writeFieldBegin('database', Thrift.Type.STRING, 7); + output.writeString(this.database); + output.writeFieldEnd(); + } + if (this.startTime !== null && this.startTime !== undefined) { + output.writeFieldBegin('startTime', Thrift.Type.I64, 8); + output.writeI64(this.startTime); + output.writeFieldEnd(); + } + if (this.endTime !== null && this.endTime !== undefined) { + output.writeFieldBegin('endTime', Thrift.Type.I64, 9); + output.writeI64(this.endTime); + output.writeFieldEnd(); + } + if (this.interval !== null && this.interval !== undefined) { + output.writeFieldBegin('interval', Thrift.Type.I64, 10); + output.writeI64(this.interval); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 11); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I64, 12); + output.writeI64(this.timeout); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCreateMultiTimeseriesReq = module.exports.TSCreateMultiTimeseriesReq = function(args) { + this.sessionId = null; + this.paths = null; + this.dataTypes = null; + this.encodings = null; + this.compressors = null; + this.propsList = null; + this.tagsList = null; + this.attributesList = null; + this.measurementAliasList = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + if (args.dataTypes !== undefined && args.dataTypes !== null) { + this.dataTypes = Thrift.copyList(args.dataTypes, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); + } + if (args.encodings !== undefined && args.encodings !== null) { + this.encodings = Thrift.copyList(args.encodings, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); + } + if (args.compressors !== undefined && args.compressors !== null) { + this.compressors = Thrift.copyList(args.compressors, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); + } + if (args.propsList !== undefined && args.propsList !== null) { + this.propsList = Thrift.copyList(args.propsList, [Thrift.copyMap, null]); + } + if (args.tagsList !== undefined && args.tagsList !== null) { + this.tagsList = Thrift.copyList(args.tagsList, [Thrift.copyMap, null]); + } + if (args.attributesList !== undefined && args.attributesList !== null) { + this.attributesList = Thrift.copyList(args.attributesList, [Thrift.copyMap, null]); + } + if (args.measurementAliasList !== undefined && args.measurementAliasList !== null) { + this.measurementAliasList = Thrift.copyList(args.measurementAliasList, [null]); + } + } +}; +TSCreateMultiTimeseriesReq.prototype = {}; +TSCreateMultiTimeseriesReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp3357 = input.readListBegin(); + var _size356 = _rtmp3357.size || 0; + for (var _i358 = 0; _i358 < _size356; ++_i358) { + var elem359 = null; + elem359 = input.readString(); + this.paths.push(elem359); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.dataTypes = []; + var _rtmp3361 = input.readListBegin(); + var _size360 = _rtmp3361.size || 0; + for (var _i362 = 0; _i362 < _size360; ++_i362) { + var elem363 = null; + elem363 = input.readI32(); + this.dataTypes.push(elem363); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.encodings = []; + var _rtmp3365 = input.readListBegin(); + var _size364 = _rtmp3365.size || 0; + for (var _i366 = 0; _i366 < _size364; ++_i366) { + var elem367 = null; + elem367 = input.readI32(); + this.encodings.push(elem367); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.compressors = []; + var _rtmp3369 = input.readListBegin(); + var _size368 = _rtmp3369.size || 0; + for (var _i370 = 0; _i370 < _size368; ++_i370) { + var elem371 = null; + elem371 = input.readI32(); + this.compressors.push(elem371); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.propsList = []; + var _rtmp3373 = input.readListBegin(); + var _size372 = _rtmp3373.size || 0; + for (var _i374 = 0; _i374 < _size372; ++_i374) { + var elem375 = null; + elem375 = {}; + var _rtmp3377 = input.readMapBegin(); + var _size376 = _rtmp3377.size || 0; + for (var _i378 = 0; _i378 < _size376; ++_i378) { + var key379 = null; + var val380 = null; + key379 = input.readString(); + val380 = input.readString(); + elem375[key379] = val380; + } + input.readMapEnd(); + this.propsList.push(elem375); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.LIST) { + this.tagsList = []; + var _rtmp3382 = input.readListBegin(); + var _size381 = _rtmp3382.size || 0; + for (var _i383 = 0; _i383 < _size381; ++_i383) { + var elem384 = null; + elem384 = {}; + var _rtmp3386 = input.readMapBegin(); + var _size385 = _rtmp3386.size || 0; + for (var _i387 = 0; _i387 < _size385; ++_i387) { + var key388 = null; + var val389 = null; + key388 = input.readString(); + val389 = input.readString(); + elem384[key388] = val389; + } + input.readMapEnd(); + this.tagsList.push(elem384); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.LIST) { + this.attributesList = []; + var _rtmp3391 = input.readListBegin(); + var _size390 = _rtmp3391.size || 0; + for (var _i392 = 0; _i392 < _size390; ++_i392) { + var elem393 = null; + elem393 = {}; + var _rtmp3395 = input.readMapBegin(); + var _size394 = _rtmp3395.size || 0; + for (var _i396 = 0; _i396 < _size394; ++_i396) { + var key397 = null; + var val398 = null; + key397 = input.readString(); + val398 = input.readString(); + elem393[key397] = val398; + } + input.readMapEnd(); + this.attributesList.push(elem393); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.LIST) { + this.measurementAliasList = []; + var _rtmp3400 = input.readListBegin(); + var _size399 = _rtmp3400.size || 0; + for (var _i401 = 0; _i401 < _size399; ++_i401) { + var elem402 = null; + elem402 = input.readString(); + this.measurementAliasList.push(elem402); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCreateMultiTimeseriesReq.prototype.write = function(output) { + output.writeStructBegin('TSCreateMultiTimeseriesReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter403 in this.paths) { + if (this.paths.hasOwnProperty(iter403)) { + iter403 = this.paths[iter403]; + output.writeString(iter403); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataTypes !== null && this.dataTypes !== undefined) { + output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); + for (var iter404 in this.dataTypes) { + if (this.dataTypes.hasOwnProperty(iter404)) { + iter404 = this.dataTypes[iter404]; + output.writeI32(iter404); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.encodings !== null && this.encodings !== undefined) { + output.writeFieldBegin('encodings', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.I32, this.encodings.length); + for (var iter405 in this.encodings) { + if (this.encodings.hasOwnProperty(iter405)) { + iter405 = this.encodings[iter405]; + output.writeI32(iter405); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.compressors !== null && this.compressors !== undefined) { + output.writeFieldBegin('compressors', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I32, this.compressors.length); + for (var iter406 in this.compressors) { + if (this.compressors.hasOwnProperty(iter406)) { + iter406 = this.compressors[iter406]; + output.writeI32(iter406); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.propsList !== null && this.propsList !== undefined) { + output.writeFieldBegin('propsList', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.MAP, this.propsList.length); + for (var iter407 in this.propsList) { + if (this.propsList.hasOwnProperty(iter407)) { + iter407 = this.propsList[iter407]; + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter407)); + for (var kiter408 in iter407) { + if (iter407.hasOwnProperty(kiter408)) { + var viter409 = iter407[kiter408]; + output.writeString(kiter408); + output.writeString(viter409); + } + } + output.writeMapEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.tagsList !== null && this.tagsList !== undefined) { + output.writeFieldBegin('tagsList', Thrift.Type.LIST, 7); + output.writeListBegin(Thrift.Type.MAP, this.tagsList.length); + for (var iter410 in this.tagsList) { + if (this.tagsList.hasOwnProperty(iter410)) { + iter410 = this.tagsList[iter410]; + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter410)); + for (var kiter411 in iter410) { + if (iter410.hasOwnProperty(kiter411)) { + var viter412 = iter410[kiter411]; + output.writeString(kiter411); + output.writeString(viter412); + } + } + output.writeMapEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.attributesList !== null && this.attributesList !== undefined) { + output.writeFieldBegin('attributesList', Thrift.Type.LIST, 8); + output.writeListBegin(Thrift.Type.MAP, this.attributesList.length); + for (var iter413 in this.attributesList) { + if (this.attributesList.hasOwnProperty(iter413)) { + iter413 = this.attributesList[iter413]; + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter413)); + for (var kiter414 in iter413) { + if (iter413.hasOwnProperty(kiter414)) { + var viter415 = iter413[kiter414]; + output.writeString(kiter414); + output.writeString(viter415); + } + } + output.writeMapEnd(); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.measurementAliasList !== null && this.measurementAliasList !== undefined) { + output.writeFieldBegin('measurementAliasList', Thrift.Type.LIST, 9); + output.writeListBegin(Thrift.Type.STRING, this.measurementAliasList.length); + for (var iter416 in this.measurementAliasList) { + if (this.measurementAliasList.hasOwnProperty(iter416)) { + iter416 = this.measurementAliasList[iter416]; + output.writeString(iter416); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var ServerProperties = module.exports.ServerProperties = function(args) { + this.version = null; + this.supportedTimeAggregationOperations = null; + this.timestampPrecision = null; + this.maxConcurrentClientNum = null; + this.thriftMaxFrameSize = null; + this.isReadOnly = null; + this.buildInfo = null; + this.logo = null; + if (args) { + if (args.version !== undefined && args.version !== null) { + this.version = args.version; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); + } + if (args.supportedTimeAggregationOperations !== undefined && args.supportedTimeAggregationOperations !== null) { + this.supportedTimeAggregationOperations = Thrift.copyList(args.supportedTimeAggregationOperations, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field supportedTimeAggregationOperations is unset!'); + } + if (args.timestampPrecision !== undefined && args.timestampPrecision !== null) { + this.timestampPrecision = args.timestampPrecision; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestampPrecision is unset!'); + } + if (args.maxConcurrentClientNum !== undefined && args.maxConcurrentClientNum !== null) { + this.maxConcurrentClientNum = args.maxConcurrentClientNum; + } + if (args.thriftMaxFrameSize !== undefined && args.thriftMaxFrameSize !== null) { + this.thriftMaxFrameSize = args.thriftMaxFrameSize; + } + if (args.isReadOnly !== undefined && args.isReadOnly !== null) { + this.isReadOnly = args.isReadOnly; + } + if (args.buildInfo !== undefined && args.buildInfo !== null) { + this.buildInfo = args.buildInfo; + } + if (args.logo !== undefined && args.logo !== null) { + this.logo = args.logo; + } + } +}; +ServerProperties.prototype = {}; +ServerProperties.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.version = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.supportedTimeAggregationOperations = []; + var _rtmp3418 = input.readListBegin(); + var _size417 = _rtmp3418.size || 0; + for (var _i419 = 0; _i419 < _size417; ++_i419) { + var elem420 = null; + elem420 = input.readString(); + this.supportedTimeAggregationOperations.push(elem420); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.timestampPrecision = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.maxConcurrentClientNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.thriftMaxFrameSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isReadOnly = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.STRING) { + this.buildInfo = input.readString(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.STRING) { + this.logo = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +ServerProperties.prototype.write = function(output) { + output.writeStructBegin('ServerProperties'); + if (this.version !== null && this.version !== undefined) { + output.writeFieldBegin('version', Thrift.Type.STRING, 1); + output.writeString(this.version); + output.writeFieldEnd(); + } + if (this.supportedTimeAggregationOperations !== null && this.supportedTimeAggregationOperations !== undefined) { + output.writeFieldBegin('supportedTimeAggregationOperations', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.supportedTimeAggregationOperations.length); + for (var iter421 in this.supportedTimeAggregationOperations) { + if (this.supportedTimeAggregationOperations.hasOwnProperty(iter421)) { + iter421 = this.supportedTimeAggregationOperations[iter421]; + output.writeString(iter421); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.timestampPrecision !== null && this.timestampPrecision !== undefined) { + output.writeFieldBegin('timestampPrecision', Thrift.Type.STRING, 3); + output.writeString(this.timestampPrecision); + output.writeFieldEnd(); + } + if (this.maxConcurrentClientNum !== null && this.maxConcurrentClientNum !== undefined) { + output.writeFieldBegin('maxConcurrentClientNum', Thrift.Type.I32, 4); + output.writeI32(this.maxConcurrentClientNum); + output.writeFieldEnd(); + } + if (this.thriftMaxFrameSize !== null && this.thriftMaxFrameSize !== undefined) { + output.writeFieldBegin('thriftMaxFrameSize', Thrift.Type.I32, 5); + output.writeI32(this.thriftMaxFrameSize); + output.writeFieldEnd(); + } + if (this.isReadOnly !== null && this.isReadOnly !== undefined) { + output.writeFieldBegin('isReadOnly', Thrift.Type.BOOL, 6); + output.writeBool(this.isReadOnly); + output.writeFieldEnd(); + } + if (this.buildInfo !== null && this.buildInfo !== undefined) { + output.writeFieldBegin('buildInfo', Thrift.Type.STRING, 7); + output.writeString(this.buildInfo); + output.writeFieldEnd(); + } + if (this.logo !== null && this.logo !== undefined) { + output.writeFieldBegin('logo', Thrift.Type.STRING, 8); + output.writeString(this.logo); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSSetSchemaTemplateReq = module.exports.TSSetSchemaTemplateReq = function(args) { + this.sessionId = null; + this.templateName = null; + this.prefixPath = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.templateName !== undefined && args.templateName !== null) { + this.templateName = args.templateName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + } +}; +TSSetSchemaTemplateReq.prototype = {}; +TSSetSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.templateName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSSetSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSSetSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.templateName !== null && this.templateName !== undefined) { + output.writeFieldBegin('templateName', Thrift.Type.STRING, 2); + output.writeString(this.templateName); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 3); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCreateSchemaTemplateReq = module.exports.TSCreateSchemaTemplateReq = function(args) { + this.sessionId = null; + this.name = null; + this.serializedTemplate = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.name !== undefined && args.name !== null) { + this.name = args.name; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); + } + if (args.serializedTemplate !== undefined && args.serializedTemplate !== null) { + this.serializedTemplate = args.serializedTemplate; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serializedTemplate is unset!'); + } + } +}; +TSCreateSchemaTemplateReq.prototype = {}; +TSCreateSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.name = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.serializedTemplate = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCreateSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSCreateSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.name !== null && this.name !== undefined) { + output.writeFieldBegin('name', Thrift.Type.STRING, 2); + output.writeString(this.name); + output.writeFieldEnd(); + } + if (this.serializedTemplate !== null && this.serializedTemplate !== undefined) { + output.writeFieldBegin('serializedTemplate', Thrift.Type.STRING, 3); + output.writeBinary(this.serializedTemplate); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSAppendSchemaTemplateReq = module.exports.TSAppendSchemaTemplateReq = function(args) { + this.sessionId = null; + this.name = null; + this.isAligned = null; + this.measurements = null; + this.dataTypes = null; + this.encodings = null; + this.compressors = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.name !== undefined && args.name !== null) { + this.name = args.name; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAligned is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.dataTypes !== undefined && args.dataTypes !== null) { + this.dataTypes = Thrift.copyList(args.dataTypes, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); + } + if (args.encodings !== undefined && args.encodings !== null) { + this.encodings = Thrift.copyList(args.encodings, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); + } + if (args.compressors !== undefined && args.compressors !== null) { + this.compressors = Thrift.copyList(args.compressors, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); + } + } +}; +TSAppendSchemaTemplateReq.prototype = {}; +TSAppendSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.name = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp3423 = input.readListBegin(); + var _size422 = _rtmp3423.size || 0; + for (var _i424 = 0; _i424 < _size422; ++_i424) { + var elem425 = null; + elem425 = input.readString(); + this.measurements.push(elem425); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.dataTypes = []; + var _rtmp3427 = input.readListBegin(); + var _size426 = _rtmp3427.size || 0; + for (var _i428 = 0; _i428 < _size426; ++_i428) { + var elem429 = null; + elem429 = input.readI32(); + this.dataTypes.push(elem429); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.LIST) { + this.encodings = []; + var _rtmp3431 = input.readListBegin(); + var _size430 = _rtmp3431.size || 0; + for (var _i432 = 0; _i432 < _size430; ++_i432) { + var elem433 = null; + elem433 = input.readI32(); + this.encodings.push(elem433); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.LIST) { + this.compressors = []; + var _rtmp3435 = input.readListBegin(); + var _size434 = _rtmp3435.size || 0; + for (var _i436 = 0; _i436 < _size434; ++_i436) { + var elem437 = null; + elem437 = input.readI32(); + this.compressors.push(elem437); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSAppendSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSAppendSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.name !== null && this.name !== undefined) { + output.writeFieldBegin('name', Thrift.Type.STRING, 2); + output.writeString(this.name); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 3); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter438 in this.measurements) { + if (this.measurements.hasOwnProperty(iter438)) { + iter438 = this.measurements[iter438]; + output.writeString(iter438); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataTypes !== null && this.dataTypes !== undefined) { + output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); + for (var iter439 in this.dataTypes) { + if (this.dataTypes.hasOwnProperty(iter439)) { + iter439 = this.dataTypes[iter439]; + output.writeI32(iter439); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.encodings !== null && this.encodings !== undefined) { + output.writeFieldBegin('encodings', Thrift.Type.LIST, 6); + output.writeListBegin(Thrift.Type.I32, this.encodings.length); + for (var iter440 in this.encodings) { + if (this.encodings.hasOwnProperty(iter440)) { + iter440 = this.encodings[iter440]; + output.writeI32(iter440); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.compressors !== null && this.compressors !== undefined) { + output.writeFieldBegin('compressors', Thrift.Type.LIST, 7); + output.writeListBegin(Thrift.Type.I32, this.compressors.length); + for (var iter441 in this.compressors) { + if (this.compressors.hasOwnProperty(iter441)) { + iter441 = this.compressors[iter441]; + output.writeI32(iter441); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSPruneSchemaTemplateReq = module.exports.TSPruneSchemaTemplateReq = function(args) { + this.sessionId = null; + this.name = null; + this.path = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.name !== undefined && args.name !== null) { + this.name = args.name; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); + } + if (args.path !== undefined && args.path !== null) { + this.path = args.path; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field path is unset!'); + } + } +}; +TSPruneSchemaTemplateReq.prototype = {}; +TSPruneSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.name = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.path = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSPruneSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSPruneSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.name !== null && this.name !== undefined) { + output.writeFieldBegin('name', Thrift.Type.STRING, 2); + output.writeString(this.name); + output.writeFieldEnd(); + } + if (this.path !== null && this.path !== undefined) { + output.writeFieldBegin('path', Thrift.Type.STRING, 3); + output.writeString(this.path); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSQueryTemplateReq = module.exports.TSQueryTemplateReq = function(args) { + this.sessionId = null; + this.name = null; + this.queryType = null; + this.measurement = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.name !== undefined && args.name !== null) { + this.name = args.name; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); + } + if (args.queryType !== undefined && args.queryType !== null) { + this.queryType = args.queryType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryType is unset!'); + } + if (args.measurement !== undefined && args.measurement !== null) { + this.measurement = args.measurement; + } + } +}; +TSQueryTemplateReq.prototype = {}; +TSQueryTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.name = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.queryType = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.measurement = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSQueryTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSQueryTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.name !== null && this.name !== undefined) { + output.writeFieldBegin('name', Thrift.Type.STRING, 2); + output.writeString(this.name); + output.writeFieldEnd(); + } + if (this.queryType !== null && this.queryType !== undefined) { + output.writeFieldBegin('queryType', Thrift.Type.I32, 3); + output.writeI32(this.queryType); + output.writeFieldEnd(); + } + if (this.measurement !== null && this.measurement !== undefined) { + output.writeFieldBegin('measurement', Thrift.Type.STRING, 4); + output.writeString(this.measurement); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSQueryTemplateResp = module.exports.TSQueryTemplateResp = function(args) { + this.status = null; + this.queryType = null; + this.result = null; + this.count = null; + this.measurements = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.queryType !== undefined && args.queryType !== null) { + this.queryType = args.queryType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryType is unset!'); + } + if (args.result !== undefined && args.result !== null) { + this.result = args.result; + } + if (args.count !== undefined && args.count !== null) { + this.count = args.count; + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } + } +}; +TSQueryTemplateResp.prototype = {}; +TSQueryTemplateResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.queryType = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.BOOL) { + this.result = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.count = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp3443 = input.readListBegin(); + var _size442 = _rtmp3443.size || 0; + for (var _i444 = 0; _i444 < _size442; ++_i444) { + var elem445 = null; + elem445 = input.readString(); + this.measurements.push(elem445); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSQueryTemplateResp.prototype.write = function(output) { + output.writeStructBegin('TSQueryTemplateResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.queryType !== null && this.queryType !== undefined) { + output.writeFieldBegin('queryType', Thrift.Type.I32, 2); + output.writeI32(this.queryType); + output.writeFieldEnd(); + } + if (this.result !== null && this.result !== undefined) { + output.writeFieldBegin('result', Thrift.Type.BOOL, 3); + output.writeBool(this.result); + output.writeFieldEnd(); + } + if (this.count !== null && this.count !== undefined) { + output.writeFieldBegin('count', Thrift.Type.I32, 4); + output.writeI32(this.count); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 5); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter446 in this.measurements) { + if (this.measurements.hasOwnProperty(iter446)) { + iter446 = this.measurements[iter446]; + output.writeString(iter446); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSUnsetSchemaTemplateReq = module.exports.TSUnsetSchemaTemplateReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.templateName = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.templateName !== undefined && args.templateName !== null) { + this.templateName = args.templateName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); + } + } +}; +TSUnsetSchemaTemplateReq.prototype = {}; +TSUnsetSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.templateName = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSUnsetSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSUnsetSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.templateName !== null && this.templateName !== undefined) { + output.writeFieldBegin('templateName', Thrift.Type.STRING, 3); + output.writeString(this.templateName); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSDropSchemaTemplateReq = module.exports.TSDropSchemaTemplateReq = function(args) { + this.sessionId = null; + this.templateName = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.templateName !== undefined && args.templateName !== null) { + this.templateName = args.templateName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); + } + } +}; +TSDropSchemaTemplateReq.prototype = {}; +TSDropSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.templateName = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSDropSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TSDropSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.templateName !== null && this.templateName !== undefined) { + output.writeFieldBegin('templateName', Thrift.Type.STRING, 2); + output.writeString(this.templateName); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TCreateTimeseriesUsingSchemaTemplateReq = module.exports.TCreateTimeseriesUsingSchemaTemplateReq = function(args) { + this.sessionId = null; + this.devicePathList = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.devicePathList !== undefined && args.devicePathList !== null) { + this.devicePathList = Thrift.copyList(args.devicePathList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field devicePathList is unset!'); + } + } +}; +TCreateTimeseriesUsingSchemaTemplateReq.prototype = {}; +TCreateTimeseriesUsingSchemaTemplateReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.devicePathList = []; + var _rtmp3448 = input.readListBegin(); + var _size447 = _rtmp3448.size || 0; + for (var _i449 = 0; _i449 < _size447; ++_i449) { + var elem450 = null; + elem450 = input.readString(); + this.devicePathList.push(elem450); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TCreateTimeseriesUsingSchemaTemplateReq.prototype.write = function(output) { + output.writeStructBegin('TCreateTimeseriesUsingSchemaTemplateReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.devicePathList !== null && this.devicePathList !== undefined) { + output.writeFieldBegin('devicePathList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.devicePathList.length); + for (var iter451 in this.devicePathList) { + if (this.devicePathList.hasOwnProperty(iter451)) { + iter451 = this.devicePathList[iter451]; + output.writeString(iter451); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSyncIdentityInfo = module.exports.TSyncIdentityInfo = function(args) { + this.pipeName = null; + this.createTime = null; + this.version = null; + this.database = null; + if (args) { + if (args.pipeName !== undefined && args.pipeName !== null) { + this.pipeName = args.pipeName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pipeName is unset!'); + } + if (args.createTime !== undefined && args.createTime !== null) { + this.createTime = args.createTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field createTime is unset!'); + } + if (args.version !== undefined && args.version !== null) { + this.version = args.version; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); + } + if (args.database !== undefined && args.database !== null) { + this.database = args.database; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field database is unset!'); + } + } +}; +TSyncIdentityInfo.prototype = {}; +TSyncIdentityInfo.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.pipeName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.createTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.version = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.database = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSyncIdentityInfo.prototype.write = function(output) { + output.writeStructBegin('TSyncIdentityInfo'); + if (this.pipeName !== null && this.pipeName !== undefined) { + output.writeFieldBegin('pipeName', Thrift.Type.STRING, 1); + output.writeString(this.pipeName); + output.writeFieldEnd(); + } + if (this.createTime !== null && this.createTime !== undefined) { + output.writeFieldBegin('createTime', Thrift.Type.I64, 2); + output.writeI64(this.createTime); + output.writeFieldEnd(); + } + if (this.version !== null && this.version !== undefined) { + output.writeFieldBegin('version', Thrift.Type.STRING, 3); + output.writeString(this.version); + output.writeFieldEnd(); + } + if (this.database !== null && this.database !== undefined) { + output.writeFieldBegin('database', Thrift.Type.STRING, 4); + output.writeString(this.database); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSyncTransportMetaInfo = module.exports.TSyncTransportMetaInfo = function(args) { + this.fileName = null; + this.startIndex = null; + if (args) { + if (args.fileName !== undefined && args.fileName !== null) { + this.fileName = args.fileName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fileName is unset!'); + } + if (args.startIndex !== undefined && args.startIndex !== null) { + this.startIndex = args.startIndex; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startIndex is unset!'); + } + } +}; +TSyncTransportMetaInfo.prototype = {}; +TSyncTransportMetaInfo.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.fileName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.startIndex = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSyncTransportMetaInfo.prototype.write = function(output) { + output.writeStructBegin('TSyncTransportMetaInfo'); + if (this.fileName !== null && this.fileName !== undefined) { + output.writeFieldBegin('fileName', Thrift.Type.STRING, 1); + output.writeString(this.fileName); + output.writeFieldEnd(); + } + if (this.startIndex !== null && this.startIndex !== undefined) { + output.writeFieldBegin('startIndex', Thrift.Type.I64, 2); + output.writeI64(this.startIndex); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TPipeTransferReq = module.exports.TPipeTransferReq = function(args) { + this.version = null; + this.type = null; + this.body = null; + if (args) { + if (args.version !== undefined && args.version !== null) { + this.version = args.version; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); + } + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + if (args.body !== undefined && args.body !== null) { + this.body = args.body; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field body is unset!'); + } + } +}; +TPipeTransferReq.prototype = {}; +TPipeTransferReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.BYTE) { + this.version = input.readByte(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I16) { + this.type = input.readI16(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.body = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TPipeTransferReq.prototype.write = function(output) { + output.writeStructBegin('TPipeTransferReq'); + if (this.version !== null && this.version !== undefined) { + output.writeFieldBegin('version', Thrift.Type.BYTE, 1); + output.writeByte(this.version); + output.writeFieldEnd(); + } + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.I16, 2); + output.writeI16(this.type); + output.writeFieldEnd(); + } + if (this.body !== null && this.body !== undefined) { + output.writeFieldBegin('body', Thrift.Type.STRING, 3); + output.writeBinary(this.body); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TPipeTransferResp = module.exports.TPipeTransferResp = function(args) { + this.status = null; + this.body = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.body !== undefined && args.body !== null) { + this.body = args.body; + } + } +}; +TPipeTransferResp.prototype = {}; +TPipeTransferResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.body = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TPipeTransferResp.prototype.write = function(output) { + output.writeStructBegin('TPipeTransferResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.body !== null && this.body !== undefined) { + output.writeFieldBegin('body', Thrift.Type.STRING, 2); + output.writeBinary(this.body); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TPipeSubscribeReq = module.exports.TPipeSubscribeReq = function(args) { + this.version = null; + this.type = null; + this.body = null; + if (args) { + if (args.version !== undefined && args.version !== null) { + this.version = args.version; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); + } + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + if (args.body !== undefined && args.body !== null) { + this.body = args.body; + } + } +}; +TPipeSubscribeReq.prototype = {}; +TPipeSubscribeReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.BYTE) { + this.version = input.readByte(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I16) { + this.type = input.readI16(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.body = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TPipeSubscribeReq.prototype.write = function(output) { + output.writeStructBegin('TPipeSubscribeReq'); + if (this.version !== null && this.version !== undefined) { + output.writeFieldBegin('version', Thrift.Type.BYTE, 1); + output.writeByte(this.version); + output.writeFieldEnd(); + } + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.I16, 2); + output.writeI16(this.type); + output.writeFieldEnd(); + } + if (this.body !== null && this.body !== undefined) { + output.writeFieldBegin('body', Thrift.Type.STRING, 3); + output.writeBinary(this.body); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TPipeSubscribeResp = module.exports.TPipeSubscribeResp = function(args) { + this.status = null; + this.version = null; + this.type = null; + this.body = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.version !== undefined && args.version !== null) { + this.version = args.version; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); + } + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + if (args.body !== undefined && args.body !== null) { + this.body = Thrift.copyList(args.body, [null]); + } + } +}; +TPipeSubscribeResp.prototype = {}; +TPipeSubscribeResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.BYTE) { + this.version = input.readByte(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I16) { + this.type = input.readI16(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.LIST) { + this.body = []; + var _rtmp3453 = input.readListBegin(); + var _size452 = _rtmp3453.size || 0; + for (var _i454 = 0; _i454 < _size452; ++_i454) { + var elem455 = null; + elem455 = input.readBinary(); + this.body.push(elem455); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TPipeSubscribeResp.prototype.write = function(output) { + output.writeStructBegin('TPipeSubscribeResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.version !== null && this.version !== undefined) { + output.writeFieldBegin('version', Thrift.Type.BYTE, 2); + output.writeByte(this.version); + output.writeFieldEnd(); + } + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.I16, 3); + output.writeI16(this.type); + output.writeFieldEnd(); + } + if (this.body !== null && this.body !== undefined) { + output.writeFieldBegin('body', Thrift.Type.LIST, 4); + output.writeListBegin(Thrift.Type.STRING, this.body.length); + for (var iter456 in this.body) { + if (this.body.hasOwnProperty(iter456)) { + iter456 = this.body[iter456]; + output.writeBinary(iter456); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSBackupConfigurationResp = module.exports.TSBackupConfigurationResp = function(args) { + this.status = null; + this.enableOperationSync = null; + this.secondaryAddress = null; + this.secondaryPort = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new common_ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.enableOperationSync !== undefined && args.enableOperationSync !== null) { + this.enableOperationSync = args.enableOperationSync; + } + if (args.secondaryAddress !== undefined && args.secondaryAddress !== null) { + this.secondaryAddress = args.secondaryAddress; + } + if (args.secondaryPort !== undefined && args.secondaryPort !== null) { + this.secondaryPort = args.secondaryPort; + } + } +}; +TSBackupConfigurationResp.prototype = {}; +TSBackupConfigurationResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new common_ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.BOOL) { + this.enableOperationSync = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.secondaryAddress = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.secondaryPort = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSBackupConfigurationResp.prototype.write = function(output) { + output.writeStructBegin('TSBackupConfigurationResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.enableOperationSync !== null && this.enableOperationSync !== undefined) { + output.writeFieldBegin('enableOperationSync', Thrift.Type.BOOL, 2); + output.writeBool(this.enableOperationSync); + output.writeFieldEnd(); + } + if (this.secondaryAddress !== null && this.secondaryAddress !== undefined) { + output.writeFieldBegin('secondaryAddress', Thrift.Type.STRING, 3); + output.writeString(this.secondaryAddress); + output.writeFieldEnd(); + } + if (this.secondaryPort !== null && this.secondaryPort !== undefined) { + output.writeFieldBegin('secondaryPort', Thrift.Type.I32, 4); + output.writeI32(this.secondaryPort); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSConnectionInfo = module.exports.TSConnectionInfo = function(args) { + this.userName = null; + this.logInTime = null; + this.connectionId = null; + this.type = null; + if (args) { + if (args.userName !== undefined && args.userName !== null) { + this.userName = args.userName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field userName is unset!'); + } + if (args.logInTime !== undefined && args.logInTime !== null) { + this.logInTime = args.logInTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field logInTime is unset!'); + } + if (args.connectionId !== undefined && args.connectionId !== null) { + this.connectionId = args.connectionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field connectionId is unset!'); + } + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + } +}; +TSConnectionInfo.prototype = {}; +TSConnectionInfo.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.userName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.logInTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.connectionId = input.readString(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.type = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSConnectionInfo.prototype.write = function(output) { + output.writeStructBegin('TSConnectionInfo'); + if (this.userName !== null && this.userName !== undefined) { + output.writeFieldBegin('userName', Thrift.Type.STRING, 1); + output.writeString(this.userName); + output.writeFieldEnd(); + } + if (this.logInTime !== null && this.logInTime !== undefined) { + output.writeFieldBegin('logInTime', Thrift.Type.I64, 2); + output.writeI64(this.logInTime); + output.writeFieldEnd(); + } + if (this.connectionId !== null && this.connectionId !== undefined) { + output.writeFieldBegin('connectionId', Thrift.Type.STRING, 3); + output.writeString(this.connectionId); + output.writeFieldEnd(); + } + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.I32, 4); + output.writeI32(this.type); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSConnectionInfoResp = module.exports.TSConnectionInfoResp = function(args) { + this.connectionInfoList = null; + if (args) { + if (args.connectionInfoList !== undefined && args.connectionInfoList !== null) { + this.connectionInfoList = Thrift.copyList(args.connectionInfoList, [ttypes.TSConnectionInfo]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field connectionInfoList is unset!'); + } + } +}; +TSConnectionInfoResp.prototype = {}; +TSConnectionInfoResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.connectionInfoList = []; + var _rtmp3458 = input.readListBegin(); + var _size457 = _rtmp3458.size || 0; + for (var _i459 = 0; _i459 < _size457; ++_i459) { + var elem460 = null; + elem460 = new ttypes.TSConnectionInfo(); + elem460.read(input); + this.connectionInfoList.push(elem460); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSConnectionInfoResp.prototype.write = function(output) { + output.writeStructBegin('TSConnectionInfoResp'); + if (this.connectionInfoList !== null && this.connectionInfoList !== undefined) { + output.writeFieldBegin('connectionInfoList', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRUCT, this.connectionInfoList.length); + for (var iter461 in this.connectionInfoList) { + if (this.connectionInfoList.hasOwnProperty(iter461)) { + iter461 = this.connectionInfoList[iter461]; + iter461.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js b/cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js new file mode 100644 index 0000000..26ba413 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js @@ -0,0 +1,2627 @@ +// +// Autogenerated by Thrift Compiler (0.14.1) +// +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +// +"use strict"; + +var thrift = require('thrift'); +var Thrift = thrift.Thrift; +var Q = thrift.Q; +var Int64 = require('node-int64'); + + +var ttypes = module.exports = {}; +ttypes.TConsensusGroupType = { + 'ConfigRegion' : 0, + 'DataRegion' : 1, + 'SchemaRegion' : 2 +}; +ttypes.TRegionMigrateFailedType = { + 'AddPeerFailed' : 0, + 'RemovePeerFailed' : 1, + 'RemoveConsensusGroupFailed' : 2, + 'DeleteRegionFailed' : 3, + 'CreateRegionFailed' : 4, + 'Disconnect' : 5 +}; +ttypes.TRegionMaintainTaskStatus = { + 'TASK_NOT_EXIST' : 0, + 'PROCESSING' : 1, + 'SUCCESS' : 2, + 'FAIL' : 3 +}; +ttypes.ThrottleType = { + 'REQUEST_NUMBER' : 0, + 'REQUEST_SIZE' : 1, + 'WRITE_NUMBER' : 2, + 'WRITE_SIZE' : 3, + 'READ_NUMBER' : 4, + 'READ_SIZE' : 5 +}; +ttypes.TServiceType = { + 'ConfigNodeInternalService' : 0, + 'DataNodeInternalService' : 1, + 'DataNodeMPPService' : 2, + 'DataNodeExternalService' : 3 +}; +ttypes.TAggregationType = { + 'COUNT' : 0, + 'AVG' : 1, + 'SUM' : 2, + 'FIRST_VALUE' : 3, + 'LAST_VALUE' : 4, + 'MAX_TIME' : 5, + 'MIN_TIME' : 6, + 'MAX_VALUE' : 7, + 'MIN_VALUE' : 8, + 'EXTREME' : 9, + 'COUNT_IF' : 10, + 'TIME_DURATION' : 11, + 'MODE' : 12, + 'COUNT_TIME' : 13, + 'STDDEV' : 14, + 'STDDEV_POP' : 15, + 'STDDEV_SAMP' : 16, + 'VARIANCE' : 17, + 'VAR_POP' : 18, + 'VAR_SAMP' : 19, + 'MAX_BY' : 20, + 'MIN_BY' : 21, + 'UDAF' : 22 +}; +var TEndPoint = module.exports.TEndPoint = function(args) { + this.ip = null; + this.port = null; + if (args) { + if (args.ip !== undefined && args.ip !== null) { + this.ip = args.ip; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field ip is unset!'); + } + if (args.port !== undefined && args.port !== null) { + this.port = args.port; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field port is unset!'); + } + } +}; +TEndPoint.prototype = {}; +TEndPoint.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.ip = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.port = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TEndPoint.prototype.write = function(output) { + output.writeStructBegin('TEndPoint'); + if (this.ip !== null && this.ip !== undefined) { + output.writeFieldBegin('ip', Thrift.Type.STRING, 1); + output.writeString(this.ip); + output.writeFieldEnd(); + } + if (this.port !== null && this.port !== undefined) { + output.writeFieldBegin('port', Thrift.Type.I32, 2); + output.writeI32(this.port); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSStatus = module.exports.TSStatus = function(args) { + this.code = null; + this.message = null; + this.subStatus = null; + this.redirectNode = null; + this.needRetry = null; + if (args) { + if (args.code !== undefined && args.code !== null) { + this.code = args.code; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field code is unset!'); + } + if (args.message !== undefined && args.message !== null) { + this.message = args.message; + } + if (args.subStatus !== undefined && args.subStatus !== null) { + this.subStatus = Thrift.copyList(args.subStatus, [null]); + } + if (args.redirectNode !== undefined && args.redirectNode !== null) { + this.redirectNode = new ttypes.TEndPoint(args.redirectNode); + } + if (args.needRetry !== undefined && args.needRetry !== null) { + this.needRetry = args.needRetry; + } + } +}; +TSStatus.prototype = {}; +TSStatus.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.code = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.message = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.subStatus = []; + var _rtmp31 = input.readListBegin(); + var _size0 = _rtmp31.size || 0; + for (var _i2 = 0; _i2 < _size0; ++_i2) { + var elem3 = null; + elem3 = new ttypes.TSStatus(); + elem3.read(input); + this.subStatus.push(elem3); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRUCT) { + this.redirectNode = new ttypes.TEndPoint(); + this.redirectNode.read(input); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.BOOL) { + this.needRetry = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSStatus.prototype.write = function(output) { + output.writeStructBegin('TSStatus'); + if (this.code !== null && this.code !== undefined) { + output.writeFieldBegin('code', Thrift.Type.I32, 1); + output.writeI32(this.code); + output.writeFieldEnd(); + } + if (this.message !== null && this.message !== undefined) { + output.writeFieldBegin('message', Thrift.Type.STRING, 2); + output.writeString(this.message); + output.writeFieldEnd(); + } + if (this.subStatus !== null && this.subStatus !== undefined) { + output.writeFieldBegin('subStatus', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRUCT, this.subStatus.length); + for (var iter4 in this.subStatus) { + if (this.subStatus.hasOwnProperty(iter4)) { + iter4 = this.subStatus[iter4]; + iter4.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.redirectNode !== null && this.redirectNode !== undefined) { + output.writeFieldBegin('redirectNode', Thrift.Type.STRUCT, 4); + this.redirectNode.write(output); + output.writeFieldEnd(); + } + if (this.needRetry !== null && this.needRetry !== undefined) { + output.writeFieldBegin('needRetry', Thrift.Type.BOOL, 5); + output.writeBool(this.needRetry); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TConsensusGroupId = module.exports.TConsensusGroupId = function(args) { + this.type = null; + this.id = null; + if (args) { + if (args.type !== undefined && args.type !== null) { + this.type = args.type; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); + } + if (args.id !== undefined && args.id !== null) { + this.id = args.id; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field id is unset!'); + } + } +}; +TConsensusGroupId.prototype = {}; +TConsensusGroupId.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.type = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.id = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TConsensusGroupId.prototype.write = function(output) { + output.writeStructBegin('TConsensusGroupId'); + if (this.type !== null && this.type !== undefined) { + output.writeFieldBegin('type', Thrift.Type.I32, 1); + output.writeI32(this.type); + output.writeFieldEnd(); + } + if (this.id !== null && this.id !== undefined) { + output.writeFieldBegin('id', Thrift.Type.I32, 2); + output.writeI32(this.id); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSeriesPartitionSlot = module.exports.TSeriesPartitionSlot = function(args) { + this.slotId = null; + if (args) { + if (args.slotId !== undefined && args.slotId !== null) { + this.slotId = args.slotId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field slotId is unset!'); + } + } +}; +TSeriesPartitionSlot.prototype = {}; +TSeriesPartitionSlot.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.slotId = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSeriesPartitionSlot.prototype.write = function(output) { + output.writeStructBegin('TSeriesPartitionSlot'); + if (this.slotId !== null && this.slotId !== undefined) { + output.writeFieldBegin('slotId', Thrift.Type.I32, 1); + output.writeI32(this.slotId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TTimePartitionSlot = module.exports.TTimePartitionSlot = function(args) { + this.startTime = null; + if (args) { + if (args.startTime !== undefined && args.startTime !== null) { + this.startTime = args.startTime; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); + } + } +}; +TTimePartitionSlot.prototype = {}; +TTimePartitionSlot.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.startTime = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TTimePartitionSlot.prototype.write = function(output) { + output.writeStructBegin('TTimePartitionSlot'); + if (this.startTime !== null && this.startTime !== undefined) { + output.writeFieldBegin('startTime', Thrift.Type.I64, 1); + output.writeI64(this.startTime); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TRegionReplicaSet = module.exports.TRegionReplicaSet = function(args) { + this.regionId = null; + this.dataNodeLocations = null; + if (args) { + if (args.regionId !== undefined && args.regionId !== null) { + this.regionId = new ttypes.TConsensusGroupId(args.regionId); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field regionId is unset!'); + } + if (args.dataNodeLocations !== undefined && args.dataNodeLocations !== null) { + this.dataNodeLocations = Thrift.copyList(args.dataNodeLocations, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeLocations is unset!'); + } + } +}; +TRegionReplicaSet.prototype = {}; +TRegionReplicaSet.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.regionId = new ttypes.TConsensusGroupId(); + this.regionId.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.dataNodeLocations = []; + var _rtmp36 = input.readListBegin(); + var _size5 = _rtmp36.size || 0; + for (var _i7 = 0; _i7 < _size5; ++_i7) { + var elem8 = null; + elem8 = new ttypes.TDataNodeLocation(); + elem8.read(input); + this.dataNodeLocations.push(elem8); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TRegionReplicaSet.prototype.write = function(output) { + output.writeStructBegin('TRegionReplicaSet'); + if (this.regionId !== null && this.regionId !== undefined) { + output.writeFieldBegin('regionId', Thrift.Type.STRUCT, 1); + this.regionId.write(output); + output.writeFieldEnd(); + } + if (this.dataNodeLocations !== null && this.dataNodeLocations !== undefined) { + output.writeFieldBegin('dataNodeLocations', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRUCT, this.dataNodeLocations.length); + for (var iter9 in this.dataNodeLocations) { + if (this.dataNodeLocations.hasOwnProperty(iter9)) { + iter9 = this.dataNodeLocations[iter9]; + iter9.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TNodeResource = module.exports.TNodeResource = function(args) { + this.cpuCoreNum = null; + this.maxMemory = null; + if (args) { + if (args.cpuCoreNum !== undefined && args.cpuCoreNum !== null) { + this.cpuCoreNum = args.cpuCoreNum; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field cpuCoreNum is unset!'); + } + if (args.maxMemory !== undefined && args.maxMemory !== null) { + this.maxMemory = args.maxMemory; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field maxMemory is unset!'); + } + } +}; +TNodeResource.prototype = {}; +TNodeResource.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.cpuCoreNum = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.maxMemory = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TNodeResource.prototype.write = function(output) { + output.writeStructBegin('TNodeResource'); + if (this.cpuCoreNum !== null && this.cpuCoreNum !== undefined) { + output.writeFieldBegin('cpuCoreNum', Thrift.Type.I32, 1); + output.writeI32(this.cpuCoreNum); + output.writeFieldEnd(); + } + if (this.maxMemory !== null && this.maxMemory !== undefined) { + output.writeFieldBegin('maxMemory', Thrift.Type.I64, 2); + output.writeI64(this.maxMemory); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TConfigNodeLocation = module.exports.TConfigNodeLocation = function(args) { + this.configNodeId = null; + this.internalEndPoint = null; + this.consensusEndPoint = null; + if (args) { + if (args.configNodeId !== undefined && args.configNodeId !== null) { + this.configNodeId = args.configNodeId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field configNodeId is unset!'); + } + if (args.internalEndPoint !== undefined && args.internalEndPoint !== null) { + this.internalEndPoint = new ttypes.TEndPoint(args.internalEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field internalEndPoint is unset!'); + } + if (args.consensusEndPoint !== undefined && args.consensusEndPoint !== null) { + this.consensusEndPoint = new ttypes.TEndPoint(args.consensusEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field consensusEndPoint is unset!'); + } + } +}; +TConfigNodeLocation.prototype = {}; +TConfigNodeLocation.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.configNodeId = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.internalEndPoint = new ttypes.TEndPoint(); + this.internalEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRUCT) { + this.consensusEndPoint = new ttypes.TEndPoint(); + this.consensusEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TConfigNodeLocation.prototype.write = function(output) { + output.writeStructBegin('TConfigNodeLocation'); + if (this.configNodeId !== null && this.configNodeId !== undefined) { + output.writeFieldBegin('configNodeId', Thrift.Type.I32, 1); + output.writeI32(this.configNodeId); + output.writeFieldEnd(); + } + if (this.internalEndPoint !== null && this.internalEndPoint !== undefined) { + output.writeFieldBegin('internalEndPoint', Thrift.Type.STRUCT, 2); + this.internalEndPoint.write(output); + output.writeFieldEnd(); + } + if (this.consensusEndPoint !== null && this.consensusEndPoint !== undefined) { + output.writeFieldBegin('consensusEndPoint', Thrift.Type.STRUCT, 3); + this.consensusEndPoint.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TDataNodeLocation = module.exports.TDataNodeLocation = function(args) { + this.dataNodeId = null; + this.clientRpcEndPoint = null; + this.internalEndPoint = null; + this.mPPDataExchangeEndPoint = null; + this.dataRegionConsensusEndPoint = null; + this.schemaRegionConsensusEndPoint = null; + if (args) { + if (args.dataNodeId !== undefined && args.dataNodeId !== null) { + this.dataNodeId = args.dataNodeId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeId is unset!'); + } + if (args.clientRpcEndPoint !== undefined && args.clientRpcEndPoint !== null) { + this.clientRpcEndPoint = new ttypes.TEndPoint(args.clientRpcEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field clientRpcEndPoint is unset!'); + } + if (args.internalEndPoint !== undefined && args.internalEndPoint !== null) { + this.internalEndPoint = new ttypes.TEndPoint(args.internalEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field internalEndPoint is unset!'); + } + if (args.mPPDataExchangeEndPoint !== undefined && args.mPPDataExchangeEndPoint !== null) { + this.mPPDataExchangeEndPoint = new ttypes.TEndPoint(args.mPPDataExchangeEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field mPPDataExchangeEndPoint is unset!'); + } + if (args.dataRegionConsensusEndPoint !== undefined && args.dataRegionConsensusEndPoint !== null) { + this.dataRegionConsensusEndPoint = new ttypes.TEndPoint(args.dataRegionConsensusEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataRegionConsensusEndPoint is unset!'); + } + if (args.schemaRegionConsensusEndPoint !== undefined && args.schemaRegionConsensusEndPoint !== null) { + this.schemaRegionConsensusEndPoint = new ttypes.TEndPoint(args.schemaRegionConsensusEndPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field schemaRegionConsensusEndPoint is unset!'); + } + } +}; +TDataNodeLocation.prototype = {}; +TDataNodeLocation.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I32) { + this.dataNodeId = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.clientRpcEndPoint = new ttypes.TEndPoint(); + this.clientRpcEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRUCT) { + this.internalEndPoint = new ttypes.TEndPoint(); + this.internalEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRUCT) { + this.mPPDataExchangeEndPoint = new ttypes.TEndPoint(); + this.mPPDataExchangeEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.STRUCT) { + this.dataRegionConsensusEndPoint = new ttypes.TEndPoint(); + this.dataRegionConsensusEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.STRUCT) { + this.schemaRegionConsensusEndPoint = new ttypes.TEndPoint(); + this.schemaRegionConsensusEndPoint.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TDataNodeLocation.prototype.write = function(output) { + output.writeStructBegin('TDataNodeLocation'); + if (this.dataNodeId !== null && this.dataNodeId !== undefined) { + output.writeFieldBegin('dataNodeId', Thrift.Type.I32, 1); + output.writeI32(this.dataNodeId); + output.writeFieldEnd(); + } + if (this.clientRpcEndPoint !== null && this.clientRpcEndPoint !== undefined) { + output.writeFieldBegin('clientRpcEndPoint', Thrift.Type.STRUCT, 2); + this.clientRpcEndPoint.write(output); + output.writeFieldEnd(); + } + if (this.internalEndPoint !== null && this.internalEndPoint !== undefined) { + output.writeFieldBegin('internalEndPoint', Thrift.Type.STRUCT, 3); + this.internalEndPoint.write(output); + output.writeFieldEnd(); + } + if (this.mPPDataExchangeEndPoint !== null && this.mPPDataExchangeEndPoint !== undefined) { + output.writeFieldBegin('mPPDataExchangeEndPoint', Thrift.Type.STRUCT, 4); + this.mPPDataExchangeEndPoint.write(output); + output.writeFieldEnd(); + } + if (this.dataRegionConsensusEndPoint !== null && this.dataRegionConsensusEndPoint !== undefined) { + output.writeFieldBegin('dataRegionConsensusEndPoint', Thrift.Type.STRUCT, 5); + this.dataRegionConsensusEndPoint.write(output); + output.writeFieldEnd(); + } + if (this.schemaRegionConsensusEndPoint !== null && this.schemaRegionConsensusEndPoint !== undefined) { + output.writeFieldBegin('schemaRegionConsensusEndPoint', Thrift.Type.STRUCT, 6); + this.schemaRegionConsensusEndPoint.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TDataNodeConfiguration = module.exports.TDataNodeConfiguration = function(args) { + this.location = null; + this.resource = null; + if (args) { + if (args.location !== undefined && args.location !== null) { + this.location = new ttypes.TDataNodeLocation(args.location); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field location is unset!'); + } + if (args.resource !== undefined && args.resource !== null) { + this.resource = new ttypes.TNodeResource(args.resource); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field resource is unset!'); + } + } +}; +TDataNodeConfiguration.prototype = {}; +TDataNodeConfiguration.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.location = new ttypes.TDataNodeLocation(); + this.location.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.resource = new ttypes.TNodeResource(); + this.resource.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TDataNodeConfiguration.prototype.write = function(output) { + output.writeStructBegin('TDataNodeConfiguration'); + if (this.location !== null && this.location !== undefined) { + output.writeFieldBegin('location', Thrift.Type.STRUCT, 1); + this.location.write(output); + output.writeFieldEnd(); + } + if (this.resource !== null && this.resource !== undefined) { + output.writeFieldBegin('resource', Thrift.Type.STRUCT, 2); + this.resource.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TFlushReq = module.exports.TFlushReq = function(args) { + this.isSeq = null; + this.storageGroups = null; + if (args) { + if (args.isSeq !== undefined && args.isSeq !== null) { + this.isSeq = args.isSeq; + } + if (args.storageGroups !== undefined && args.storageGroups !== null) { + this.storageGroups = Thrift.copyList(args.storageGroups, [null]); + } + } +}; +TFlushReq.prototype = {}; +TFlushReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.isSeq = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.storageGroups = []; + var _rtmp311 = input.readListBegin(); + var _size10 = _rtmp311.size || 0; + for (var _i12 = 0; _i12 < _size10; ++_i12) { + var elem13 = null; + elem13 = input.readString(); + this.storageGroups.push(elem13); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TFlushReq.prototype.write = function(output) { + output.writeStructBegin('TFlushReq'); + if (this.isSeq !== null && this.isSeq !== undefined) { + output.writeFieldBegin('isSeq', Thrift.Type.STRING, 1); + output.writeString(this.isSeq); + output.writeFieldEnd(); + } + if (this.storageGroups !== null && this.storageGroups !== undefined) { + output.writeFieldBegin('storageGroups', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.storageGroups.length); + for (var iter14 in this.storageGroups) { + if (this.storageGroups.hasOwnProperty(iter14)) { + iter14 = this.storageGroups[iter14]; + output.writeString(iter14); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSettleReq = module.exports.TSettleReq = function(args) { + this.paths = null; + if (args) { + if (args.paths !== undefined && args.paths !== null) { + this.paths = Thrift.copyList(args.paths, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); + } + } +}; +TSettleReq.prototype = {}; +TSettleReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.paths = []; + var _rtmp316 = input.readListBegin(); + var _size15 = _rtmp316.size || 0; + for (var _i17 = 0; _i17 < _size15; ++_i17) { + var elem18 = null; + elem18 = input.readString(); + this.paths.push(elem18); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSettleReq.prototype.write = function(output) { + output.writeStructBegin('TSettleReq'); + if (this.paths !== null && this.paths !== undefined) { + output.writeFieldBegin('paths', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.paths.length); + for (var iter19 in this.paths) { + if (this.paths.hasOwnProperty(iter19)) { + iter19 = this.paths[iter19]; + output.writeString(iter19); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSchemaNode = module.exports.TSchemaNode = function(args) { + this.nodeName = null; + this.nodeType = null; + if (args) { + if (args.nodeName !== undefined && args.nodeName !== null) { + this.nodeName = args.nodeName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeName is unset!'); + } + if (args.nodeType !== undefined && args.nodeType !== null) { + this.nodeType = args.nodeType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeType is unset!'); + } + } +}; +TSchemaNode.prototype = {}; +TSchemaNode.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.nodeName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.BYTE) { + this.nodeType = input.readByte(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSchemaNode.prototype.write = function(output) { + output.writeStructBegin('TSchemaNode'); + if (this.nodeName !== null && this.nodeName !== undefined) { + output.writeFieldBegin('nodeName', Thrift.Type.STRING, 1); + output.writeString(this.nodeName); + output.writeFieldEnd(); + } + if (this.nodeType !== null && this.nodeType !== undefined) { + output.writeFieldBegin('nodeType', Thrift.Type.BYTE, 2); + output.writeByte(this.nodeType); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSetConfigurationReq = module.exports.TSetConfigurationReq = function(args) { + this.configs = null; + this.nodeId = null; + if (args) { + if (args.configs !== undefined && args.configs !== null) { + this.configs = Thrift.copyMap(args.configs, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field configs is unset!'); + } + if (args.nodeId !== undefined && args.nodeId !== null) { + this.nodeId = args.nodeId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeId is unset!'); + } + } +}; +TSetConfigurationReq.prototype = {}; +TSetConfigurationReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.MAP) { + this.configs = {}; + var _rtmp321 = input.readMapBegin(); + var _size20 = _rtmp321.size || 0; + for (var _i22 = 0; _i22 < _size20; ++_i22) { + var key23 = null; + var val24 = null; + key23 = input.readString(); + val24 = input.readString(); + this.configs[key23] = val24; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.nodeId = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSetConfigurationReq.prototype.write = function(output) { + output.writeStructBegin('TSetConfigurationReq'); + if (this.configs !== null && this.configs !== undefined) { + output.writeFieldBegin('configs', Thrift.Type.MAP, 1); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configs)); + for (var kiter25 in this.configs) { + if (this.configs.hasOwnProperty(kiter25)) { + var viter26 = this.configs[kiter25]; + output.writeString(kiter25); + output.writeString(viter26); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.nodeId !== null && this.nodeId !== undefined) { + output.writeFieldBegin('nodeId', Thrift.Type.I32, 2); + output.writeI32(this.nodeId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSetTTLReq = module.exports.TSetTTLReq = function(args) { + this.pathPattern = null; + this.TTL = null; + this.isDataBase = null; + if (args) { + if (args.pathPattern !== undefined && args.pathPattern !== null) { + this.pathPattern = Thrift.copyList(args.pathPattern, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pathPattern is unset!'); + } + if (args.TTL !== undefined && args.TTL !== null) { + this.TTL = args.TTL; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field TTL is unset!'); + } + if (args.isDataBase !== undefined && args.isDataBase !== null) { + this.isDataBase = args.isDataBase; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isDataBase is unset!'); + } + } +}; +TSetTTLReq.prototype = {}; +TSetTTLReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.pathPattern = []; + var _rtmp328 = input.readListBegin(); + var _size27 = _rtmp328.size || 0; + for (var _i29 = 0; _i29 < _size27; ++_i29) { + var elem30 = null; + elem30 = input.readString(); + this.pathPattern.push(elem30); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.TTL = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.BOOL) { + this.isDataBase = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSetTTLReq.prototype.write = function(output) { + output.writeStructBegin('TSetTTLReq'); + if (this.pathPattern !== null && this.pathPattern !== undefined) { + output.writeFieldBegin('pathPattern', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.pathPattern.length); + for (var iter31 in this.pathPattern) { + if (this.pathPattern.hasOwnProperty(iter31)) { + iter31 = this.pathPattern[iter31]; + output.writeString(iter31); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.TTL !== null && this.TTL !== undefined) { + output.writeFieldBegin('TTL', Thrift.Type.I64, 2); + output.writeI64(this.TTL); + output.writeFieldEnd(); + } + if (this.isDataBase !== null && this.isDataBase !== undefined) { + output.writeFieldBegin('isDataBase', Thrift.Type.BOOL, 3); + output.writeBool(this.isDataBase); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TShowTTLReq = module.exports.TShowTTLReq = function(args) { + this.pathPattern = null; + if (args) { + if (args.pathPattern !== undefined && args.pathPattern !== null) { + this.pathPattern = Thrift.copyList(args.pathPattern, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pathPattern is unset!'); + } + } +}; +TShowTTLReq.prototype = {}; +TShowTTLReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.pathPattern = []; + var _rtmp333 = input.readListBegin(); + var _size32 = _rtmp333.size || 0; + for (var _i34 = 0; _i34 < _size32; ++_i34) { + var elem35 = null; + elem35 = input.readString(); + this.pathPattern.push(elem35); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TShowTTLReq.prototype.write = function(output) { + output.writeStructBegin('TShowTTLReq'); + if (this.pathPattern !== null && this.pathPattern !== undefined) { + output.writeFieldBegin('pathPattern', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.pathPattern.length); + for (var iter36 in this.pathPattern) { + if (this.pathPattern.hasOwnProperty(iter36)) { + iter36 = this.pathPattern[iter36]; + output.writeString(iter36); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TFile = module.exports.TFile = function(args) { + this.fileName = null; + this.file = null; + if (args) { + if (args.fileName !== undefined && args.fileName !== null) { + this.fileName = args.fileName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fileName is unset!'); + } + if (args.file !== undefined && args.file !== null) { + this.file = args.file; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field file is unset!'); + } + } +}; +TFile.prototype = {}; +TFile.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.fileName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.file = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TFile.prototype.write = function(output) { + output.writeStructBegin('TFile'); + if (this.fileName !== null && this.fileName !== undefined) { + output.writeFieldBegin('fileName', Thrift.Type.STRING, 1); + output.writeString(this.fileName); + output.writeFieldEnd(); + } + if (this.file !== null && this.file !== undefined) { + output.writeFieldBegin('file', Thrift.Type.STRING, 2); + output.writeBinary(this.file); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TFilesResp = module.exports.TFilesResp = function(args) { + this.status = null; + this.files = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.files !== undefined && args.files !== null) { + this.files = Thrift.copyList(args.files, [ttypes.TFile]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field files is unset!'); + } + } +}; +TFilesResp.prototype = {}; +TFilesResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.files = []; + var _rtmp338 = input.readListBegin(); + var _size37 = _rtmp338.size || 0; + for (var _i39 = 0; _i39 < _size37; ++_i39) { + var elem40 = null; + elem40 = new ttypes.TFile(); + elem40.read(input); + this.files.push(elem40); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TFilesResp.prototype.write = function(output) { + output.writeStructBegin('TFilesResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.files !== null && this.files !== undefined) { + output.writeFieldBegin('files', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRUCT, this.files.length); + for (var iter41 in this.files) { + if (this.files.hasOwnProperty(iter41)) { + iter41 = this.files[iter41]; + iter41.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSpaceQuota = module.exports.TSpaceQuota = function(args) { + this.diskSize = null; + this.deviceNum = null; + this.timeserieNum = null; + if (args) { + if (args.diskSize !== undefined && args.diskSize !== null) { + this.diskSize = args.diskSize; + } + if (args.deviceNum !== undefined && args.deviceNum !== null) { + this.deviceNum = args.deviceNum; + } + if (args.timeserieNum !== undefined && args.timeserieNum !== null) { + this.timeserieNum = args.timeserieNum; + } + } +}; +TSpaceQuota.prototype = {}; +TSpaceQuota.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.diskSize = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.deviceNum = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.timeserieNum = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSpaceQuota.prototype.write = function(output) { + output.writeStructBegin('TSpaceQuota'); + if (this.diskSize !== null && this.diskSize !== undefined) { + output.writeFieldBegin('diskSize', Thrift.Type.I64, 1); + output.writeI64(this.diskSize); + output.writeFieldEnd(); + } + if (this.deviceNum !== null && this.deviceNum !== undefined) { + output.writeFieldBegin('deviceNum', Thrift.Type.I64, 2); + output.writeI64(this.deviceNum); + output.writeFieldEnd(); + } + if (this.timeserieNum !== null && this.timeserieNum !== undefined) { + output.writeFieldBegin('timeserieNum', Thrift.Type.I64, 3); + output.writeI64(this.timeserieNum); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TTimedQuota = module.exports.TTimedQuota = function(args) { + this.timeUnit = null; + this.softLimit = null; + if (args) { + if (args.timeUnit !== undefined && args.timeUnit !== null) { + this.timeUnit = args.timeUnit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeUnit is unset!'); + } + if (args.softLimit !== undefined && args.softLimit !== null) { + this.softLimit = args.softLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field softLimit is unset!'); + } + } +}; +TTimedQuota.prototype = {}; +TTimedQuota.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.timeUnit = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.softLimit = input.readI64(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TTimedQuota.prototype.write = function(output) { + output.writeStructBegin('TTimedQuota'); + if (this.timeUnit !== null && this.timeUnit !== undefined) { + output.writeFieldBegin('timeUnit', Thrift.Type.I64, 1); + output.writeI64(this.timeUnit); + output.writeFieldEnd(); + } + if (this.softLimit !== null && this.softLimit !== undefined) { + output.writeFieldBegin('softLimit', Thrift.Type.I64, 2); + output.writeI64(this.softLimit); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TThrottleQuota = module.exports.TThrottleQuota = function(args) { + this.throttleLimit = null; + this.memLimit = null; + this.cpuLimit = null; + if (args) { + if (args.throttleLimit !== undefined && args.throttleLimit !== null) { + this.throttleLimit = Thrift.copyMap(args.throttleLimit, [ttypes.TTimedQuota]); + } + if (args.memLimit !== undefined && args.memLimit !== null) { + this.memLimit = args.memLimit; + } + if (args.cpuLimit !== undefined && args.cpuLimit !== null) { + this.cpuLimit = args.cpuLimit; + } + } +}; +TThrottleQuota.prototype = {}; +TThrottleQuota.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.MAP) { + this.throttleLimit = {}; + var _rtmp343 = input.readMapBegin(); + var _size42 = _rtmp343.size || 0; + for (var _i44 = 0; _i44 < _size42; ++_i44) { + var key45 = null; + var val46 = null; + key45 = input.readI32(); + val46 = new ttypes.TTimedQuota(); + val46.read(input); + this.throttleLimit[key45] = val46; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.memLimit = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.cpuLimit = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TThrottleQuota.prototype.write = function(output) { + output.writeStructBegin('TThrottleQuota'); + if (this.throttleLimit !== null && this.throttleLimit !== undefined) { + output.writeFieldBegin('throttleLimit', Thrift.Type.MAP, 1); + output.writeMapBegin(Thrift.Type.I32, Thrift.Type.STRUCT, Thrift.objectLength(this.throttleLimit)); + for (var kiter47 in this.throttleLimit) { + if (this.throttleLimit.hasOwnProperty(kiter47)) { + var viter48 = this.throttleLimit[kiter47]; + output.writeI32(kiter47); + viter48.write(output); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.memLimit !== null && this.memLimit !== undefined) { + output.writeFieldBegin('memLimit', Thrift.Type.I64, 2); + output.writeI64(this.memLimit); + output.writeFieldEnd(); + } + if (this.cpuLimit !== null && this.cpuLimit !== undefined) { + output.writeFieldBegin('cpuLimit', Thrift.Type.I32, 3); + output.writeI32(this.cpuLimit); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSetSpaceQuotaReq = module.exports.TSetSpaceQuotaReq = function(args) { + this.database = null; + this.spaceLimit = null; + if (args) { + if (args.database !== undefined && args.database !== null) { + this.database = Thrift.copyList(args.database, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field database is unset!'); + } + if (args.spaceLimit !== undefined && args.spaceLimit !== null) { + this.spaceLimit = new ttypes.TSpaceQuota(args.spaceLimit); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field spaceLimit is unset!'); + } + } +}; +TSetSpaceQuotaReq.prototype = {}; +TSetSpaceQuotaReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.database = []; + var _rtmp350 = input.readListBegin(); + var _size49 = _rtmp350.size || 0; + for (var _i51 = 0; _i51 < _size49; ++_i51) { + var elem52 = null; + elem52 = input.readString(); + this.database.push(elem52); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.spaceLimit = new ttypes.TSpaceQuota(); + this.spaceLimit.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSetSpaceQuotaReq.prototype.write = function(output) { + output.writeStructBegin('TSetSpaceQuotaReq'); + if (this.database !== null && this.database !== undefined) { + output.writeFieldBegin('database', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.database.length); + for (var iter53 in this.database) { + if (this.database.hasOwnProperty(iter53)) { + iter53 = this.database[iter53]; + output.writeString(iter53); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.spaceLimit !== null && this.spaceLimit !== undefined) { + output.writeFieldBegin('spaceLimit', Thrift.Type.STRUCT, 2); + this.spaceLimit.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSetThrottleQuotaReq = module.exports.TSetThrottleQuotaReq = function(args) { + this.userName = null; + this.throttleQuota = null; + if (args) { + if (args.userName !== undefined && args.userName !== null) { + this.userName = args.userName; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field userName is unset!'); + } + if (args.throttleQuota !== undefined && args.throttleQuota !== null) { + this.throttleQuota = new ttypes.TThrottleQuota(args.throttleQuota); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field throttleQuota is unset!'); + } + } +}; +TSetThrottleQuotaReq.prototype = {}; +TSetThrottleQuotaReq.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.userName = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.throttleQuota = new ttypes.TThrottleQuota(); + this.throttleQuota.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSetThrottleQuotaReq.prototype.write = function(output) { + output.writeStructBegin('TSetThrottleQuotaReq'); + if (this.userName !== null && this.userName !== undefined) { + output.writeFieldBegin('userName', Thrift.Type.STRING, 1); + output.writeString(this.userName); + output.writeFieldEnd(); + } + if (this.throttleQuota !== null && this.throttleQuota !== undefined) { + output.writeFieldBegin('throttleQuota', Thrift.Type.STRUCT, 2); + this.throttleQuota.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TLicense = module.exports.TLicense = function(args) { + this.licenseIssueTimestamp = null; + this.expireTimestamp = null; + this.dataNodeNumLimit = null; + this.cpuCoreNumLimit = null; + this.deviceNumLimit = null; + this.sensorNumLimit = null; + this.disconnectionFromActiveNodeTimeLimit = null; + this.mlNodeNumLimit = null; + if (args) { + if (args.licenseIssueTimestamp !== undefined && args.licenseIssueTimestamp !== null) { + this.licenseIssueTimestamp = args.licenseIssueTimestamp; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field licenseIssueTimestamp is unset!'); + } + if (args.expireTimestamp !== undefined && args.expireTimestamp !== null) { + this.expireTimestamp = args.expireTimestamp; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field expireTimestamp is unset!'); + } + if (args.dataNodeNumLimit !== undefined && args.dataNodeNumLimit !== null) { + this.dataNodeNumLimit = args.dataNodeNumLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeNumLimit is unset!'); + } + if (args.cpuCoreNumLimit !== undefined && args.cpuCoreNumLimit !== null) { + this.cpuCoreNumLimit = args.cpuCoreNumLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field cpuCoreNumLimit is unset!'); + } + if (args.deviceNumLimit !== undefined && args.deviceNumLimit !== null) { + this.deviceNumLimit = args.deviceNumLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field deviceNumLimit is unset!'); + } + if (args.sensorNumLimit !== undefined && args.sensorNumLimit !== null) { + this.sensorNumLimit = args.sensorNumLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sensorNumLimit is unset!'); + } + if (args.disconnectionFromActiveNodeTimeLimit !== undefined && args.disconnectionFromActiveNodeTimeLimit !== null) { + this.disconnectionFromActiveNodeTimeLimit = args.disconnectionFromActiveNodeTimeLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field disconnectionFromActiveNodeTimeLimit is unset!'); + } + if (args.mlNodeNumLimit !== undefined && args.mlNodeNumLimit !== null) { + this.mlNodeNumLimit = args.mlNodeNumLimit; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field mlNodeNumLimit is unset!'); + } + } +}; +TLicense.prototype = {}; +TLicense.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.licenseIssueTimestamp = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I64) { + this.expireTimestamp = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I16) { + this.dataNodeNumLimit = input.readI16(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.cpuCoreNumLimit = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.I64) { + this.deviceNumLimit = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 7: + if (ftype == Thrift.Type.I64) { + this.sensorNumLimit = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 8: + if (ftype == Thrift.Type.I64) { + this.disconnectionFromActiveNodeTimeLimit = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 9: + if (ftype == Thrift.Type.I16) { + this.mlNodeNumLimit = input.readI16(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TLicense.prototype.write = function(output) { + output.writeStructBegin('TLicense'); + if (this.licenseIssueTimestamp !== null && this.licenseIssueTimestamp !== undefined) { + output.writeFieldBegin('licenseIssueTimestamp', Thrift.Type.I64, 1); + output.writeI64(this.licenseIssueTimestamp); + output.writeFieldEnd(); + } + if (this.expireTimestamp !== null && this.expireTimestamp !== undefined) { + output.writeFieldBegin('expireTimestamp', Thrift.Type.I64, 2); + output.writeI64(this.expireTimestamp); + output.writeFieldEnd(); + } + if (this.dataNodeNumLimit !== null && this.dataNodeNumLimit !== undefined) { + output.writeFieldBegin('dataNodeNumLimit', Thrift.Type.I16, 4); + output.writeI16(this.dataNodeNumLimit); + output.writeFieldEnd(); + } + if (this.cpuCoreNumLimit !== null && this.cpuCoreNumLimit !== undefined) { + output.writeFieldBegin('cpuCoreNumLimit', Thrift.Type.I32, 5); + output.writeI32(this.cpuCoreNumLimit); + output.writeFieldEnd(); + } + if (this.deviceNumLimit !== null && this.deviceNumLimit !== undefined) { + output.writeFieldBegin('deviceNumLimit', Thrift.Type.I64, 6); + output.writeI64(this.deviceNumLimit); + output.writeFieldEnd(); + } + if (this.sensorNumLimit !== null && this.sensorNumLimit !== undefined) { + output.writeFieldBegin('sensorNumLimit', Thrift.Type.I64, 7); + output.writeI64(this.sensorNumLimit); + output.writeFieldEnd(); + } + if (this.disconnectionFromActiveNodeTimeLimit !== null && this.disconnectionFromActiveNodeTimeLimit !== undefined) { + output.writeFieldBegin('disconnectionFromActiveNodeTimeLimit', Thrift.Type.I64, 8); + output.writeI64(this.disconnectionFromActiveNodeTimeLimit); + output.writeFieldEnd(); + } + if (this.mlNodeNumLimit !== null && this.mlNodeNumLimit !== undefined) { + output.writeFieldBegin('mlNodeNumLimit', Thrift.Type.I16, 9); + output.writeI16(this.mlNodeNumLimit); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TServiceProvider = module.exports.TServiceProvider = function(args) { + this.endPoint = null; + this.serviceType = null; + if (args) { + if (args.endPoint !== undefined && args.endPoint !== null) { + this.endPoint = new ttypes.TEndPoint(args.endPoint); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endPoint is unset!'); + } + if (args.serviceType !== undefined && args.serviceType !== null) { + this.serviceType = args.serviceType; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serviceType is unset!'); + } + } +}; +TServiceProvider.prototype = {}; +TServiceProvider.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.endPoint = new ttypes.TEndPoint(); + this.endPoint.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.serviceType = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TServiceProvider.prototype.write = function(output) { + output.writeStructBegin('TServiceProvider'); + if (this.endPoint !== null && this.endPoint !== undefined) { + output.writeFieldBegin('endPoint', Thrift.Type.STRUCT, 1); + this.endPoint.write(output); + output.writeFieldEnd(); + } + if (this.serviceType !== null && this.serviceType !== undefined) { + output.writeFieldBegin('serviceType', Thrift.Type.I32, 2); + output.writeI32(this.serviceType); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSender = module.exports.TSender = function(args) { + this.dataNodeLocation = null; + this.configNodeLocation = null; + if (args) { + if (args.dataNodeLocation !== undefined && args.dataNodeLocation !== null) { + this.dataNodeLocation = new ttypes.TDataNodeLocation(args.dataNodeLocation); + } + if (args.configNodeLocation !== undefined && args.configNodeLocation !== null) { + this.configNodeLocation = new ttypes.TConfigNodeLocation(args.configNodeLocation); + } + } +}; +TSender.prototype = {}; +TSender.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.dataNodeLocation = new ttypes.TDataNodeLocation(); + this.dataNodeLocation.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.configNodeLocation = new ttypes.TConfigNodeLocation(); + this.configNodeLocation.read(input); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSender.prototype.write = function(output) { + output.writeStructBegin('TSender'); + if (this.dataNodeLocation !== null && this.dataNodeLocation !== undefined) { + output.writeFieldBegin('dataNodeLocation', Thrift.Type.STRUCT, 1); + this.dataNodeLocation.write(output); + output.writeFieldEnd(); + } + if (this.configNodeLocation !== null && this.configNodeLocation !== undefined) { + output.writeFieldBegin('configNodeLocation', Thrift.Type.STRUCT, 2); + this.configNodeLocation.write(output); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TTestConnectionResult = module.exports.TTestConnectionResult = function(args) { + this.serviceProvider = null; + this.sender = null; + this.success = null; + this.reason = null; + if (args) { + if (args.serviceProvider !== undefined && args.serviceProvider !== null) { + this.serviceProvider = new ttypes.TServiceProvider(args.serviceProvider); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serviceProvider is unset!'); + } + if (args.sender !== undefined && args.sender !== null) { + this.sender = new ttypes.TSender(args.sender); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sender is unset!'); + } + if (args.success !== undefined && args.success !== null) { + this.success = args.success; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field success is unset!'); + } + if (args.reason !== undefined && args.reason !== null) { + this.reason = args.reason; + } + } +}; +TTestConnectionResult.prototype = {}; +TTestConnectionResult.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.serviceProvider = new ttypes.TServiceProvider(); + this.serviceProvider.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRUCT) { + this.sender = new ttypes.TSender(); + this.sender.read(input); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.BOOL) { + this.success = input.readBool(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.reason = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TTestConnectionResult.prototype.write = function(output) { + output.writeStructBegin('TTestConnectionResult'); + if (this.serviceProvider !== null && this.serviceProvider !== undefined) { + output.writeFieldBegin('serviceProvider', Thrift.Type.STRUCT, 1); + this.serviceProvider.write(output); + output.writeFieldEnd(); + } + if (this.sender !== null && this.sender !== undefined) { + output.writeFieldBegin('sender', Thrift.Type.STRUCT, 2); + this.sender.write(output); + output.writeFieldEnd(); + } + if (this.success !== null && this.success !== undefined) { + output.writeFieldBegin('success', Thrift.Type.BOOL, 3); + output.writeBool(this.success); + output.writeFieldEnd(); + } + if (this.reason !== null && this.reason !== undefined) { + output.writeFieldBegin('reason', Thrift.Type.STRING, 4); + output.writeString(this.reason); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TTestConnectionResp = module.exports.TTestConnectionResp = function(args) { + this.status = null; + this.resultList = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.resultList !== undefined && args.resultList !== null) { + this.resultList = Thrift.copyList(args.resultList, [ttypes.TTestConnectionResult]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field resultList is unset!'); + } + } +}; +TTestConnectionResp.prototype = {}; +TTestConnectionResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.resultList = []; + var _rtmp355 = input.readListBegin(); + var _size54 = _rtmp355.size || 0; + for (var _i56 = 0; _i56 < _size54; ++_i56) { + var elem57 = null; + elem57 = new ttypes.TTestConnectionResult(); + elem57.read(input); + this.resultList.push(elem57); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TTestConnectionResp.prototype.write = function(output) { + output.writeStructBegin('TTestConnectionResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.resultList !== null && this.resultList !== undefined) { + output.writeFieldBegin('resultList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRUCT, this.resultList.length); + for (var iter58 in this.resultList) { + if (this.resultList.hasOwnProperty(iter58)) { + iter58 = this.resultList[iter58]; + iter58.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TNodeLocations = module.exports.TNodeLocations = function(args) { + this.configNodeLocations = null; + this.dataNodeLocations = null; + if (args) { + if (args.configNodeLocations !== undefined && args.configNodeLocations !== null) { + this.configNodeLocations = Thrift.copyList(args.configNodeLocations, [ttypes.TConfigNodeLocation]); + } + if (args.dataNodeLocations !== undefined && args.dataNodeLocations !== null) { + this.dataNodeLocations = Thrift.copyList(args.dataNodeLocations, [ttypes.TDataNodeLocation]); + } + } +}; +TNodeLocations.prototype = {}; +TNodeLocations.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.configNodeLocations = []; + var _rtmp360 = input.readListBegin(); + var _size59 = _rtmp360.size || 0; + for (var _i61 = 0; _i61 < _size59; ++_i61) { + var elem62 = null; + elem62 = new ttypes.TConfigNodeLocation(); + elem62.read(input); + this.configNodeLocations.push(elem62); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.dataNodeLocations = []; + var _rtmp364 = input.readListBegin(); + var _size63 = _rtmp364.size || 0; + for (var _i65 = 0; _i65 < _size63; ++_i65) { + var elem66 = null; + elem66 = new ttypes.TDataNodeLocation(); + elem66.read(input); + this.dataNodeLocations.push(elem66); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TNodeLocations.prototype.write = function(output) { + output.writeStructBegin('TNodeLocations'); + if (this.configNodeLocations !== null && this.configNodeLocations !== undefined) { + output.writeFieldBegin('configNodeLocations', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRUCT, this.configNodeLocations.length); + for (var iter67 in this.configNodeLocations) { + if (this.configNodeLocations.hasOwnProperty(iter67)) { + iter67 = this.configNodeLocations[iter67]; + iter67.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataNodeLocations !== null && this.dataNodeLocations !== undefined) { + output.writeFieldBegin('dataNodeLocations', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRUCT, this.dataNodeLocations.length); + for (var iter68 in this.dataNodeLocations) { + if (this.dataNodeLocations.hasOwnProperty(iter68)) { + iter68 = this.dataNodeLocations[iter68]; + iter68.write(output); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TShowConfigurationTemplateResp = module.exports.TShowConfigurationTemplateResp = function(args) { + this.status = null; + this.content = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.content !== undefined && args.content !== null) { + this.content = args.content; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field content is unset!'); + } + } +}; +TShowConfigurationTemplateResp.prototype = {}; +TShowConfigurationTemplateResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.content = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TShowConfigurationTemplateResp.prototype.write = function(output) { + output.writeStructBegin('TShowConfigurationTemplateResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.content !== null && this.content !== undefined) { + output.writeFieldBegin('content', Thrift.Type.STRING, 2); + output.writeString(this.content); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TShowConfigurationResp = module.exports.TShowConfigurationResp = function(args) { + this.status = null; + this.content = null; + if (args) { + if (args.status !== undefined && args.status !== null) { + this.status = new ttypes.TSStatus(args.status); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); + } + if (args.content !== undefined && args.content !== null) { + this.content = args.content; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field content is unset!'); + } + } +}; +TShowConfigurationResp.prototype = {}; +TShowConfigurationResp.prototype.read = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRUCT) { + this.status = new ttypes.TSStatus(); + this.status.read(input); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.content = input.readString(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TShowConfigurationResp.prototype.write = function(output) { + output.writeStructBegin('TShowConfigurationResp'); + if (this.status !== null && this.status !== undefined) { + output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); + this.status.write(output); + output.writeFieldEnd(); + } + if (this.content !== null && this.content !== undefined) { + output.writeFieldBegin('content', Thrift.Type.STRING, 2); + output.writeString(this.content); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + diff --git a/cdsp/information-layer/handlers/iotdb/package.json b/cdsp/information-layer/handlers/iotdb/package.json new file mode 100644 index 0000000..0b68fe0 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/package.json @@ -0,0 +1,10 @@ +{ + "name": "iotdb-handler", + "version": "1.0.0", + "description": "IoT database handler", + "main": "iotdb-handler.js", + "dependencies": { + "thrift": "^0.20.0", + "uuid": "^9.0.1" + } +} diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index 09cbb2e..85ef9c5 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -1 +1,70 @@ -// tdb \ No newline at end of file +const Thrift = require("thrift"); +const Handler = require("../../handler"); +const IClientRPCService = require("../gen-nodejs/IClientRPCService"); +const ttypes = require("../gen-nodejs/client_types"); +const config = require("../config/config"); +const { Session } = require("inspector"); +const sendMessageToClient = (ws, message) => { + ws.send(JSON.stringify(message)); +}; + +class IoTDBHandler extends Handler { + constructor() { + super(); + this.connection = null; + this.client = null; + this.sendMessageToClients = null; + this.sessionId = null; + this.statementId = 0; + } + + async authenticateAndConnect(sendMessageToClients) { + try { + this.sendMessageToClients = sendMessageToClients; + + this.connection = Thrift.createConnection( + config.iotdbHost, + config.iotdbPort, + { + transport: Thrift.TFramedTransport, + protocol: Thrift.TBinaryProtocol, + } + ); + + this.client = Thrift.createClient(IClientRPCService, this.connection); + + this.connection.on("error", (err) => { + console.error("Thrift connection error:", err); + }); + + console.log("Successfully connected to IoTDB using Thrift"); + + this.open_session(); + } catch (error) { + console.error("Failed to authenticate with IoTDB:", error); + } + } + + async open_session() { + try { + const openSessionReq = new ttypes.TSOpenSessionReq({ + username: config.iotdbUser, + password: config.iotdbPassword, + client_protocol: ttypes.TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3, // Set the appropriate protocol version + zoneId: config.timeZone, + }); + + const resp = await this.client.openSession(openSessionReq); + + this.sessionId = resp.sessionId; + console.log( + "Successfully authenticated with IoTDB, session ID:", + this.sessionId + ); + } catch (error) { + console.error("Failed starting session with IoTDB:", error); + } + } +} + +module.exports = IoTDBHandler; diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env index 16ac659..bcaf5de 100644 --- a/cdsp/information-layer/router/src/.env +++ b/cdsp/information-layer/router/src/.env @@ -1 +1 @@ -HANDLER_TYPE=realmdb \ No newline at end of file +HANDLER_TYPE=iotdb \ No newline at end of file diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index 06727c5..d7ed319 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -1,21 +1,22 @@ -const WebSocket = require('ws'); -const RealmDBHandler = require('../../handlers/realmdb/src/realmdb-handler'); -const { getHandlerType } = require('../config/config'); -const { validateMessage } = require('../utils/message-validator'); +const WebSocket = require("ws"); +const RealmDBHandler = require("../../handlers/realmdb/src/realmdb-handler"); +const IoTDBHandler = require("../../handlers/iotdb/src/iotdb-handler"); +const { getHandlerType } = require("../config/config"); +const { validateMessage } = require("../utils/message-validator"); const handlerType = getHandlerType(); let handler; -console.log(`this is the handler type: ${handlerType}`) +console.log(`this is the handler type: ${handlerType}`); switch (handlerType) { - case 'realmdb': + case "realmdb": handler = new RealmDBHandler(); break; - case 'iotdb': - console.error('IoTDB Handler is not implemented, yet!') + case "iotdb": + handler = new IoTDBHandler(); break; default: - throw new Error('Unsupported handler type'); + throw new Error("Unsupported handler type"); } const server = new WebSocket.Server({ port: 8080 }); @@ -23,22 +24,22 @@ const server = new WebSocket.Server({ port: 8080 }); // Define clients array globally let clients = []; -server.on('connection', (ws) => { +server.on("connection", (ws) => { console.log("Client connected"); clients.push(ws); // Add client to the array - ws.on('message', (message) => { + ws.on("message", (message) => { console.log(`Message received: ${message}`); const validatedMessage = validateMessage(message); if (validatedMessage) { handler.handleMessage(validatedMessage, ws); } else { - ws.send(JSON.stringify({ error: 'Invalid message format' })); + ws.send(JSON.stringify({ error: "Invalid message format" })); } }); - ws.on('close', () => { - console.log('Client disconnected'); + ws.on("close", () => { + console.log("Client disconnected"); // Remove disconnected client from the array clients = clients.filter((client) => client !== ws); }); @@ -53,4 +54,6 @@ const sendMessageToClients = (message) => { console.log(`Starting authentication and connection to ${handlerType} ...`); handler.authenticateAndConnect(sendMessageToClients); -console.log(`WebSocket server started on ws://localhost:8080 using ${handlerType} handler`); +console.log( + `WebSocket server started on ws://localhost:8080 using ${handlerType} handler` +); From c075e51770d0d8c2d2867f0d29f749bf2b942682 Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 31 Jul 2024 09:33:00 +0200 Subject: [PATCH 17/39] Update the authentification configuration for the IoTDB handler Add git ignore for the docker generated files Add Read method to IoTDBHandler Rename Data Type Object Apply format and remove invalid comment Optimize code to standarize the response between handlers. Repair documentation for the project configuration Add anonym data Manage Sessions Add Write method add client message data to IoTDB Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/README.md | 28 +- .../handlers/iotdb/README.md | 13 +- .../handlers/iotdb/config/MeasurementsType.js | 8 + .../handlers/iotdb/src/iotdb-handler.js | 269 +++++++++++++++-- .../handlers/iotdb/utils/IoTDBConstants.js | 10 + .../iotdb/utils/IoTDBDataInterpreter.js | 106 +++++++ .../handlers/iotdb/utils/IoTDBRpcDataSets.js | 272 ++++++++++++++++++ .../handlers/iotdb/utils/SessionDataSet.js | 135 +++++++++ .../handlers/realmdb/src/realmdb-handler.js | 46 +-- docker/.gitignore | 5 + 10 files changed, 843 insertions(+), 49 deletions(-) create mode 100644 cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js create mode 100644 cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js create mode 100644 cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js create mode 100644 cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js create mode 100644 cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js create mode 100644 docker/.gitignore diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 6b146bc..ad54fed 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -29,12 +29,36 @@ The Hello World example in our case is quite simple. We feed an updated value fo ``` ### IoTDB -- Not yet supported +- Ensure to start and run Docker containers defined in a [Docker Compose file](/docker/). +- Ensure that in the IoTDB CLI there is a `root.Vehicles` *database* like this: + ``` + IoTDB> show databases; + +-------------+----+-----------------------+---------------------+---------------------+ + | Database| TTL|SchemaReplicationFactor|DataReplicationFactor|TimePartitionInterval| + +-------------+----+-----------------------+---------------------+---------------------+ + |root.Vehicles|null| 1| 1| 604800000| + +-------------+----+-----------------------+---------------------+---------------------+ + Total line number = 1 + It costs 0.004s + ``` + +- Create two *timeseries* with the `root.Vehicles.VIN` and some VSS data. At the moment only 1 data point is supported, namely `root.Vehicles.Vehicle_Cabin_HVAC_AmbientAirTemperature`. Here you can see how the vehicle document within the *Vehicles* should look like in IoTDB CLI: + + ``` + IoTDB> show timeseries; + +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| + +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + |root.Vehicles.Vehicle_Cabin_HVAC_AmbientAirTemperature| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| + +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + ``` + ## [Start](./router/README.md#Run) the Database Router ## Look out for the Websocket Server message in the console -Now you can changed the value of `Vehicle_Cabin_HVAC_AmbientAirTemperature` in ATLAS cloud to let's say `23`. After changing you should immediately see this line in console: +If you are running the RealmDB handler and you change the value of `Vehicle_Cabin_HVAC_AmbientAirTemperature` in ATLAS cloud (let's say `23`), you should immediately see this line in console: ``` the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 diff --git a/cdsp/information-layer/handlers/iotdb/README.md b/cdsp/information-layer/handlers/iotdb/README.md index 68380ed..7f3bede 100644 --- a/cdsp/information-layer/handlers/iotdb/README.md +++ b/cdsp/information-layer/handlers/iotdb/README.md @@ -23,11 +23,14 @@ Create `config/config.js` with the following format, replacing the app id and th ```js module.exports = { - iotdbHost: "your-iotdb-host", // Default "localhost" - iotdbPort: 6667, // Set this to the appropriate IotDB Port - iotdbUser: "your-iotdb-user", // Default "root" - iotdbPassword: "your-iotdb-password", // Default "root" - timeZone: "UTC+2", // Set this to the appropriate time zone + module.exports = { + iotdbHost: "your-iotdb-host", // Default "localhost" + iotdbPort: 6667, // Set this to the appropriate IotDB Port + iotdbUser: "your-iotdb-user", // Default "root" + iotdbPassword: "your-iotdb-password", // Default "root" + timeZoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, // Set this to the appropriate time zone + fetchSize: 10000, // number of rows that will be fetched from the database at a time when executing a query + }; }; ``` diff --git a/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js b/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js new file mode 100644 index 0000000..1392f2e --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js @@ -0,0 +1,8 @@ +const JSDataType = require("../utils/IoTDBConstants"); + +const MeasurementType = Object.freeze({ + VIN: JSDataType.TEXT, + Vehicle_Cabin_HVAC_AmbientAirTemperature: JSDataType.FLOAT, +}); + +module.exports = MeasurementType; diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index 85ef9c5..2fb07c0 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -1,9 +1,18 @@ -const Thrift = require("thrift"); +const Client = require("../gen-nodejs/IClientRPCService"); +const { + TSExecuteStatementReq, + TSOpenSessionReq, + TSProtocolVersion, + TSCloseSessionReq, + TSInsertRecordReq, +} = require("../gen-nodejs/client_types"); +const thrift = require("thrift"); const Handler = require("../../handler"); -const IClientRPCService = require("../gen-nodejs/IClientRPCService"); -const ttypes = require("../gen-nodejs/client_types"); const config = require("../config/config"); -const { Session } = require("inspector"); +const SessionDataSet = require("../utils/SessionDataSet"); +const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); +const MeasurementType = require("../config/MeasurementsType"); + const sendMessageToClient = (ws, message) => { ws.send(JSON.stringify(message)); }; @@ -11,60 +20,270 @@ const sendMessageToClient = (ws, message) => { class IoTDBHandler extends Handler { constructor() { super(); - this.connection = null; this.client = null; this.sendMessageToClients = null; this.sessionId = null; - this.statementId = 0; + this.protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3; + this.statementId = null; + this.zoneId = config.timeZoneId; + this.fetchSize = config.fetchSize; + this.isSessionClosed = true; } async authenticateAndConnect(sendMessageToClients) { try { this.sendMessageToClients = sendMessageToClients; - this.connection = Thrift.createConnection( + const connection = thrift.createConnection( config.iotdbHost, config.iotdbPort, { - transport: Thrift.TFramedTransport, - protocol: Thrift.TBinaryProtocol, + transport: thrift.TFramedTransport, + protocol: thrift.TBinaryProtocol, } ); - this.client = Thrift.createClient(IClientRPCService, this.connection); + this.client = thrift.createClient(Client, connection); - this.connection.on("error", (err) => { - console.error("Thrift connection error:", err); + connection.on("error", (err) => { + console.error("thrift connection error:", err); }); - console.log("Successfully connected to IoTDB using Thrift"); - - this.open_session(); + console.log("Successfully connected to IoTDB using thrift."); } catch (error) { console.error("Failed to authenticate with IoTDB:", error); } } - async open_session() { + async read(message, ws) { + const objectId = message.data.VIN; + const sql = `SELECT * FROM root.Vehicles WHERE root.Vehicles.VIN = '${objectId}'`; try { - const openSessionReq = new ttypes.TSOpenSessionReq({ - username: config.iotdbUser, - password: config.iotdbPassword, - client_protocol: ttypes.TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3, // Set the appropriate protocol version - zoneId: config.timeZone, + await this.openSession(); + const sessionDataSet = await this.#executeQueryStatement(sql); + + // Check if the response contains data + if (sessionDataSet == {}) { + console.log("No data found in query response."); + sendMessageToClient( + ws, + JSON.stringify({ error: "No data found in query response." }) + ); + } else { + let mediaElements = []; + while (sessionDataSet.hasNext()) { + const mediaElement = sessionDataSet.next(); + mediaElements.push(mediaElement); + } + if (mediaElements.length > 0) { + for (let i = 0; i < mediaElements.length; ++i) { + const transformedObject = + IoTDBDataInterpreter.extractDeviceIdFromTimeseries( + mediaElements[i] + ); + const response = { + type: "read_response", + data: transformedObject, + }; + sendMessageToClient(ws, JSON.stringify(response)); + } + } else { + sendMessageToClient( + ws, + JSON.stringify({ error: "Object not found." }) + ); + } + } + } catch (error) { + console.error("Failed to read data from IoTDB: ", error); + } finally { + this.closeSession(); + } + } + + async write(message, ws) { + let measurements = []; + let dataTypes = []; + let values = []; + try { + await this.openSession(); + Object.entries(message.data).forEach(async ([key, value]) => { + measurements.push(key); + dataTypes.push(MeasurementType[key]); + values.push(value); }); + let deviceId = "root.Vehicles"; + const timestamp = new Date().getTime(); + const status = await this.#insertRecord( + deviceId, + timestamp, + measurements, + dataTypes, + values + ); + const response = `insert one record to device ${deviceId}, message: ${status.message}`; + console.log(response); + sendMessageToClient(ws, response); + } catch (error) { + console.error("Failed to write data from IoTDB: ", error); + } finally { + this.closeSession(); + } + } + + /** + * Opens a session with the IoTDB server using the provided credentials and configuration. + */ + async openSession() { + if (!this.isSessionClosed) { + console.info("The session is already opened."); + return; + } + const openSessionReq = new TSOpenSessionReq({ + username: config.iotdbUser, + password: config.iotdbPassword, + client_protocol: this.protocolVersion, + zoneId: config.timeZoneId, + configuration: { version: "V_0_13" }, + }); + + try { const resp = await this.client.openSession(openSessionReq); + if (this.protocolVersion != resp.serverProtocolVersion) { + console.log( + "Protocol differ, Client version is " + + this.protocolVersion + + ", but Server version is " + + resp.serverProtocolVersion + ); + // version is less than 0.10 + if (resp.serverProtocolVersion == 0) { + throw new Error("Protocol not supported."); + } + } + this.sessionId = resp.sessionId; - console.log( - "Successfully authenticated with IoTDB, session ID:", - this.sessionId + this.statementId = await this.client.requestStatementId(this.sessionId); + this.isSessionClosed = false; + console.log("Session started!"); + } catch (error) { + console.error("Failed starting session with IoTDB: ", error); + } + } + + isSessionOpen() { + return !this.isSessionClosed; + } + + closeSession() { + if (this.isSessionClosed) { + console.info("Session is already closed."); + return; + } + + let req = new TSCloseSessionReq({ + sessionId: this.sessionId, + }); + + try { + this.client.closeSession(req); + } catch (error) { + console.error( + "Error occurs when closing session at server. Maybe server is down. Error message: ", + err ); + } finally { + this.isSessionClosed = true; + console.log("Session closed!"); + } + } + + /** + * Executes a SQL query statement asynchronously. + * + * @param {string} sql - The SQL query statement to be executed. + * @returns {Promise} - Returns a SessionDataSet object if the query is successful, + * otherwise returns an empty object. + * @throws {Error} - Throws an error if the session is not open. + */ + async #executeQueryStatement(sql) { + try { + if (!this.sessionId) { + throw new Error("Session is not open. Please authenticate first."); + } + + const request = new TSExecuteStatementReq({ + sessionId: this.sessionId, + statement: sql, + statementId: this.statementId, + fetchSize: this.fetchSize, + timeout: 0, + }); + + const resp = await this.client.executeQueryStatement(request); + + if (!resp || !resp.queryDataSet || !resp.queryDataSet.valueList) { + return {}; + } else { + return new SessionDataSet( + resp.columns, + resp.dataTypeList, + resp.columnNameIndexMap, + resp.queryId, + this.client, + this.statementId, + this.sessionId, + resp.queryDataSet, + resp.ignoreTimeStamp + ); + } } catch (error) { - console.error("Failed starting session with IoTDB:", error); + console.error("Failed executing query statement: ", error); } } + + /** + * Inserts a record into the time series database. + * @param {string} deviceId - The ID of the device. + * @param {number} timestamp - The timestamp of the record. + * @param {string[]} measurements - Array of measurement names. + * @param {string[]} dataTypes - Array of data types for each value. + * @param {any[]} values - Array of values to be inserted. + * @param {boolean} isAligned - Flag indicating if the data is aligned. + * @returns {Promise} - A promise that resolves with the result of the insertion. + * @throws {string} - Throws an error if lengths of data types, values, and measurements do not match. + */ + async #insertRecord( + deviceId, + timestamp, + measurements, + dataTypes, + values, + isAligned = false + ) { + if ( + values.length != dataTypes.length || + values.length != measurements.length + ) { + throw "length of data types does not equal to length of values!"; + } + const valuesInBytes = IoTDBDataInterpreter.serializeValues( + dataTypes, + values + ); + + let request = new TSInsertRecordReq({ + sessionId: this.sessionId, + prefixPath: deviceId, + measurements: measurements, + values: valuesInBytes, + timestamp: timestamp, + isAligned: isAligned, + }); + return await this.client.insertRecord(request); + } } module.exports = IoTDBHandler; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js new file mode 100644 index 0000000..ae7073d --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js @@ -0,0 +1,10 @@ +const JSDataType = Object.freeze({ + BOOLEAN: 0, + INT32: 1, + INT64: 2, + FLOAT: 3, + DOUBLE: 4, + TEXT: 5, +}); + +module.exports = JSDataType; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js new file mode 100644 index 0000000..bb707ff --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js @@ -0,0 +1,106 @@ +const JSDataType = require("./IoTDBConstants"); + +class IoTDBDataInterpreter { + /** + * Serializes values based on the specified data types. + * @param {Array} dataTypes - Array of data types to serialize the values as. + * @param {Array} values - Array of values to be serialized. + * @returns {Buffer} - Serialized values as a Buffer. + */ + static serializeValues(dataTypes, values) { + function serializeBoolean(value) { + return [JSDataType.BOOLEAN, value]; + } + + function serializeInt32(value) { + const int32 = new Int32Array([value]); + const uint8 = new Uint8Array(int32.buffer).reverse(); + return [JSDataType.INT32, ...uint8]; + } + + function serializeInt64(value) { + const bigint64 = new BigInt64Array([value]); + const uint8 = new Uint8Array(bigint64.buffer).reverse(); + return [JSDataType.INT64, ...uint8]; + } + + function serializeFloat(value) { + const float32 = new Float32Array([value]); + const uint8 = new Uint8Array(float32.buffer).reverse(); + return [JSDataType.FLOAT, ...uint8]; + } + + function serializeDouble(value) { + const float64 = new Float64Array([value]); + const uint8 = new Uint8Array(float64.buffer).reverse(); + return [JSDataType.DOUBLE, ...uint8]; + } + + function serializeText(value) { + const utf8arr = Buffer.from(value); + const int32 = new Uint32Array([utf8arr.length]); + const uint8 = new Uint8Array(int32.buffer).reverse(); + return [JSDataType.TEXT, ...uint8, ...utf8arr]; + } + + const serializedValues = []; + + for (let i = 0; i < dataTypes.length; i++) { + switch (dataTypes[i]) { + case JSDataType.BOOLEAN: + serializedValues.push(...serializeBoolean(values[i])); + break; + case JSDataType.INT32: + serializedValues.push(...serializeInt32(values[i])); + break; + case JSDataType.INT64: + serializedValues.push(...serializeInt64(values[i])); + break; + case JSDataType.FLOAT: + serializedValues.push(...serializeFloat(values[i])); + break; + case JSDataType.DOUBLE: + serializedValues.push(...serializeDouble(values[i])); + break; + case JSDataType.TEXT: + serializedValues.push(...serializeText(values[i])); + break; + default: + throw new Error("Unsupported data type"); + } + } + return Buffer.from(serializedValues); + } + + /** + * Transforms an object by extracting and renaming keys that start with device id 'root.Vehicles.'. + * + * @param {Object} obj - The input object to be transformed. + * @returns {Object} - A new object with keys that were prefixed with 'root.Vehicles.' renamed to their last segment. + */ + static extractDeviceIdFromTimeseries(obj) { + return Object.entries(obj).reduce((acc, [key, value]) => { + if (key.startsWith("root.Vehicles.")) { + const newKey = key.split(".").pop(); // Get the last part of the key + acc[newKey] = value; + } + return acc; + }, {}); + } + + /** + * This function converts a buffer to a BigInt64Array and extracts the timestamp. + * + * @param {Buffer} buffer - The buffer containing the timestamp. + * @returns {{ timestamp: BigInt }} An object containing the extracted timestamp. + */ + static extractTimestamp(buffer) { + const reverseBuffer = Buffer.from(buffer.subarray(0, 8).reverse()); + const uinit8Buffer = new Uint8Array(reverseBuffer).buffer; + const timestamp = new BigInt64Array(uinit8Buffer)[0]; + + return { timestamp }; + } +} + +module.exports = { IoTDBDataInterpreter }; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js new file mode 100644 index 0000000..c58419e --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js @@ -0,0 +1,272 @@ +const JSDataType = require("./IoTDBConstants"); +class IoTDBRpcDataSet { + // Static properties + static TIMESTAMP_STR = "Time"; + static START_INDEX = 2; + static FLAG = 0x80; + + // Private fields + #sql; + #columnNameList; + #columnTypeList; + #queryId; + #client; + #statementId; + #sessionId; + #queryDataSet; + #ignoreTimestamp; + #fetchSize; + #columnOrdinalDict; + #columnTypeDeduplicatedList; + #timeBytes; + #currentBitmap; + #hasCachedRecord; + #value; + #emptyResultSet; + #rowsIndex; + #columnSize; + + constructor( + columnNameList, + columnTypeList, + columnNameIndex, + queryId, + client, + statementId, + sessionId, + queryDataSet, + ignoreTimestamp, + fetchSize + ) { + this.#columnNameList = []; + this.#columnTypeList = []; + this.#queryId = queryId; + this.#client = client; + this.#statementId = statementId; + this.#sessionId = sessionId; + this.#queryDataSet = queryDataSet; + this.#ignoreTimestamp = ignoreTimestamp; + this.#fetchSize = fetchSize; + this.#columnSize = columnNameList.length; + this.#columnOrdinalDict = new Map(); + this.#columnTypeDeduplicatedList = []; + this.#hasCachedRecord = false; + this.#emptyResultSet = false; + this.#rowsIndex = 0; + + if (!ignoreTimestamp) { + this.#columnNameList.push(IoTDBRpcDataSet.TIMESTAMP_STR); + this.#columnTypeList.push(JSDataType.INT64); + this.#columnOrdinalDict.set(IoTDBRpcDataSet.TIMESTAMP_STR, 1); + } + + if (columnNameIndex !== null) { + // Initialize deduplicated list + for (let j = 0; j < columnNameIndex.length; j++) { + this.#columnTypeDeduplicatedList.push(null); + } + + // Populate column_name_list and column_type_list + for (let i = 0; i < columnNameList.length; i++) { + let name = columnNameList[i]; + this.#columnNameList.push(name); + this.#columnTypeList.push(JSDataType[columnTypeList[i]]); + + if (!this.#columnOrdinalDict.has(name)) { + let index = columnNameIndex[name]; + this.#columnOrdinalDict.set( + name, + index + IoTDBRpcDataSet.START_INDEX + ); + this.#columnTypeDeduplicatedList[index] = + JSDataType[columnTypeList[i]]; + } + } + } + + this.#timeBytes = Buffer.alloc(0); + this.#currentBitmap = Array(this.#columnTypeDeduplicatedList.length).fill( + Buffer.alloc(0) + ); + this.#value = Array(this.#columnTypeDeduplicatedList.length).fill(null); + } + + /** + * Advances the cursor to the next row in the result set. + * + * @returns {boolean} - Returns true if the cursor was successfully advanced to the next row, + * or if there are no more rows in the result set. Returns false if + * there are no more rows and no cached results. + */ + next() { + if (this.#hasCachedResult()) { + this.#constructOneRow(); + return true; + } + if (this.#emptyResultSet) { + return true; + } + if (this.#fetchResults()) { + this.#constructOneRow(); + return true; + } + return false; + } + + getHasCachedRecord() { + return this.#hasCachedRecord; + } + + setHasCachedRecord(value) { + this.#hasCachedRecord = value; + } + + getTimeBytes() { + return this.#timeBytes; + } + + getColumnSize() { + return this.#columnSize; + } + + getIgnoreTimestamp() { + return this.#ignoreTimestamp; + } + + getColumnNames() { + return this.#columnNameList; + } + + getColumnOrdinalDict() { + return this.#columnOrdinalDict; + } + + /** + * Checks if the value at the specified column index is null. + * + * @param {number} columnIndex - The index of the column to check. + * @returns {boolean} - Returns true if the value at the specified column index is null, otherwise false. + */ + isNullByIndex(columnIndex) { + let index = + this.#columnOrdinalDict.get(this.findColumnNameByIndex(columnIndex)) - + IoTDBRpcDataSet.START_INDEX; + + // time column will never be null + if (index < 0) { + return true; + } + return this.#isNull(index, this.#rowsIndex - 1); + } + + getValues() { + return this.#value; + } + + getColumnTypeDeduplicatedList() { + return this.#columnTypeDeduplicatedList; + } + + /** + * Finds the column name by its index. + * @param {number} columnIndex - The index of the column (starting from 1). + * @returns {string} The name of the column corresponding to the index. + * @throws {Error} If the column index is less than or equal to 0 or greater than the number of columns. + */ + findColumnNameByIndex(columnIndex) { + if (columnIndex <= 0) { + throw new Error("Column index should start from 1"); + } + if (columnIndex > this.#columnNameList.length) { + throw new Error("Column index out of range"); + } + return this.#columnNameList[columnIndex - 1]; + } + + /** + * Checks if there is a cached result available. + * + * @returns {boolean} True if there is a cached result, otherwise false. + */ + #hasCachedResult() { + return this.#queryDataSet !== null && this.#queryDataSet.time.length != 0; + } + + /** + * Constructs one row of data by reading from the dataset buffers. + * This method updates the internal state of the object by reading + * time, bitmap, and value buffers, and discarding the bytes that have been read. + */ + #constructOneRow() { + // Simulating buffer, read 8 bytes from data set and discard first 8 bytes which have been read. + this.#timeBytes = this.#queryDataSet.time.slice(0, 8); + this.#queryDataSet.time = this.#queryDataSet.time.slice(8); + + for (let i = 0; i < this.#queryDataSet.bitmapList.length; i++) { + let bitmapBuffer = this.#queryDataSet.bitmapList[i]; + + // Another 8 new rows, should move the bitmap buffer position to next byte. + if (this.#rowsIndex % 8 === 0) { + this.#currentBitmap[i] = bitmapBuffer[0]; + this.#queryDataSet.bitmapList[i] = bitmapBuffer.slice(1); + } + + if (!this.#isNull(i, this.#rowsIndex)) { + let valueBuffer = this.#queryDataSet.valueList[i]; + let dataType = this.#columnTypeDeduplicatedList[i]; + + // Simulating buffer based on data type. + switch (dataType) { + case JSDataType.BOOLEAN: + this.#value[i] = valueBuffer.slice(0, 1); + this.#queryDataSet.valueList[i] = valueBuffer.slice(1); + break; + case JSDataType.INT32: + this.#value[i] = valueBuffer.slice(0, 4); + this.#queryDataSet.valueList[i] = valueBuffer.slice(4); + break; + case JSDataType.INT64: + this.#value[i] = valueBuffer.slice(0, 8); + this.#queryDataSet.valueList[i] = valueBuffer.slice(8); + break; + case JSDataType.FLOAT: + this.#value[i] = valueBuffer.slice(0, 4); + this.#queryDataSet.valueList[i] = valueBuffer.slice(4); + break; + case JSDataType.DOUBLE: + this.#value[i] = valueBuffer.slice(0, 8); + this.#queryDataSet.valueList[i] = valueBuffer.slice(8); + break; + case JSDataType.TEXT: + let length = valueBuffer.readInt32BE(0); + this.#value[i] = valueBuffer.slice(4, 4 + length); + this.#queryDataSet.valueList[i] = valueBuffer.slice(4 + length); + break; + default: + throw new Error("Unsupported data type."); + } + } + } + this.#rowsIndex += 1; + this.#hasCachedRecord = true; + } + + /** + * Checks if the value at the specified index and row number is null. + * + * @param {number} index - The index in the bitmap array. + * @param {number} rowNum - The row number to check. + * @returns {boolean} - Returns true if the value is null, otherwise false. + */ + #isNull(index, rowNum) { + let bitmap = this.#currentBitmap[index]; + let shift = rowNum % 8; + return ((IoTDBRpcDataSet.FLAG >> shift) & (bitmap & 0xff)) === 0; + } + + #fetchResults() { + this.#rowsIndex = 0; + } +} + +module.exports = IoTDBRpcDataSet; diff --git a/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js b/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js new file mode 100644 index 0000000..fbb1dd4 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js @@ -0,0 +1,135 @@ +const JSDataType = require("./IoTDBConstants"); +const IoTDBRpcDataSet = require("./IoTDBRpcDataSets"); +const { IoTDBDataInterpreter } = require("./IoTDBDataInterpreter"); + +const dataTypeProcessors = { + [JSDataType.BOOLEAN]: (bytes) => + new Int8Array(new Uint8Array(bytes.slice(0, 1).reverse()).buffer)[0], + [JSDataType.INT32]: (bytes) => + new Int32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], + [JSDataType.INT64]: (bytes) => + new BigInt64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], + [JSDataType.FLOAT]: (bytes) => + new Float32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], + [JSDataType.DOUBLE]: (bytes) => + new Float64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], + [JSDataType.TEXT]: (bytes) => bytes.toString(), +}; + +class SessionDataSet { + /** + * Constructor for initializing the class with the provided parameters. + * + * @param {Array} columnNameList - List of column names. + * @param {Array} columnTypeList - List of column types. + * @param {Object} columnNameIndex - Index mapping of column names. + * @param {string} queryId - Unique identifier for the query. + * @param {Object} client - Client instance for database connection. + * @param {string} statementId - Unique identifier for the statement. + * @param {string} sessionId - Unique identifier for the session. + * @param {Object} queryDataSet - Data set returned from the query. + * @param {boolean} ignoreTimestamp - Flag to determine if timestamps should be ignored. + */ + constructor( + columnNameList, + columnTypeList, + columnNameIndex, + queryId, + client, + statementId, + sessionId, + queryDataSet, + ignoreTimestamp + ) { + this.iotdbRpcDataSet = new IoTDBRpcDataSet( + columnNameList, + columnTypeList, + columnNameIndex, + queryId, + client, + statementId, + sessionId, + queryDataSet, + ignoreTimestamp, + 1024 // Buffer size or default value + ); + } + + /** + * Checks if there is a next element in the IoTDB RPC DataSet. + * + * @returns {boolean} True if there is a next element, otherwise false. + */ + hasNext() { + return this.iotdbRpcDataSet.next(); + } + + /** + * Retrieves the next row record from the dataset. + * If there is no cached record, checks if there is a next record available. + * If there is no next record available, returns null. + * Resets the cached record flag after retrieving the record. + * @returns {Object|null} The next row record or null if no more records are available. + */ + next() { + if (!this.iotdbRpcDataSet.getHasCachedRecord()) { + if (!this.hasNext()) { + return null; + } + } + this.iotdbRpcDataSet.setHasCachedRecord(false); + + return this.constructRowRecordFromValueArray(); + } + + /** + * Constructs a row record from a value array. + * + * This function processes the IoTDB RPC dataset to extract and convert + * the timestamp and column values into a structured object. + * + * @returns {Object} The constructed row record with timestamp and column values. + */ + constructRowRecordFromValueArray() { + let time64 = IoTDBDataInterpreter.extractTimestamp( + this.iotdbRpcDataSet.getTimeBytes() + ); + let obj = { timestamp: time64 }; + + for (let i = 0; i < this.iotdbRpcDataSet.getColumnSize(); ++i) { + let index = i + 1; + let dataSetColumnIndex = i + IoTDBRpcDataSet.START_INDEX; + + if (this.iotdbRpcDataSet.getIgnoreTimestamp()) { + index -= 1; + dataSetColumnIndex -= 1; + } + + let columnName = this.iotdbRpcDataSet.getColumnNames()[index]; + let location = + this.iotdbRpcDataSet.getColumnOrdinalDict().get(columnName) - + IoTDBRpcDataSet.START_INDEX; + + if (!this.iotdbRpcDataSet.isNullByIndex(dataSetColumnIndex)) { + let valueBytes = this.iotdbRpcDataSet.getValues()[location]; + let dataType = + this.iotdbRpcDataSet.getColumnTypeDeduplicatedList()[location]; + let tsName = + this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); + + if (dataTypeProcessors[dataType]) { + obj[tsName] = dataTypeProcessors[dataType](valueBytes); + } else { + throw new Error("Unsupported data type."); + } + } else { + let tsName = + this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); + obj[tsName] = null; + } + } + return obj; + } +} + +module.exports = SessionDataSet; diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index 7ef679d..e67b295 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -1,5 +1,5 @@ const Realm = require("realm"); -const Handler = require('../../handler') +const Handler = require("../../handler"); const config = require("../config/config"); const { v4: uuidv4 } = require("uuid"); // Importing UUID generator @@ -50,9 +50,11 @@ class RealmDBHandler extends Handler { const MediaElements = this.realm.objects("Vehicles").subscribe(); // TODO: Is it necessary to log this, extra function? if (MediaElements) { - console.log(MediaElements); + console.log(MediaElements); } else { - this.sendMessageToClients({ error: "Vehicles collection not found for subscription"}); + this.sendMessageToClients({ + error: "Vehicles collection not found for subscription", + }); } } catch (error) { console.error("Failed to authenticate with Realm:", error); @@ -60,8 +62,8 @@ class RealmDBHandler extends Handler { } async read(message, ws) { - try{ - const objectId = message.data.Vin; // Retrieve objectId from config file + try { + const objectId = message.data.Vin; const MediaElement = this.realm.objectForPrimaryKey("Vehicles", objectId); if (MediaElement) { const response = { @@ -70,32 +72,40 @@ class RealmDBHandler extends Handler { }; sendMessageToClient(ws, JSON.stringify(response)); } else { - sendMessageToClient(ws, JSON.stringify({ error: 'Object not found' })); + sendMessageToClient(ws, JSON.stringify({ error: "Object not found" })); } } catch (error) { console.error("Error reading object from Realm:", error); - sendMessageToClient(ws, JSON.stringify({ error: 'Error reading object' })); + sendMessageToClient( + ws, + JSON.stringify({ error: "Error reading object" }) + ); } } - async subscribe(message, ws) { + async subscribe(message, ws) { try { const objectId = message.data.Vin; - console.log(`Subscribing element: ${objectId}`) - const MediaElement = await this.realm.objectForPrimaryKey("Vehicles", objectId); + console.log(`Subscribing element: ${objectId}`); + const MediaElement = await this.realm.objectForPrimaryKey( + "Vehicles", + objectId + ); if (MediaElement) { const websocketId = String(objectId); MediaElement.addListener((MediaElement, changes) => this.onMediaElementChange(MediaElement, changes, websocketId) ); - sendMessageToClient(ws, { success: `Subscribed to changes for object ID ${objectId}` }) + sendMessageToClient(ws, { + success: `Subscribed to changes for object ID ${objectId}`, + }); } else { - sendMessageToClient(ws, JSON.stringify({ error: 'Object not found' })); + sendMessageToClient(ws, JSON.stringify({ error: "Object not found" })); } } catch (error) { console.error("Error subscribing to object changes in Realm:", error); - sendMessageToClient(ws, { error: 'Error subscribing to object changes' }); + sendMessageToClient(ws, { error: "Error subscribing to object changes" }); } } @@ -104,11 +114,13 @@ class RealmDBHandler extends Handler { console.log(`MediaElement is deleted: ${changes.deleted}`); } else { changes.changedProperties.forEach((prop) => { - console.log(`* the value of "${prop}" changed to ${MediaElement[prop]}`); + console.log( + `* the value of "${prop}" changed to ${MediaElement[prop]}` + ); // Generate a meaningful UUID for WebSocket response const uuid = uuidv4(); - + const message = { type: "update", tree: "VSS", @@ -117,7 +129,7 @@ class RealmDBHandler extends Handler { dateTime: new Date().toISOString(), node: { name: prop, // Sending the property name as node name - value: MediaElement[prop], // Sending the property value as node value + value: MediaElement[prop], // Sending the property value as node value }, }; this.sendMessageToClients(message); @@ -126,4 +138,4 @@ class RealmDBHandler extends Handler { } } -module.exports = RealmDBHandler; \ No newline at end of file +module.exports = RealmDBHandler; diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 0000000..b8ed0da --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1,5 @@ +# Docker generated files +data/ +logs/ + + From 684f3f90c25fd7896ee28ad609f01e3582e140ad Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 7 Aug 2024 15:31:15 +0200 Subject: [PATCH 18/39] Add validator for message format and IoTDB message processing Return messages to all clients when write in IoTDB Update IoTDB supported fields and documentation Update read dependencies and send error to clients Add read messaging in RealmDB Resolve Ajv warining about fields with multiple types Add subcribe message handling Remove unused import Repair findings Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/README.md | 137 +++++++-- cdsp/information-layer/handlers/handler.js | 54 ++-- .../handlers/iotdb/README.md | 14 +- .../handlers/iotdb/config/Database.js | 11 + .../handlers/iotdb/config/MeasurementsType.js | 8 +- .../handlers/iotdb/src/iotdb-handler.js | 261 ++++++++++++++---- .../handlers/realmdb/README.md | 32 +-- .../handlers/realmdb/config/Database.js | 11 + .../realmdb/config/RealmConfiguration.js | 32 +++ .../handlers/realmdb/src/realmdb-handler.js | 240 +++++++++++----- cdsp/information-layer/router/README.md | 1 - cdsp/information-layer/router/package.json | 1 + .../router/src/websocket-server.js | 11 +- .../router/utils/message-validator.js | 142 +++++++++- 14 files changed, 728 insertions(+), 227 deletions(-) create mode 100644 cdsp/information-layer/handlers/iotdb/config/Database.js create mode 100644 cdsp/information-layer/handlers/realmdb/config/Database.js create mode 100644 cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index ad54fed..bdeca09 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -11,21 +11,24 @@ Setting up an information layer in the CDSP involves running a [Database-Router] Please follow installation instructions of the chosen [handler](./handlers/). -## [Installation of Database-Router](./router/README.md#Install) +## Installation of Database-Router +See [hier](./router/README.md#Install) how to install the Database-Router. # Running "Hello World" example -The Hello World example in our case is quite simple. We feed an updated value for the HVAC ambient air temperature into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. +The Hello World example in our case is quite simple. We feed an updated value for the `CurrentLocation_Longitude` into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. ## Choose and prepare your Database ### Realm -- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `_id: 1234567` in a collection named *Vehicles*. -- Ensure that this document as well contains VSS data. At the moment only 1 data point is supported, namely `Vehicle.Cabin.HVAC.AmbientAirTemperature`. Here you can see how the vehicle document within the *Vehicles* should look like in ATLAS: - - ``` - _id: 1234567 (Int64) - Vehicle_Cabin_HVAC_AmbientAirTemperature: 6 (Double) +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `VehicleIdentification_VIN: SMT905JN26J262542` in a collection named *`Vehicles`*. +- Ensure that this document as well contains VSS data. Here you can see the supported data in a vehicle document within the *Vehicles* should look like in ATLAS: + + ``` + _id: "" (string) + VehicleIdentification_VIN: "" (string) + CurrentLocation_Latitude: (Int64) + CurrentLocation_Longitude: (Int64) ``` ### IoTDB @@ -43,26 +46,122 @@ The Hello World example in our case is quite simple. We feed an updated value fo It costs 0.004s ``` -- Create two *timeseries* with the `root.Vehicles.VIN` and some VSS data. At the moment only 1 data point is supported, namely `root.Vehicles.Vehicle_Cabin_HVAC_AmbientAirTemperature`. Here you can see how the vehicle document within the *Vehicles* should look like in IoTDB CLI: +- Create two *timeseries* with the `root.Vehicles.VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the *Vehicles* should look like in IoTDB CLI: ``` IoTDB> show timeseries; - +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| - +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - |root.Vehicles.Vehicle_Cabin_HVAC_AmbientAirTemperature| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| - +------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| + +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + |root.Vehicles.VehicleIdentification_VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| + | root.Vehicles.CurrentLocation_Latitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| + |root.Vehicles.CurrentLocation_Longitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| + +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ ``` -## [Start](./router/README.md#Run) the Database Router +## Start the Database Router + +See [here](./router/README.md#Run) how to start the database router. ## Look out for the Websocket Server message in the console -If you are running the RealmDB handler and you change the value of `Vehicle_Cabin_HVAC_AmbientAirTemperature` in ATLAS cloud (let's say `23`), you should immediately see this line in console: +If you the handler is running and you are subscribed to that element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: ``` -the value of "Vehicle_Cabin_HVAC_AmbientAirTemperature" changed to 23 +{ + type: 'update', + tree: 'VSS', + id: '', + dateTime: '', + uuid: '', + node: { name: 'CurrentLocation_Longitude', value: `-157845.68200000003` } +} ``` -## Connect your own Websocket Client +# Connect your own Websocket Client Connect your own websocket client by connecting to `ws://localhost:8080` + +The examples use the VIN (Vehicle Identification Number) as object identifier. + +### Reading data + +To read data, send a message with the type of request and VIN as object ID: + + * Example for one Node: + ```json + { + "type": "read", + "tree": "VSS", + "id": "", + "uuid": "", + "node": { + "name": "" + } + } + ``` + * Example for multiple Nodes: + ```json + { + "type": "read", + "tree": "VSS", + "id": "", + "uuid": "", + "nodes": [ + { + "name": "" + }, + { + "name": "" + } + ] + } + ``` + +### Writing data + +To write data, send a message with the type of request and VIN as object ID (at this moment only with IoTDB available): + + * Example for one Node: + ```json + { + "type": "write", + "tree": "VSS", + "id": "", + "uuid": "", + "node": { + "name": "", + "value": "" + } + } + ``` + * Example for multiple Nodes: + ```json + { + "type": "write", + "tree": "VSS", + "id": "", + "uuid": "", + "nodes": [ + { + "name": "", + "value": "" + }, + { + "name": "", + "value": "" + } + ] + } + ``` +### Subscribing to changes + +To subscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): + + ```json + { + "type": "subscribe", + "tree": "VSS", + "id": "", + "uuid": "", + } + ``` + diff --git a/cdsp/information-layer/handlers/handler.js b/cdsp/information-layer/handlers/handler.js index f66eaed..6ed6f62 100644 --- a/cdsp/information-layer/handlers/handler.js +++ b/cdsp/information-layer/handlers/handler.js @@ -1,35 +1,35 @@ class Handler { - authenticateAndConnect(sendMessageToClients) { - throw new Error("Method 'authenticateAndConnect' must be implemented."); - } + authenticateAndConnect(sendMessageToClients) { + throw new Error("Method 'authenticateAndConnect' must be implemented."); + } - handleMessage(message, ws) { - switch (message.type) { - case 'read': - this.read(message, ws); - break; - case 'write': - this.write(message, ws); - break; - case 'subscribe': - this.subscribe(message, ws); - break; - default: - ws.send(JSON.stringify({ error: 'Unknown message type'})) - } + handleMessage(message, ws) { + switch (message.type) { + case "read": + this.read(message, ws); + break; + case "write": + this.write(message, ws); + break; + case "subscribe": + this.subscribe(message, ws); + break; + default: + ws.send(JSON.stringify({ error: "Unknown message type" })); } + } - read(message, ws) { - throw new Error('Read method not implemented, yet!') - } + read(message, ws) { + throw new Error("Read method not implemented, yet!"); + } - write(message, ws) { - throw new Error('Write method not implemented, yet!') - } + write(message, ws) { + throw new Error("Write method not implemented, yet!"); + } - subscribe(message, ws) { - throw new Error('Subscribe method not implemented, yet!') - } + subscribe(message, ws) { + throw new Error("Subscribe method not implemented, yet!"); + } } -module.exports = Handler; \ No newline at end of file +module.exports = Handler; diff --git a/cdsp/information-layer/handlers/iotdb/README.md b/cdsp/information-layer/handlers/iotdb/README.md index 7f3bede..430d176 100644 --- a/cdsp/information-layer/handlers/iotdb/README.md +++ b/cdsp/information-layer/handlers/iotdb/README.md @@ -23,14 +23,12 @@ Create `config/config.js` with the following format, replacing the app id and th ```js module.exports = { - module.exports = { - iotdbHost: "your-iotdb-host", // Default "localhost" - iotdbPort: 6667, // Set this to the appropriate IotDB Port - iotdbUser: "your-iotdb-user", // Default "root" - iotdbPassword: "your-iotdb-password", // Default "root" - timeZoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, // Set this to the appropriate time zone - fetchSize: 10000, // number of rows that will be fetched from the database at a time when executing a query - }; + iotdbHost: "your-iotdb-host", // Default "localhost" + iotdbPort: 6667, // Set this to the appropriate IotDB Port + iotdbUser: "your-iotdb-user", // Default "root" + iotdbPassword: "your-iotdb-password", // Default "root" + timeZoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, // Set this to the appropriate time zone + fetchSize: 10000, // number of rows that will be fetched from the database at a time when executing a query }; ``` diff --git a/cdsp/information-layer/handlers/iotdb/config/Database.js b/cdsp/information-layer/handlers/iotdb/config/Database.js new file mode 100644 index 0000000..01d5a88 --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/config/Database.js @@ -0,0 +1,11 @@ +/* + * Contains the definition of the database name and its identifier endpoint for each catalog. + */ +const Database = Object.freeze({ + VSS: { + database_name: "root.Vehicles", // name of the configured IoTDB for the VSS Database + endpoint_id: "VehicleIdentification_VIN", // endpoint used as element ID + }, +}); + +module.exports = Database; diff --git a/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js b/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js index 1392f2e..bc991b9 100644 --- a/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js +++ b/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js @@ -1,8 +1,12 @@ const JSDataType = require("../utils/IoTDBConstants"); +/* + * Define the supported endpoints and the corresponding data types. + */ const MeasurementType = Object.freeze({ - VIN: JSDataType.TEXT, - Vehicle_Cabin_HVAC_AmbientAirTemperature: JSDataType.FLOAT, + VehicleIdentification_VIN: JSDataType.TEXT, + CurrentLocation_Latitude: JSDataType.DOUBLE, + CurrentLocation_Longitude: JSDataType.DOUBLE, }); module.exports = MeasurementType; diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index 2fb07c0..46f0a93 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -12,11 +12,95 @@ const config = require("../config/config"); const SessionDataSet = require("../utils/SessionDataSet"); const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); const MeasurementType = require("../config/MeasurementsType"); +const Database = require("../config/Database"); const sendMessageToClient = (ws, message) => { ws.send(JSON.stringify(message)); }; +/** + * Extracts endpoint names from the given message. + * + * This function checks if the message has a single node or multiple nodes and + * extracts the names accordingly. + * + * @param {Object} message - The message containing node(s). + * @returns {Array} An array of endpoint names. + */ +function extractEndpointsFromNodes(message) { + let endpoints = []; + if (message.node) { + endpoints.push(message.node.name); + } else if (message.nodes) { + endpoints = message.nodes.map((node) => node.name); + } + return endpoints; +} + +/** + * Creates an object to insert data in IoTDB based on the provided message. + * + * @param {Object} message - The message containing data to be inserted. + * @returns {Object} The data object to be inserted. + */ +function createObjectToInsert(message) { + const data = { VehicleIdentification_VIN: message.id }; + if (message.node) { + data[message.node.name] = message.node.value; + } else if (message.nodes) { + message.nodes.forEach((node) => { + data[node.name] = node.value; + }); + } + return data; +} + +/** + * Creates an update message object based on the provided message and response nodes. + * + * @param {Object} message - The original message object containing tree, id, and uuid properties. + * @param {Array} responseNodes - An array of response nodes to be included in the update message. + * @returns {Object} The constructed update message object. + */ +function createUpdateMessage(message, responseNodes) { + let updateMessage = { + type: "update", + tree: message.tree, + id: message.id, + dateTime: new Date().toISOString(), + uuid: message.uuid, + }; + if (responseNodes.length == 1) { + updateMessage["node"] = responseNodes[0]; + } else { + updateMessage["nodes"] = responseNodes; + } + return updateMessage; +} + +/** + * Creates a read message object based on the provided message and nodes names. + * + * @param {Object} message - The message object containing tree, id, and uuid properties. + * @param {Array} nodeNames - An array of node names. If the array contains one field, it will be added as 'node'. + * If the array contains multiple fields, they will be added as 'nodes'. + * @returns {Object} The constructed read message object. + */ +function createReadMessage(message, nodeNames) { + let readMessage = { + type: "read", + tree: message.tree, + id: message.id, + uuid: message.uuid, + }; + if (nodeNames.length == 1) { + readMessage["node"] = nodeNames[0]; + } else { + readMessage["nodes"] = nodeNames; + } + return readMessage; +} + class IoTDBHandler extends Handler { constructor() { super(); @@ -56,48 +140,19 @@ class IoTDBHandler extends Handler { } async read(message, ws) { - const objectId = message.data.VIN; - const sql = `SELECT * FROM root.Vehicles WHERE root.Vehicles.VIN = '${objectId}'`; try { - await this.openSession(); - const sessionDataSet = await this.#executeQueryStatement(sql); - - // Check if the response contains data - if (sessionDataSet == {}) { - console.log("No data found in query response."); - sendMessageToClient( - ws, - JSON.stringify({ error: "No data found in query response." }) - ); - } else { - let mediaElements = []; - while (sessionDataSet.hasNext()) { - const mediaElement = sessionDataSet.next(); - mediaElements.push(mediaElement); - } - if (mediaElements.length > 0) { - for (let i = 0; i < mediaElements.length; ++i) { - const transformedObject = - IoTDBDataInterpreter.extractDeviceIdFromTimeseries( - mediaElements[i] - ); - const response = { - type: "read_response", - data: transformedObject, - }; - sendMessageToClient(ws, JSON.stringify(response)); - } - } else { - sendMessageToClient( - ws, - JSON.stringify({ error: "Object not found." }) - ); - } - } + await this.#openSessionIfNeeded(); + const responseMessage = await this.#queryLastFields(message, ws); + console.log(responseMessage); + sendMessageToClient(ws, JSON.stringify(responseMessage)); } catch (error) { console.error("Failed to read data from IoTDB: ", error); + sendMessageToClient( + ws, + JSON.stringify({ error: "Error reading object" }) + ); } finally { - this.closeSession(); + this.#closeSessionIfNeeded(); } } @@ -105,15 +160,30 @@ class IoTDBHandler extends Handler { let measurements = []; let dataTypes = []; let values = []; + try { - await this.openSession(); - Object.entries(message.data).forEach(async ([key, value]) => { + await this.#openSessionIfNeeded(); + const data = createObjectToInsert(message); + const errorUndefinedTypes = []; + + for (const [key, value] of Object.entries(data)) { + const dataType = MeasurementType[key]; + if (dataType == undefined) { + errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); + continue; + } measurements.push(key); dataTypes.push(MeasurementType[key]); values.push(value); - }); - let deviceId = "root.Vehicles"; + } + + if (errorUndefinedTypes.length > 0) { + errorUndefinedTypes.forEach((error) => console.error(error)); + throw new Error("One or more endpoints are not supported."); + } + const timestamp = new Date().getTime(); + const deviceId = Database[message.tree].database_name; const status = await this.#insertRecord( deviceId, timestamp, @@ -122,24 +192,40 @@ class IoTDBHandler extends Handler { values ); - const response = `insert one record to device ${deviceId}, message: ${status.message}`; - console.log(response); - sendMessageToClient(ws, response); + const response = `insert one record to device ${deviceId}, status: `; + console.log(response, status); + + let keyList = []; + measurements.forEach((key) => { + keyList.push({ name: key }); + }); + + const readMessage = createReadMessage(message, keyList); + console.log(readMessage); + + const responseMessage = await this.#queryLastFields(message, ws); + console.log(responseMessage); + this.sendMessageToClients(responseMessage); } catch (error) { console.error("Failed to write data from IoTDB: ", error); + sendMessageToClient( + ws, + JSON.stringify({ error: "Error writing object" }) + ); } finally { - this.closeSession(); + this.#closeSessionIfNeeded(); } } /** * Opens a session with the IoTDB server using the provided credentials and configuration. */ - async openSession() { + async #openSession() { if (!this.isSessionClosed) { console.info("The session is already opened."); return; } + const openSessionReq = new TSOpenSessionReq({ username: config.iotdbUser, password: config.iotdbPassword, @@ -173,11 +259,10 @@ class IoTDBHandler extends Handler { } } - isSessionOpen() { - return !this.isSessionClosed; - } - - closeSession() { + /** + * Closes the current session if it is not already closed. + */ + #closeSession() { if (this.isSessionClosed) { console.info("Session is already closed."); return; @@ -192,7 +277,7 @@ class IoTDBHandler extends Handler { } catch (error) { console.error( "Error occurs when closing session at server. Maybe server is down. Error message: ", - err + error ); } finally { this.isSessionClosed = true; @@ -200,6 +285,18 @@ class IoTDBHandler extends Handler { } } + async #openSessionIfNeeded() { + if (this.isSessionClosed) { + await this.#openSession(); + } + } + + async #closeSessionIfNeeded() { + if (!this.isSessionClosed) { + this.#closeSession(); + } + } + /** * Executes a SQL query statement asynchronously. * @@ -284,6 +381,64 @@ class IoTDBHandler extends Handler { }); return await this.client.insertRecord(request); } + + /** + * Queries the last inserted fields from the database based on the provided message and sends the result back. + * + * @param {Object} message - The message object containing the query parameters. + * @param {WebSocket} ws - The WebSocket connection to send the response back to the client. + * @returns {Promise} - A promise that resolves when the query is complete and the response is sent. + * @throws {Error} - Throws an error if the query execution fails. + */ + async #queryLastFields(message, ws) { + const objectId = message.id; + const databaseName = Database[message.tree].database_name; + const endpointId = Database[message.tree].endpoint_id; + const fieldsToSearch = extractEndpointsFromNodes(message).join(", "); + const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time DESC LIMIT 1`; + + try { + const sessionDataSet = await this.#executeQueryStatement(sql); + + // Check if the response contains data + if (sessionDataSet == {}) { + console.log("No data found in query response."); + sendMessageToClient( + ws, + JSON.stringify({ error: "No data found in query response." }) + ); + } else { + let mediaElements = []; + while (sessionDataSet.hasNext()) { + const mediaElement = sessionDataSet.next(); + mediaElements.push(mediaElement); + } + + let responseNodes = []; + + if (mediaElements.length > 0) { + for (let i = 0; i < mediaElements.length; ++i) { + const transformedObject = + IoTDBDataInterpreter.extractDeviceIdFromTimeseries( + mediaElements[i] + ); + const entries = Object.entries(transformedObject); + entries.forEach(([key, value]) => { + responseNodes.push({ name: key, value: value }); + }); + } + return createUpdateMessage(message, responseNodes); + } else { + sendMessageToClient( + ws, + JSON.stringify({ error: "Object not found." }) + ); + } + } + } catch (error) { + throw new Error(error); + } + } } module.exports = IoTDBHandler; diff --git a/cdsp/information-layer/handlers/realmdb/README.md b/cdsp/information-layer/handlers/realmdb/README.md index 0166ebf..e23a4bb 100644 --- a/cdsp/information-layer/handlers/realmdb/README.md +++ b/cdsp/information-layer/handlers/realmdb/README.md @@ -37,34 +37,4 @@ module.exports = { ## Starting the RealmDB handler -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). - -## Usage - -The examples use the VIN (Vehicle Identification Number) `1234567` as object identifier. - -### Reading Data - -To read data from the Realm database, send a message with the type of request and object ID: - -```json -{ - "type": "read", - "data": { - "Vin": 1234567 - } -} -``` - -### Subscribing to Changes - -To subscribe to changes in a specific object, send a message with the type of request and object ID: - -```json -{ - "type": "subscribe", - "data": { - "Vin": 1234567 - } -} -``` +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/realmdb/config/Database.js b/cdsp/information-layer/handlers/realmdb/config/Database.js new file mode 100644 index 0000000..264411c --- /dev/null +++ b/cdsp/information-layer/handlers/realmdb/config/Database.js @@ -0,0 +1,11 @@ +/* + * Contains the definition of the database name and its identifier endpoint for each catalog. + */ +const Database = Object.freeze({ + VSS: { + database_name: "Vehicles", // name of the configured RealmDB for the VSS Database + endpoint_id: "VehicleIdentification_VIN", // endpoint used as element ID + }, +}); + +module.exports = Database; diff --git a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js new file mode 100644 index 0000000..8c6b61e --- /dev/null +++ b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js @@ -0,0 +1,32 @@ +const Database = require("./Database"); + +const MediaElementSchema = { + primaryKey: "_id", + name: Database.VSS.database_name, + properties: { + _id: "string", + VehicleIdentification_VIN: "string", + CurrentLocation_Latitude: "double", + CurrentLocation_Longitude: "double", + }, +}; + +/** + * Generates a configuration object for a Realm database. + * + * @param {object} user - The user object from the authentication. + * @returns {object} The configuration object for the Realm database. + */ +const realmConfig = (user) => ({ + schema: [MediaElementSchema], + path: "myrealm12.realm", + sync: { + user: user, + flexible: true, + error: (error) => { + console.error("Realm sync error:", error); + }, + }, +}); + +module.exports = realmConfig; diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index e67b295..0548ab8 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -1,36 +1,75 @@ const Realm = require("realm"); const Handler = require("../../handler"); const config = require("../config/config"); -const { v4: uuidv4 } = require("uuid"); // Importing UUID generator - -const MediaElementSchema = { - primaryKey: "_id", - name: "Vehicles", - properties: { - _id: "int", - Vehicle_Cabin_HVAC_AmbientAirTemperature: "double", - }, -}; +const Database = require("../config/Database"); +const realmConfig = require("../config/RealmConfiguration"); const app = new Realm.App({ id: config.realmAppId }); const credentials = Realm.Credentials.apiKey(config.realmApiKey); -const realmConfig = { - schema: [MediaElementSchema], - path: "myrealm12.realm", - sync: { - user: null, // will be assigned after authentication - flexible: true, - error: (error) => { - console.error("Realm sync error:", error); - }, - }, -}; - const sendMessageToClient = (ws, message) => { ws.send(JSON.stringify(message)); }; +/** + * Creates the update message header object with the required information. + * + * @param {Object} messageHeader - The original message header object. + * @returns {Object} The updated message header object. + */ +const UpdateMessageHeader = (messageHeader) => ({ + type: "update", + tree: messageHeader.tree, + id: messageHeader.id, + dateTime: new Date().toISOString(), + uuid: messageHeader.uuid, +}); + +/** + * Parses the response from a read event. + * + * @param {Object} message - The message object containing node or nodes information. + * @param {Object} queryResponseObj - The query response object containing values to be mapped. + * @returns {Object} - A data object with keys from the message nodes and values from the query response. + */ +function parseReadResponse(message, queryResponseObj) { + const data = []; + if (message.node) { + const prop = message.node.name; + data.push({ + name: prop, + value: queryResponseObj[prop], + }); + } else if (message.nodes) { + message.nodes.forEach((node) => { + const prop = node.name; + data.push({ + name: prop, + value: queryResponseObj[prop], + }); + }); + } + return data; +} + +/** + * Parses the response from a media element change event. + * + * @param {Object} changes - The object containing the changed properties. + * @param {Object} MediaElement - The media element object with updated properties. + * @returns {Array} An array of objects, each containing the name and value of a changed property. + */ +function parseOnMediaElementChangeResponse(changes, MediaElement) { + const data = []; + changes.changedProperties.forEach((prop) => { + data.push({ + name: prop, + value: MediaElement[prop], + }); + }); + return data; +} + class RealmDBHandler extends Handler { constructor() { super(); @@ -44,18 +83,18 @@ class RealmDBHandler extends Handler { const user = await app.logIn(credentials); console.log("Successfully authenticated with Realm"); - realmConfig.sync.user = user; - this.realm = await Realm.open(realmConfig); + const realmConfigObj = realmConfig(user); + this.realm = await Realm.open(realmConfigObj); console.log("Realm connection established successfully"); - const MediaElements = this.realm.objects("Vehicles").subscribe(); // TODO: Is it necessary to log this, extra function? - if (MediaElements) { - console.log(MediaElements); - } else { - this.sendMessageToClients({ - error: "Vehicles collection not found for subscription", - }); - } + // const MediaElements = await this.realm.objects("Vehicles").subscribe(); // TODO: Is it necessary to log this, extra function? + // if (MediaElements) { + // console.log(MediaElements); + // } else { + // this.sendMessageToClients({ + // error: "Vehicles collection not found for subscription", + // }); + // } } catch (error) { console.error("Failed to authenticate with Realm:", error); } @@ -63,17 +102,25 @@ class RealmDBHandler extends Handler { async read(message, ws) { try { - const objectId = message.data.Vin; - const MediaElement = this.realm.objectForPrimaryKey("Vehicles", objectId); - if (MediaElement) { - const response = { - type: "read_response", - data: MediaElement, - }; - sendMessageToClient(ws, JSON.stringify(response)); + const idValue = message.id; + const databaseName = Database[message.tree].database_name; + const idEndpoint = Database[message.tree].endpoint_id; + const mediaElement = await this.#getMediaElement( + databaseName, + idEndpoint, + idValue, + ws + ); + const responseNodes = parseReadResponse(message, mediaElement); + let updateMessage = UpdateMessageHeader(message); + if (responseNodes.length == 1) { + updateMessage["node"] = responseNodes[0]; } else { - sendMessageToClient(ws, JSON.stringify({ error: "Object not found" })); + updateMessage["nodes"] = responseNodes; } + + console.log(updateMessage); + sendMessageToClient(ws, JSON.stringify(updateMessage)); } catch (error) { console.error("Error reading object from Realm:", error); sendMessageToClient( @@ -85,22 +132,49 @@ class RealmDBHandler extends Handler { async subscribe(message, ws) { try { - const objectId = message.data.Vin; - console.log(`Subscribing element: ${objectId}`); - const MediaElement = await this.realm.objectForPrimaryKey( - "Vehicles", - objectId + const idValue = message.id; + const databaseName = Database[message.tree].database_name; + const idEndpoint = Database[message.tree].endpoint_id; + const MediaElement = await this.#getMediaElement( + databaseName, + idEndpoint, + idValue, + ws ); if (MediaElement) { - const websocketId = String(objectId); - MediaElement.addListener((MediaElement, changes) => - this.onMediaElementChange(MediaElement, changes, websocketId) + const objectId = MediaElement._id; + + console.log( + `Subscribing element: Object ID: ${objectId} with ${idEndpoint}: '${idValue}' on ${databaseName}` + ); + const MediaElementToSubscribe = await this.realm.objectForPrimaryKey( + databaseName, + objectId ); - sendMessageToClient(ws, { - success: `Subscribed to changes for object ID ${objectId}`, - }); + + if (MediaElementToSubscribe) { + MediaElementToSubscribe.addListener( + (MediaElementToSubscribe, changes) => + this.#onMediaElementChange(MediaElementToSubscribe, changes, { + id: idValue, + tree: message.tree, + uuid: message.uuid, + }) + ); + console.log(`Subscribed to changes for Object ID: ${objectId}`); + sendMessageToClient(ws, { + success: `Subscribed to changes for Object ID: ${objectId}`, + }); + } else { + console.log(`Object could not be subscribed`); + sendMessageToClient( + ws, + JSON.stringify({ error: "Object could not be subscribed" }) + ); + } } else { + console.log(`Object not found`); sendMessageToClient(ws, JSON.stringify({ error: "Object not found" })); } } catch (error) { @@ -109,31 +183,53 @@ class RealmDBHandler extends Handler { } } - onMediaElementChange(MediaElement, changes, websocketId) { + /** + * Asynchronously retrieves a media element from a Realm database based on the provided criteria. + * @param {string} databaseName - The name of the Realm database to query. + * @param {string} idEndpoint - The field in the database to filter on. + * @param {string} idValue - The value to match in the specified field. + * @param {WebSocket} ws - The WebSocket connection to send messages to the client. + * @returns {Promise} A Promise that resolves to the retrieved media element or rejects with an error. + */ + async #getMediaElement(databaseName, idEndpoint, idValue, ws) { + try { + return await this.realm + .objects(databaseName) + .filtered(`${idEndpoint} = '${idValue}'`)[0]; + } catch (error) { + console.error("Error reading object from Realm:", error); + sendMessageToClient( + ws, + JSON.stringify({ error: "Error reading object" }) + ); + } + } + + /** + * Handles changes to a media element and sends update messages to clients. + * @param {MediaElement} MediaElement - The media element that has changed. + * @param {object} changes - An object containing information about the changes. + * @param {MessageHeader} MessageHeader - The header information for the message. + */ + #onMediaElementChange(MediaElement, changes, MessageHeader) { if (changes.deleted) { console.log(`MediaElement is deleted: ${changes.deleted}`); } else { - changes.changedProperties.forEach((prop) => { - console.log( - `* the value of "${prop}" changed to ${MediaElement[prop]}` + if (changes.changedProperties.length > 0) { + const responseNodes = parseOnMediaElementChangeResponse( + changes, + MediaElement ); + let updateMessage = UpdateMessageHeader(MessageHeader); + if (responseNodes.length == 1) { + updateMessage["node"] = responseNodes[0]; + } else { + updateMessage["nodes"] = responseNodes; + } - // Generate a meaningful UUID for WebSocket response - const uuid = uuidv4(); - - const message = { - type: "update", - tree: "VSS", - id: websocketId, // Use the WebSocket server ID - uuid: uuid, // Use generated UUID - dateTime: new Date().toISOString(), - node: { - name: prop, // Sending the property name as node name - value: MediaElement[prop], // Sending the property value as node value - }, - }; - this.sendMessageToClients(message); - }); + console.log(updateMessage); + this.sendMessageToClients(JSON.stringify(updateMessage)); + } } } } diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md index deb0030..554d403 100644 --- a/cdsp/information-layer/router/README.md +++ b/cdsp/information-layer/router/README.md @@ -9,7 +9,6 @@ Execute in this directory: ```bash npm install -npm install dotenv ``` # Run diff --git a/cdsp/information-layer/router/package.json b/cdsp/information-layer/router/package.json index 51da3e1..4bef0ba 100644 --- a/cdsp/information-layer/router/package.json +++ b/cdsp/information-layer/router/package.json @@ -7,6 +7,7 @@ "start": "node websocket-server.js" }, "dependencies": { + "ajv": "^8.17.1", "dotenv": "^16.4.5", "ws": "^7.4.6" } diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index d7ed319..6a4b3d4 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -31,10 +31,15 @@ server.on("connection", (ws) => { ws.on("message", (message) => { console.log(`Message received: ${message}`); const validatedMessage = validateMessage(message); - if (validatedMessage) { - handler.handleMessage(validatedMessage, ws); + if (validatedMessage instanceof Error) { + console.error(`Invalid message format: ${validatedMessage.message}`); + ws.send( + JSON.stringify({ + error: `Invalid message format`, + }) + ); } else { - ws.send(JSON.stringify({ error: "Invalid message format" })); + handler.handleMessage(validatedMessage, ws); } }); diff --git a/cdsp/information-layer/router/utils/message-validator.js b/cdsp/information-layer/router/utils/message-validator.js index 93d655c..ca7f1d8 100644 --- a/cdsp/information-layer/router/utils/message-validator.js +++ b/cdsp/information-layer/router/utils/message-validator.js @@ -1,14 +1,134 @@ +const Ajv = require("ajv"); +const ajv = new Ajv({ + allErrors: true, + strict: true, + allowUnionTypes: true, +}); + +const itemsHeader = ["type", "tree", "id", "uuid"]; + +const createCommonStructure = (requestType) => ({ + type: { type: "string", enum: [requestType] }, + tree: { type: "string", enum: ["VSS"] }, + id: { type: "string" }, + uuid: { type: "string" }, +}); + +const schemas = { + read: { + type: "object", + properties: { + ...createCommonStructure("read"), + node: { + type: "object", + properties: { + name: { type: "string" }, + }, + required: ["name"], + additionalProperties: false, + }, + }, + required: itemsHeader.concat("node"), + additionalProperties: false, + }, + multiNodeRead: { + type: "object", + properties: { + ...createCommonStructure("read"), + nodes: { + type: "array", + items: { + type: "object", + properties: { + name: { type: "string" }, + }, + required: ["name"], + additionalProperties: false, + }, + }, + }, + required: itemsHeader.concat("nodes"), + additionalProperties: false, + }, + write: { + type: "object", + properties: { + ...createCommonStructure("write"), + node: { + type: "object", + properties: { + name: { type: "string" }, + value: { type: ["number", "string", "boolean"] }, + }, + required: ["name", "value"], + additionalProperties: false, + }, + }, + required: itemsHeader.concat("node"), + additionalProperties: false, + }, + multiNodeWrite: { + type: "object", + properties: { + ...createCommonStructure("write"), + nodes: { + type: "array", + items: { + type: "object", + properties: { + name: { type: "string" }, + value: { type: ["number", "string", "boolean"] }, + }, + required: ["name", "value"], + additionalProperties: false, + }, + }, + }, + required: itemsHeader.concat("nodes"), + additionalProperties: false, + }, + subscribe: { + type: "object", + properties: { + ...createCommonStructure("subscribe"), + }, + required: itemsHeader, + additionalProperties: false, + }, +}; + const validateMessage = (message) => { - try { - const parsedMessage = JSON.parse(message); - // TODO: Implement validation logic here + try { + const parsedMessage = JSON.parse(message); + let schemaKey; + switch (parsedMessage.type) { + case "read": + schemaKey = parsedMessage.nodes ? "multiNodeRead" : "read"; + break; + case "write": + schemaKey = parsedMessage.nodes ? "multiNodeWrite" : "write"; + break; + case "subscribe": + schemaKey = "subscribe"; + break; + default: + throw new Error(ajv.errorsText(validate.errors)); + } + + const schema = schemas[schemaKey]; + const validate = ajv.compile(schema); + const valid = validate(parsedMessage); + + if (valid) { return parsedMessage; - } catch (error) { - return null; + } else { + throw new Error(ajv.errorsText(validate.errors)); } - }; - - module.exports = { - validateMessage, - }; - \ No newline at end of file + } catch (error) { + return new Error(`Invalid JSON message: ${error.message}`); + } +}; + +module.exports = { + validateMessage, +}; From 62e8402cd6d760cb1c415adf7613c105a0bd88ca Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Fri, 9 Aug 2024 14:09:52 +0200 Subject: [PATCH 19/39] Extend supported data points in RealmDB Handler Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 53 ++++++++++--------- .../handlers/realmdb/config/Database.js | 2 +- .../realmdb/config/RealmConfiguration.js | 11 ++-- cdsp/information-layer/router/src/.env | 2 +- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index bdeca09..7bec28d 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -21,14 +21,19 @@ The Hello World example in our case is quite simple. We feed an updated value fo ## Choose and prepare your Database ### Realm -- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `VehicleIdentification_VIN: SMT905JN26J262542` in a collection named *`Vehicles`*. +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `Vehicle_VehicleIdentification_VIN` in a collection named *`Vehicles`*. - Ensure that this document as well contains VSS data. Here you can see the supported data in a vehicle document within the *Vehicles* should look like in ATLAS: ``` - _id: "" (string) - VehicleIdentification_VIN: "" (string) - CurrentLocation_Latitude: (Int64) - CurrentLocation_Longitude: (Int64) + _id: "" (String) + Vehicle_Chassis_SteeringWheel_Angle: (Int32) + Vehicle_CurrentLocation_Latitude: (Double) + Vehicle_CurrentLocation_Longitude: (Double) + Vehicle_Powertrain_TractionBattery_NominalVoltage: (Int32) + Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: (Double) + Vehicle_Powertrain_Transmission_CurrentGear: (Int32) + Vehicle_Speed: (Double) + Vehicle_VehicleIdentification_VIN: "" (String) ``` ### IoTDB @@ -70,9 +75,9 @@ If you the handler is running and you are subscribed to that element, when you c { type: 'update', tree: 'VSS', - id: '', - dateTime: '', - uuid: '', + id: '', + dateTime: '', + uuid: '', node: { name: 'CurrentLocation_Longitude', value: `-157845.68200000003` } } ``` @@ -91,10 +96,10 @@ To read data, send a message with the type of request and VIN as object ID: { "type": "read", "tree": "VSS", - "id": "", - "uuid": "", + "id": "", + "uuid": "", "node": { - "name": "" + "name": "" } } ``` @@ -103,14 +108,14 @@ To read data, send a message with the type of request and VIN as object ID: { "type": "read", "tree": "VSS", - "id": "", - "uuid": "", + "id": "", + "uuid": "", "nodes": [ { - "name": "" + "name": "" }, { - "name": "" + "name": "" } ] } @@ -125,10 +130,10 @@ To write data, send a message with the type of request and VIN as object ID (at { "type": "write", "tree": "VSS", - "id": "", - "uuid": "", + "id": "", + "uuid": "", "node": { - "name": "", + "name": "", "value": "" } } @@ -138,15 +143,15 @@ To write data, send a message with the type of request and VIN as object ID (at { "type": "write", "tree": "VSS", - "id": "", - "uuid": "", + "id": "", + "uuid": "", "nodes": [ { - "name": "", + "name": "", "value": "" }, { - "name": "", + "name": "", "value": "" } ] @@ -160,8 +165,8 @@ To subscribe to changes in a specific object, send a message with the type of re { "type": "subscribe", "tree": "VSS", - "id": "", - "uuid": "", + "id": "", + "uuid": "SOME_UUID", } ``` diff --git a/cdsp/information-layer/handlers/realmdb/config/Database.js b/cdsp/information-layer/handlers/realmdb/config/Database.js index 264411c..8046cdb 100644 --- a/cdsp/information-layer/handlers/realmdb/config/Database.js +++ b/cdsp/information-layer/handlers/realmdb/config/Database.js @@ -4,7 +4,7 @@ const Database = Object.freeze({ VSS: { database_name: "Vehicles", // name of the configured RealmDB for the VSS Database - endpoint_id: "VehicleIdentification_VIN", // endpoint used as element ID + endpoint_id: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID }, }); diff --git a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js index 8c6b61e..e21c637 100644 --- a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js +++ b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js @@ -5,9 +5,14 @@ const MediaElementSchema = { name: Database.VSS.database_name, properties: { _id: "string", - VehicleIdentification_VIN: "string", - CurrentLocation_Latitude: "double", - CurrentLocation_Longitude: "double", + Vehicle_Chassis_SteeringWheel_Angle: "int", + Vehicle_CurrentLocation_Latitude: "double", + Vehicle_CurrentLocation_Longitude: "double", + Vehicle_Powertrain_TractionBattery_NominalVoltage: "int", + Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: "float", + Vehicle_Powertrain_Transmission_CurrentGear: "int", + Vehicle_Speed: "float", + Vehicle_VehicleIdentification_VIN: "string", }, }; diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env index bcaf5de..16ac659 100644 --- a/cdsp/information-layer/router/src/.env +++ b/cdsp/information-layer/router/src/.env @@ -1 +1 @@ -HANDLER_TYPE=iotdb \ No newline at end of file +HANDLER_TYPE=realmdb \ No newline at end of file From cd597d1a3f2de81cf3f1a6929ebddd3d9df78208 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Fri, 9 Aug 2024 14:15:14 +0200 Subject: [PATCH 20/39] Support for UseCase endpoits in IoTDB Handler Fix: Remove extra 'dot' from endpoint into update message. Fix unknown function issue Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 22 +-- .../handlers/iotdb/config/Database.js | 8 +- .../handlers/iotdb/config/MeasurementsType.js | 12 -- .../handlers/iotdb/config/endpointsType.js | 18 +++ .../handlers/iotdb/src/iotdb-handler.js | 146 +++++++++--------- .../handlers/iotdb/utils/IoTDBConstants.js | 14 +- .../iotdb/utils/IoTDBDataInterpreter.js | 97 ++++++++---- .../handlers/iotdb/utils/IoTDBRpcDataSets.js | 23 ++- .../handlers/iotdb/utils/SessionDataSet.js | 14 +- 9 files changed, 204 insertions(+), 150 deletions(-) delete mode 100644 cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js create mode 100644 cdsp/information-layer/handlers/iotdb/config/endpointsType.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 7bec28d..c9ff22b 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -51,18 +51,22 @@ The Hello World example in our case is quite simple. We feed an updated value fo It costs 0.004s ``` -- Create two *timeseries* with the `root.Vehicles.VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the *Vehicles* should look like in IoTDB CLI: +- Create two *timeseries* with the `root.Vehicles.Vehicle_VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the *Vehicles* should look like in IoTDB CLI: ``` IoTDB> show timeseries; - +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| - +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - |root.Vehicles.VehicleIdentification_VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| - | root.Vehicles.CurrentLocation_Latitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| - |root.Vehicles.CurrentLocation_Longitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| - +---------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - ``` + +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| + +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ + | root.Vehicles.Vehicle_VehicleIdentification_VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_CurrentLocation_Latitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_CurrentLocation_Longitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_Speed| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_Chassis_SteeringWheel_Angle| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_Powertrain_Transmission_CurrentGear| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| + |root.Vehicles.Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| + | root.Vehicles.Vehicle_Powertrain_TractionBattery_NominalVoltage| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| + +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ ## Start the Database Router diff --git a/cdsp/information-layer/handlers/iotdb/config/Database.js b/cdsp/information-layer/handlers/iotdb/config/Database.js index 01d5a88..58bcc59 100644 --- a/cdsp/information-layer/handlers/iotdb/config/Database.js +++ b/cdsp/information-layer/handlers/iotdb/config/Database.js @@ -1,11 +1,11 @@ /* * Contains the definition of the database name and its identifier endpoint for each catalog. */ -const Database = Object.freeze({ +const database = Object.freeze({ VSS: { - database_name: "root.Vehicles", // name of the configured IoTDB for the VSS Database - endpoint_id: "VehicleIdentification_VIN", // endpoint used as element ID + database_name: "root.Vehicles", // name of the configured IoTDB for the VSS database + endpoint_id: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID }, }); -module.exports = Database; +module.exports = database; diff --git a/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js b/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js deleted file mode 100644 index bc991b9..0000000 --- a/cdsp/information-layer/handlers/iotdb/config/MeasurementsType.js +++ /dev/null @@ -1,12 +0,0 @@ -const JSDataType = require("../utils/IoTDBConstants"); - -/* - * Define the supported endpoints and the corresponding data types. - */ -const MeasurementType = Object.freeze({ - VehicleIdentification_VIN: JSDataType.TEXT, - CurrentLocation_Latitude: JSDataType.DOUBLE, - CurrentLocation_Longitude: JSDataType.DOUBLE, -}); - -module.exports = MeasurementType; diff --git a/cdsp/information-layer/handlers/iotdb/config/endpointsType.js b/cdsp/information-layer/handlers/iotdb/config/endpointsType.js new file mode 100644 index 0000000..5b10c3b --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/config/endpointsType.js @@ -0,0 +1,18 @@ +const { MessageDataType } = require("../utils/IoTDBConstants"); + +/* + * Define the supported endpoints and the corresponding data types. + */ +const endpointsType = Object.freeze({ + Vehicle_Chassis_SteeringWheel_Angle: MessageDataType.INT16, + Vehicle_CurrentLocation_Latitude: MessageDataType.DOUBLE, + Vehicle_CurrentLocation_Longitude: MessageDataType.DOUBLE, + Vehicle_Powertrain_TractionBattery_NominalVoltage: MessageDataType.UINT16, + Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: + MessageDataType.FLOAT, + Vehicle_Powertrain_Transmission_CurrentGear: MessageDataType.INT8, + Vehicle_Speed: MessageDataType.FLOAT, + Vehicle_VehicleIdentification_VIN: MessageDataType.STRING, +}); + +module.exports = endpointsType; diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index 46f0a93..147195a 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -11,32 +11,13 @@ const Handler = require("../../handler"); const config = require("../config/config"); const SessionDataSet = require("../utils/SessionDataSet"); const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); -const MeasurementType = require("../config/MeasurementsType"); -const Database = require("../config/Database"); +const endpointsType = require("../config/endpointsType"); +const database = require("../config/database"); const sendMessageToClient = (ws, message) => { ws.send(JSON.stringify(message)); }; -/** - * Extracts endpoint names from the given message. - * - * This function checks if the message has a single node or multiple nodes and - * extracts the names accordingly. - * - * @param {Object} message - The message containing node(s). - * @returns {Array} An array of endpoint names. - */ -function extractEndpointsFromNodes(message) { - let endpoints = []; - if (message.node) { - endpoints.push(message.node.name); - } else if (message.nodes) { - endpoints = message.nodes.map((node) => node.name); - } - return endpoints; -} - /** * Creates an object to insert data in IoTDB based on the provided message. * @@ -44,12 +25,16 @@ function extractEndpointsFromNodes(message) { * @returns {Object} The data object to be inserted. */ function createObjectToInsert(message) { - const data = { VehicleIdentification_VIN: message.id }; + const { id, tree } = message; + const data = { [database[tree].endpoint_id]: id }; if (message.node) { - data[message.node.name] = message.node.value; + data[ + IoTDBDataInterpreter.transformEndpointFromMessageNode(message.node.name) + ] = message.node.value; } else if (message.nodes) { message.nodes.forEach((node) => { - data[node.name] = node.value; + data[IoTDBDataInterpreter.transformEndpointFromMessageNode(node.name)] = + node.value; }); } return data; @@ -63,12 +48,13 @@ function createObjectToInsert(message) { * @returns {Object} The constructed update message object. */ function createUpdateMessage(message, responseNodes) { + const { id, tree, uuid } = message; let updateMessage = { type: "update", - tree: message.tree, - id: message.id, + tree: tree, + id: id, dateTime: new Date().toISOString(), - uuid: message.uuid, + uuid: uuid, }; if (responseNodes.length == 1) { updateMessage["node"] = responseNodes[0]; @@ -87,11 +73,12 @@ function createUpdateMessage(message, responseNodes) { * @returns {Object} The constructed read message object. */ function createReadMessage(message, nodeNames) { + const { id, tree, uuid } = message; let readMessage = { type: "read", - tree: message.tree, - id: message.id, - uuid: message.uuid, + tree: tree, + id: id, + uuid: uuid, }; if (nodeNames.length == 1) { readMessage["node"] = nodeNames[0]; @@ -142,9 +129,7 @@ class IoTDBHandler extends Handler { async read(message, ws) { try { await this.#openSessionIfNeeded(); - const responseMessage = await this.#queryLastFields(message, ws); - console.log(responseMessage); - sendMessageToClient(ws, JSON.stringify(responseMessage)); + await this.#queryLastFields(message, ws); } catch (error) { console.error("Failed to read data from IoTDB: ", error); sendMessageToClient( @@ -167,13 +152,13 @@ class IoTDBHandler extends Handler { const errorUndefinedTypes = []; for (const [key, value] of Object.entries(data)) { - const dataType = MeasurementType[key]; + const dataType = endpointsType[key]; if (dataType == undefined) { errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); continue; } measurements.push(key); - dataTypes.push(MeasurementType[key]); + dataTypes.push(dataType); values.push(value); } @@ -183,7 +168,7 @@ class IoTDBHandler extends Handler { } const timestamp = new Date().getTime(); - const deviceId = Database[message.tree].database_name; + const deviceId = database[message.tree].database_name; const status = await this.#insertRecord( deviceId, timestamp, @@ -203,9 +188,7 @@ class IoTDBHandler extends Handler { const readMessage = createReadMessage(message, keyList); console.log(readMessage); - const responseMessage = await this.#queryLastFields(message, ws); - console.log(responseMessage); - this.sendMessageToClients(responseMessage); + await this.#queryLastFields(message, ws); } catch (error) { console.error("Failed to write data from IoTDB: ", error); sendMessageToClient( @@ -320,7 +303,6 @@ class IoTDBHandler extends Handler { }); const resp = await this.client.executeQueryStatement(request); - if (!resp || !resp.queryDataSet || !resp.queryDataSet.valueList) { return {}; } else { @@ -383,52 +365,62 @@ class IoTDBHandler extends Handler { } /** - * Queries the last inserted fields from the database based on the provided message and sends the result back. + * Queries the last fields from the database based on the provided message and sends the response to the client. * - * @param {Object} message - The message object containing the query parameters. - * @param {WebSocket} ws - The WebSocket connection to send the response back to the client. - * @returns {Promise} - A promise that resolves when the query is complete and the response is sent. - * @throws {Error} - Throws an error if the query execution fails. + * @param {Object} message - The message object containing the query details. + * @param {WebSocket} ws - The WebSocket connection to send the response to. + * @private */ async #queryLastFields(message, ws) { - const objectId = message.id; - const databaseName = Database[message.tree].database_name; - const endpointId = Database[message.tree].endpoint_id; - const fieldsToSearch = extractEndpointsFromNodes(message).join(", "); - const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time DESC LIMIT 1`; + const { id: objectId, tree } = message; + const { database_name: databaseName, endpoint_id: endpointId } = + database[tree]; + const fieldsToSearch = + IoTDBDataInterpreter.extractEndpointsFromNodes(message).join(", "); + const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time ASC`; try { const sessionDataSet = await this.#executeQueryStatement(sql); - // Check if the response contains data - if (sessionDataSet == {}) { - console.log("No data found in query response."); - sendMessageToClient( - ws, - JSON.stringify({ error: "No data found in query response." }) - ); + if (Object.keys(sessionDataSet).length === 0) { + throw new Error({ error: "Internal error constructing read object." }); } else { - let mediaElements = []; + const mediaElements = []; while (sessionDataSet.hasNext()) { - const mediaElement = sessionDataSet.next(); - mediaElements.push(mediaElement); + mediaElements.push(sessionDataSet.next()); } - let responseNodes = []; - - if (mediaElements.length > 0) { - for (let i = 0; i < mediaElements.length; ++i) { - const transformedObject = - IoTDBDataInterpreter.extractDeviceIdFromTimeseries( - mediaElements[i] - ); - const entries = Object.entries(transformedObject); - entries.forEach(([key, value]) => { - responseNodes.push({ name: key, value: value }); - }); - } - return createUpdateMessage(message, responseNodes); + console.log("media elements: ", mediaElements); + + let latestValues = {}; + + mediaElements.forEach((mediaElement) => { + const databaseName = database[tree].database_name; + const transformedObject = + IoTDBDataInterpreter.extractNodesFromTimeseries( + mediaElement, + databaseName + ); + Object.entries(transformedObject).forEach(([key, value]) => { + if (value !== null) { + latestValues[key] = value; + } + }); + }); + + const responseNodes = Object.entries(latestValues).map( + ([name, value]) => ({ + name, + value, + }) + ); + + if (responseNodes.length > 0) { + const responseMessage = createUpdateMessage(message, responseNodes); + console.log(responseMessage); + this.sendMessageToClients(responseMessage); } else { + console.log("Object not found."); sendMessageToClient( ws, JSON.stringify({ error: "Object not found." }) @@ -436,7 +428,11 @@ class IoTDBHandler extends Handler { } } } catch (error) { - throw new Error(error); + console.error(error); + sendMessageToClient( + ws, + JSON.stringify({ error: "Internal error constructing read object." }) + ); } } } diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js index ae7073d..8d6048d 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js @@ -1,4 +1,4 @@ -const JSDataType = Object.freeze({ +const IoTDBDataType = Object.freeze({ BOOLEAN: 0, INT32: 1, INT64: 2, @@ -7,4 +7,14 @@ const JSDataType = Object.freeze({ TEXT: 5, }); -module.exports = JSDataType; +const MessageDataType = Object.freeze({ + INT8: 0, + INT16: 1, + INT32: 2, + UINT16: 3, + FLOAT: 4, + DOUBLE: 5, + STRING: 6, +}); + +module.exports = { IoTDBDataType, MessageDataType }; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js index bb707ff..0362cca 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js @@ -1,4 +1,5 @@ -const JSDataType = require("./IoTDBConstants"); +const { IoTDBDataType, MessageDataType } = require("./IoTDBConstants"); +const database = require("../config/database"); class IoTDBDataInterpreter { /** @@ -8,61 +9,66 @@ class IoTDBDataInterpreter { * @returns {Buffer} - Serialized values as a Buffer. */ static serializeValues(dataTypes, values) { - function serializeBoolean(value) { - return [JSDataType.BOOLEAN, value]; - } + // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // function serializeBoolean(value) { + // return [IoTDBDataType.BOOLEAN, value]; + // } function serializeInt32(value) { const int32 = new Int32Array([value]); const uint8 = new Uint8Array(int32.buffer).reverse(); - return [JSDataType.INT32, ...uint8]; + return [IoTDBDataType.INT32, ...uint8]; } - function serializeInt64(value) { - const bigint64 = new BigInt64Array([value]); - const uint8 = new Uint8Array(bigint64.buffer).reverse(); - return [JSDataType.INT64, ...uint8]; - } + // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // function serializeInt64(value) { + // const bigint64 = new BigInt64Array([value]); + // const uint8 = new Uint8Array(bigint64.buffer).reverse(); + // return [IoTDBDataType.INT64, ...uint8]; + // } function serializeFloat(value) { const float32 = new Float32Array([value]); const uint8 = new Uint8Array(float32.buffer).reverse(); - return [JSDataType.FLOAT, ...uint8]; + return [IoTDBDataType.FLOAT, ...uint8]; } function serializeDouble(value) { const float64 = new Float64Array([value]); const uint8 = new Uint8Array(float64.buffer).reverse(); - return [JSDataType.DOUBLE, ...uint8]; + return [IoTDBDataType.DOUBLE, ...uint8]; } function serializeText(value) { const utf8arr = Buffer.from(value); const int32 = new Uint32Array([utf8arr.length]); const uint8 = new Uint8Array(int32.buffer).reverse(); - return [JSDataType.TEXT, ...uint8, ...utf8arr]; + return [IoTDBDataType.TEXT, ...uint8, ...utf8arr]; } const serializedValues = []; for (let i = 0; i < dataTypes.length; i++) { switch (dataTypes[i]) { - case JSDataType.BOOLEAN: - serializedValues.push(...serializeBoolean(values[i])); - break; - case JSDataType.INT32: + // case MessageDataType.BOOLEAN: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // serializedValues.push(...serializeBoolean(values[i])); + // break; + case MessageDataType.INT8: + case MessageDataType.INT16: + case MessageDataType.UINT16: + //case MessageDataType.UINT32: serializedValues.push(...serializeInt32(values[i])); break; - case JSDataType.INT64: - serializedValues.push(...serializeInt64(values[i])); - break; - case JSDataType.FLOAT: + // case MessageDataType.INT64: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // serializedValues.push(...serializeInt64(values[i])); + // break; + case MessageDataType.FLOAT: serializedValues.push(...serializeFloat(values[i])); break; - case JSDataType.DOUBLE: + case MessageDataType.DOUBLE: serializedValues.push(...serializeDouble(values[i])); break; - case JSDataType.TEXT: + case MessageDataType.STRING: serializedValues.push(...serializeText(values[i])); break; default: @@ -73,15 +79,16 @@ class IoTDBDataInterpreter { } /** - * Transforms an object by extracting and renaming keys that start with device id 'root.Vehicles.'. + * Extracts and transforms timeseries nodes from the given object with the required message format. * - * @param {Object} obj - The input object to be transformed. - * @returns {Object} - A new object with keys that were prefixed with 'root.Vehicles.' renamed to their last segment. + * @param {Object} obj - The object containing timeseries data. + * @param {string} databaseName - The database name to match and remove from the keys. + * @returns {Object} - A new object with transformed keys and their corresponding values. */ - static extractDeviceIdFromTimeseries(obj) { + static extractNodesFromTimeseries(obj, databaseName) { return Object.entries(obj).reduce((acc, [key, value]) => { - if (key.startsWith("root.Vehicles.")) { - const newKey = key.split(".").pop(); // Get the last part of the key + if (key.startsWith(databaseName)) { + const newKey = key.replace(`${databaseName}.`, "").replace(/_/g, "."); acc[newKey] = value; } return acc; @@ -101,6 +108,38 @@ class IoTDBDataInterpreter { return { timestamp }; } + + /** + * Extracts endpoint names from the given message. + * + * This function checks if the message has a single node or multiple nodes and + * extracts the names accordingly. + * + * @param {Object} message - The message containing node(s). + * @returns {Array} An array of endpoint names. + */ + static extractEndpointsFromNodes(message) { + let endpoints = []; + + if (message.node) { + endpoints.push(this.transformEndpointFromMessageNode(message.node.name)); + } else if (message.nodes) { + endpoints = message.nodes.map((node) => + this.transformEndpointFromMessageNode(node.name) + ); + } + return endpoints; + } + + /** + * Transforms a message node by replacing all dots with underscores. + * + * @param {string} node - The message node to transform. + * @returns {string} - The transformed message node with dots replaced by underscores. + */ + static transformEndpointFromMessageNode(node) { + return `${node}`.replace(/\./g, "_"); + } } module.exports = { IoTDBDataInterpreter }; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js index c58419e..8eda7a3 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js @@ -1,4 +1,4 @@ -const JSDataType = require("./IoTDBConstants"); +const { IoTDBDataType } = require("./IoTDBConstants"); class IoTDBRpcDataSet { // Static properties static TIMESTAMP_STR = "Time"; @@ -56,7 +56,7 @@ class IoTDBRpcDataSet { if (!ignoreTimestamp) { this.#columnNameList.push(IoTDBRpcDataSet.TIMESTAMP_STR); - this.#columnTypeList.push(JSDataType.INT64); + this.#columnTypeList.push(IoTDBDataType.INT64); this.#columnOrdinalDict.set(IoTDBRpcDataSet.TIMESTAMP_STR, 1); } @@ -68,10 +68,9 @@ class IoTDBRpcDataSet { // Populate column_name_list and column_type_list for (let i = 0; i < columnNameList.length; i++) { - let name = columnNameList[i]; + const name = columnNameList[i]; this.#columnNameList.push(name); - this.#columnTypeList.push(JSDataType[columnTypeList[i]]); - + this.#columnTypeList.push(IoTDBDataType[columnTypeList[i]]); if (!this.#columnOrdinalDict.has(name)) { let index = columnNameIndex[name]; this.#columnOrdinalDict.set( @@ -79,7 +78,7 @@ class IoTDBRpcDataSet { index + IoTDBRpcDataSet.START_INDEX ); this.#columnTypeDeduplicatedList[index] = - JSDataType[columnTypeList[i]]; + IoTDBDataType[columnTypeList[i]]; } } } @@ -217,27 +216,27 @@ class IoTDBRpcDataSet { // Simulating buffer based on data type. switch (dataType) { - case JSDataType.BOOLEAN: + case IoTDBDataType.BOOLEAN: this.#value[i] = valueBuffer.slice(0, 1); this.#queryDataSet.valueList[i] = valueBuffer.slice(1); break; - case JSDataType.INT32: + case IoTDBDataType.INT32: this.#value[i] = valueBuffer.slice(0, 4); this.#queryDataSet.valueList[i] = valueBuffer.slice(4); break; - case JSDataType.INT64: + case IoTDBDataType.INT64: this.#value[i] = valueBuffer.slice(0, 8); this.#queryDataSet.valueList[i] = valueBuffer.slice(8); break; - case JSDataType.FLOAT: + case IoTDBDataType.FLOAT: this.#value[i] = valueBuffer.slice(0, 4); this.#queryDataSet.valueList[i] = valueBuffer.slice(4); break; - case JSDataType.DOUBLE: + case IoTDBDataType.DOUBLE: this.#value[i] = valueBuffer.slice(0, 8); this.#queryDataSet.valueList[i] = valueBuffer.slice(8); break; - case JSDataType.TEXT: + case IoTDBDataType.TEXT: let length = valueBuffer.readInt32BE(0); this.#value[i] = valueBuffer.slice(4, 4 + length); this.#queryDataSet.valueList[i] = valueBuffer.slice(4 + length); diff --git a/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js b/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js index fbb1dd4..47bb9bc 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js +++ b/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js @@ -1,19 +1,19 @@ -const JSDataType = require("./IoTDBConstants"); +const { IoTDBDataType } = require("./IoTDBConstants"); const IoTDBRpcDataSet = require("./IoTDBRpcDataSets"); const { IoTDBDataInterpreter } = require("./IoTDBDataInterpreter"); const dataTypeProcessors = { - [JSDataType.BOOLEAN]: (bytes) => + [IoTDBDataType.BOOLEAN]: (bytes) => new Int8Array(new Uint8Array(bytes.slice(0, 1).reverse()).buffer)[0], - [JSDataType.INT32]: (bytes) => + [IoTDBDataType.INT32]: (bytes) => new Int32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], - [JSDataType.INT64]: (bytes) => + [IoTDBDataType.INT64]: (bytes) => new BigInt64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], - [JSDataType.FLOAT]: (bytes) => + [IoTDBDataType.FLOAT]: (bytes) => new Float32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], - [JSDataType.DOUBLE]: (bytes) => + [IoTDBDataType.DOUBLE]: (bytes) => new Float64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], - [JSDataType.TEXT]: (bytes) => bytes.toString(), + [IoTDBDataType.TEXT]: (bytes) => bytes.toString(), }; class SessionDataSet { From 5f142ab089aec5af558be043932160a6edee2f5f Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Tue, 13 Aug 2024 09:01:53 +0200 Subject: [PATCH 21/39] Add write support to realmdb - Update Readme documentation - Add write operation to RealmDB - Repair error writing data and send message to clients correctly - Refactory: rename database parameters file - Refactoring: use variable naming convention - Subscribe Databases Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/README.md | 16 +- .../handlers/iotdb/config/Database.js | 11 - .../handlers/iotdb/config/databaseParams.js | 11 + .../handlers/iotdb/src/iotdb-handler.js | 125 +++++---- .../iotdb/utils/IoTDBDataInterpreter.js | 2 +- .../handlers/realmdb/config/Database.js | 11 - .../realmdb/config/RealmConfiguration.js | 4 +- .../handlers/realmdb/config/databaseParams.js | 11 + .../handlers/realmdb/src/realmdb-handler.js | 245 +++++++++++------- 9 files changed, 242 insertions(+), 194 deletions(-) delete mode 100644 cdsp/information-layer/handlers/iotdb/config/Database.js create mode 100644 cdsp/information-layer/handlers/iotdb/config/databaseParams.js delete mode 100644 cdsp/information-layer/handlers/realmdb/config/Database.js create mode 100644 cdsp/information-layer/handlers/realmdb/config/databaseParams.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index c9ff22b..ab7aee2 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -165,12 +165,12 @@ To write data, send a message with the type of request and VIN as object ID (at To subscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): - ```json - { - "type": "subscribe", - "tree": "VSS", - "id": "", - "uuid": "SOME_UUID", - } - ``` + ```json + { + "type": "subscribe", + "tree": "VSS", + "id": "", + "uuid": "SOME_UUID" + } + ``` diff --git a/cdsp/information-layer/handlers/iotdb/config/Database.js b/cdsp/information-layer/handlers/iotdb/config/Database.js deleted file mode 100644 index 58bcc59..0000000 --- a/cdsp/information-layer/handlers/iotdb/config/Database.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Contains the definition of the database name and its identifier endpoint for each catalog. - */ -const database = Object.freeze({ - VSS: { - database_name: "root.Vehicles", // name of the configured IoTDB for the VSS database - endpoint_id: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID - }, -}); - -module.exports = database; diff --git a/cdsp/information-layer/handlers/iotdb/config/databaseParams.js b/cdsp/information-layer/handlers/iotdb/config/databaseParams.js new file mode 100644 index 0000000..d9ba29b --- /dev/null +++ b/cdsp/information-layer/handlers/iotdb/config/databaseParams.js @@ -0,0 +1,11 @@ +/* + * Contains the definition of the database name and its identifier endpoint for each catalog. + */ +const databaseParams = Object.freeze({ + VSS: { + databaseName: "root.Vehicles", // name of the configured IoTDB for the VSS database + endpointId: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID + }, +}); + +module.exports = databaseParams; diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index 147195a..ed5c6bd 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -12,7 +12,7 @@ const config = require("../config/config"); const SessionDataSet = require("../utils/SessionDataSet"); const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); const endpointsType = require("../config/endpointsType"); -const database = require("../config/database"); +const database = require("../config/databaseParams"); const sendMessageToClient = (ws, message) => { ws.send(JSON.stringify(message)); @@ -26,7 +26,7 @@ const sendMessageToClient = (ws, message) => { */ function createObjectToInsert(message) { const { id, tree } = message; - const data = { [database[tree].endpoint_id]: id }; + const data = { [database[tree].endpointId]: id }; if (message.node) { data[ IoTDBDataInterpreter.transformEndpointFromMessageNode(message.node.name) @@ -129,7 +129,15 @@ class IoTDBHandler extends Handler { async read(message, ws) { try { await this.#openSessionIfNeeded(); - await this.#queryLastFields(message, ws); + const responseNodes = await this.#queryLastFields(message, ws); + if (responseNodes.length > 0) { + const responseMessage = createUpdateMessage(message, responseNodes); + console.log(responseMessage); + sendMessageToClient(ws, responseMessage); + } else { + console.log("Object not found."); + sendMessageToClient(ws, JSON.stringify({ error: "Object not found." })); + } } catch (error) { console.error("Failed to read data from IoTDB: ", error); sendMessageToClient( @@ -142,33 +150,32 @@ class IoTDBHandler extends Handler { } async write(message, ws) { - let measurements = []; - let dataTypes = []; - let values = []; - try { await this.#openSessionIfNeeded(); const data = createObjectToInsert(message); const errorUndefinedTypes = []; + let measurements = []; + let dataTypes = []; + let values = []; for (const [key, value] of Object.entries(data)) { - const dataType = endpointsType[key]; - if (dataType == undefined) { + if (endpointsType.hasOwnProperty(key)) { + measurements.push(key); + dataTypes.push(endpointsType[key]); + values.push(value); + } else { errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); continue; } - measurements.push(key); - dataTypes.push(dataType); - values.push(value); } - if (errorUndefinedTypes.length > 0) { + if (errorUndefinedTypes.length) { errorUndefinedTypes.forEach((error) => console.error(error)); throw new Error("One or more endpoints are not supported."); } const timestamp = new Date().getTime(); - const deviceId = database[message.tree].database_name; + const deviceId = database[message.tree].databaseName; const status = await this.#insertRecord( deviceId, timestamp, @@ -177,23 +184,31 @@ class IoTDBHandler extends Handler { values ); - const response = `insert one record to device ${deviceId}, status: `; + const response = `Insert one record to device ${deviceId}, status: `; console.log(response, status); - let keyList = []; - measurements.forEach((key) => { - keyList.push({ name: key }); - }); + let keyList = measurements.map((name) => ({ + name, + })); const readMessage = createReadMessage(message, keyList); console.log(readMessage); - await this.#queryLastFields(message, ws); + const responseNodes = await this.#queryLastFields(message, ws); + + if (responseNodes.length) { + const responseMessage = createUpdateMessage(message, responseNodes); + console.log(responseMessage); + this.sendMessageToClients(responseMessage); + } else { + console.log("Object not found."); + sendMessageToClient(ws, JSON.stringify({ error: "Object not found." })); + } } catch (error) { - console.error("Failed to write data from IoTDB: ", error); + console.error(`Failed writing data to IoTDB. ${error}`); sendMessageToClient( ws, - JSON.stringify({ error: "Error writing object" }) + JSON.stringify({ error: `Failed writing data. ${error}` }) ); } finally { this.#closeSessionIfNeeded(); @@ -373,8 +388,7 @@ class IoTDBHandler extends Handler { */ async #queryLastFields(message, ws) { const { id: objectId, tree } = message; - const { database_name: databaseName, endpoint_id: endpointId } = - database[tree]; + const { databaseName, endpointId } = database[tree]; const fieldsToSearch = IoTDBDataInterpreter.extractEndpointsFromNodes(message).join(", "); const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time ASC`; @@ -382,51 +396,34 @@ class IoTDBHandler extends Handler { try { const sessionDataSet = await this.#executeQueryStatement(sql); - if (Object.keys(sessionDataSet).length === 0) { + if (!sessionDataSet || Object.keys(sessionDataSet).length === 0) { throw new Error({ error: "Internal error constructing read object." }); - } else { - const mediaElements = []; - while (sessionDataSet.hasNext()) { - mediaElements.push(sessionDataSet.next()); - } + } - console.log("media elements: ", mediaElements); - - let latestValues = {}; - - mediaElements.forEach((mediaElement) => { - const databaseName = database[tree].database_name; - const transformedObject = - IoTDBDataInterpreter.extractNodesFromTimeseries( - mediaElement, - databaseName - ); - Object.entries(transformedObject).forEach(([key, value]) => { - if (value !== null) { - latestValues[key] = value; - } - }); - }); + const mediaElements = []; + while (sessionDataSet.hasNext()) { + mediaElements.push(sessionDataSet.next()); + } - const responseNodes = Object.entries(latestValues).map( - ([name, value]) => ({ - name, - value, - }) - ); + let latestValues = {}; - if (responseNodes.length > 0) { - const responseMessage = createUpdateMessage(message, responseNodes); - console.log(responseMessage); - this.sendMessageToClients(responseMessage); - } else { - console.log("Object not found."); - sendMessageToClient( - ws, - JSON.stringify({ error: "Object not found." }) + mediaElements.forEach((mediaElement) => { + const transformedObject = + IoTDBDataInterpreter.extractNodesFromTimeseries( + mediaElement, + databaseName ); - } - } + Object.entries(transformedObject).forEach(([key, value]) => { + if (value !== null) { + latestValues[key] = value; + } + }); + }); + + return Object.entries(latestValues).map(([name, value]) => ({ + name, + value, + })); } catch (error) { console.error(error); sendMessageToClient( diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js index 0362cca..e665885 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js @@ -1,5 +1,5 @@ const { IoTDBDataType, MessageDataType } = require("./IoTDBConstants"); -const database = require("../config/database"); +const database = require("../config/databaseParams"); class IoTDBDataInterpreter { /** diff --git a/cdsp/information-layer/handlers/realmdb/config/Database.js b/cdsp/information-layer/handlers/realmdb/config/Database.js deleted file mode 100644 index 8046cdb..0000000 --- a/cdsp/information-layer/handlers/realmdb/config/Database.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Contains the definition of the database name and its identifier endpoint for each catalog. - */ -const Database = Object.freeze({ - VSS: { - database_name: "Vehicles", // name of the configured RealmDB for the VSS Database - endpoint_id: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID - }, -}); - -module.exports = Database; diff --git a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js index e21c637..38d8011 100644 --- a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js +++ b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js @@ -1,8 +1,8 @@ -const Database = require("./Database"); +const database = require("./databaseParams"); const MediaElementSchema = { primaryKey: "_id", - name: Database.VSS.database_name, + name: database.VSS.databaseName, properties: { _id: "string", Vehicle_Chassis_SteeringWheel_Angle: "int", diff --git a/cdsp/information-layer/handlers/realmdb/config/databaseParams.js b/cdsp/information-layer/handlers/realmdb/config/databaseParams.js new file mode 100644 index 0000000..5f7300b --- /dev/null +++ b/cdsp/information-layer/handlers/realmdb/config/databaseParams.js @@ -0,0 +1,11 @@ +/* + * Contains the definition of the database name and its identifier endpoint for each catalog. + */ +const databaseParams = Object.freeze({ + VSS: { + databaseName: "Vehicles", // name of the configured RealmDB for the VSS database + endpointId: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID + }, +}); + +module.exports = databaseParams; diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index 0548ab8..8282963 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -1,8 +1,9 @@ const Realm = require("realm"); const Handler = require("../../handler"); const config = require("../config/config"); -const Database = require("../config/Database"); -const realmConfig = require("../config/RealmConfiguration"); +const database = require("../config/databaseParams"); +const realmConfig = require("../config/realmConfiguration"); +const { v4: uuidv4 } = require("uuid"); const app = new Realm.App({ id: config.realmAppId }); const credentials = Realm.Credentials.apiKey(config.realmApiKey); @@ -12,18 +13,44 @@ const sendMessageToClient = (ws, message) => { }; /** - * Creates the update message header object with the required information. + * Creates a message header object with the specified type and properties from the given original messageHeader. * * @param {Object} messageHeader - The original message header object. - * @returns {Object} The updated message header object. + * @param {string} type - The type of the message header, e.g., "update" or "read". + * @returns {Object} The newly created message header object. */ -const UpdateMessageHeader = (messageHeader) => ({ - type: "update", - tree: messageHeader.tree, - id: messageHeader.id, - dateTime: new Date().toISOString(), - uuid: messageHeader.uuid, -}); +const createMessageHeader = (messageHeader, type) => { + const header = { + type, + tree: messageHeader.tree, + id: messageHeader.id, + uuid: messageHeader.uuid, + }; + + if (type === "update") { + header.dateTime = new Date().toISOString(); + } + + return header; +}; + +/** + * Creates a new message object with a header and response nodes. + * + * @param {string} message - The message content. + * @param {Array} responseNodes - An array of response nodes. + * @param {string} type - The type of the message, e.g., "update" or "read". + * @returns {Object} The newly created message object. + */ +const createMessage = (message, responseNodes, type) => { + const newMessage = createMessageHeader(message, type); + if (responseNodes.length === 1) { + newMessage.node = responseNodes[0]; + } else { + newMessage.nodes = responseNodes; + } + return newMessage; +}; /** * Parses the response from a read event. @@ -34,21 +61,14 @@ const UpdateMessageHeader = (messageHeader) => ({ */ function parseReadResponse(message, queryResponseObj) { const data = []; - if (message.node) { - const prop = message.node.name; + const nodes = message.node ? [message.node] : message.nodes; + nodes.forEach((node) => { + const prop = node.name; data.push({ name: prop, value: queryResponseObj[prop], }); - } else if (message.nodes) { - message.nodes.forEach((node) => { - const prop = node.name; - data.push({ - name: prop, - value: queryResponseObj[prop], - }); - }); - } + }); return data; } @@ -56,18 +76,14 @@ function parseReadResponse(message, queryResponseObj) { * Parses the response from a media element change event. * * @param {Object} changes - The object containing the changed properties. - * @param {Object} MediaElement - The media element object with updated properties. + * @param {Object} mediaElement - The media element object with updated properties. * @returns {Array} An array of objects, each containing the name and value of a changed property. */ -function parseOnMediaElementChangeResponse(changes, MediaElement) { - const data = []; - changes.changedProperties.forEach((prop) => { - data.push({ - name: prop, - value: MediaElement[prop], - }); - }); - return data; +function parseOnMediaElementChangeResponse(changes, mediaElement) { + return changes.changedProperties.map((prop) => ({ + name: prop, + value: mediaElement[prop], + })); } class RealmDBHandler extends Handler { @@ -87,14 +103,15 @@ class RealmDBHandler extends Handler { this.realm = await Realm.open(realmConfigObj); console.log("Realm connection established successfully"); - // const MediaElements = await this.realm.objects("Vehicles").subscribe(); // TODO: Is it necessary to log this, extra function? - // if (MediaElements) { - // console.log(MediaElements); - // } else { - // this.sendMessageToClients({ - // error: "Vehicles collection not found for subscription", - // }); - // } + Object.entries(database).forEach(async ([key, value]) => { + try { + const databaseName = value.databaseName; + await this.realm.objects(databaseName).subscribe(); + console.log(`Subscribed to the database ${key}: ${databaseName}`); + } catch (error) { + throw new Error("Error subscribing databases."); + } + }); } catch (error) { console.error("Failed to authenticate with Realm:", error); } @@ -102,23 +119,7 @@ class RealmDBHandler extends Handler { async read(message, ws) { try { - const idValue = message.id; - const databaseName = Database[message.tree].database_name; - const idEndpoint = Database[message.tree].endpoint_id; - const mediaElement = await this.#getMediaElement( - databaseName, - idEndpoint, - idValue, - ws - ); - const responseNodes = parseReadResponse(message, mediaElement); - let updateMessage = UpdateMessageHeader(message); - if (responseNodes.length == 1) { - updateMessage["node"] = responseNodes[0]; - } else { - updateMessage["nodes"] = responseNodes; - } - + const updateMessage = await this.#getMessageData(message, ws); console.log(updateMessage); sendMessageToClient(ws, JSON.stringify(updateMessage)); } catch (error) { @@ -130,36 +131,68 @@ class RealmDBHandler extends Handler { } } - async subscribe(message, ws) { + async write(message, ws) { try { - const idValue = message.id; - const databaseName = Database[message.tree].database_name; - const idEndpoint = Database[message.tree].endpoint_id; - const MediaElement = await this.#getMediaElement( - databaseName, - idEndpoint, - idValue, - ws - ); + const mediaElement = await this.#getMediaElement(message, ws); + let nodes = message.node ? [message.node] : message.nodes; + const endpoints = []; - if (MediaElement) { - const objectId = MediaElement._id; + if (mediaElement) { + this.realm.write(() => { + nodes.forEach(({ name, value }) => { + endpoints.push(name); + mediaElement[name] = value; + }); + }); + } else { + const endpointId = database[message.tree].endpointId; + let document = { _id: uuidv4(), [endpointId]: message.id }; + + nodes.forEach(({ name, value }) => { + endpoints.push(name); + document[name] = value; + }); + const databaseName = database[message.tree].databaseName; + + this.realm.write(() => { + this.realm.create(databaseName, document); + }); + } + let messageNodes = endpoints.map((key) => ({ name: key })); + const readMessage = createMessage(message, messageNodes, "read"); + const updateMessage = await this.#getMessageData(readMessage, ws); + console.log(updateMessage); + this.sendMessageToClients(JSON.stringify(updateMessage)); + } catch (error) { + console.error("Error writing object changes in Realm:", error); + sendMessageToClient(ws, { error: "Error writing object changes" }); + } + } + + async subscribe(message, ws) { + try { + const mediaElement = await this.#getMediaElement(message, ws); + if (mediaElement) { + const objectId = mediaElement._id; + const { id, tree, uuid } = message; + const { databaseName, endpointId } = database[tree]; console.log( - `Subscribing element: Object ID: ${objectId} with ${idEndpoint}: '${idValue}' on ${databaseName}` + `Subscribing element: Object ID: ${objectId} with ${endpointId}: '${id}' on ${databaseName}` ); - const MediaElementToSubscribe = await this.realm.objectForPrimaryKey( + + const mediaElementToSubscribe = await this.realm.objectForPrimaryKey( databaseName, objectId ); - if (MediaElementToSubscribe) { - MediaElementToSubscribe.addListener( - (MediaElementToSubscribe, changes) => - this.#onMediaElementChange(MediaElementToSubscribe, changes, { - id: idValue, - tree: message.tree, - uuid: message.uuid, + if (mediaElementToSubscribe) { + mediaElementToSubscribe.addListener( + (mediaElementToSubscribe, changes) => + this.#onMediaElementChange(mediaElementToSubscribe, changes, { + id: id, + tree: tree, + uuid: uuid, }) ); console.log(`Subscribed to changes for Object ID: ${objectId}`); @@ -184,18 +217,38 @@ class RealmDBHandler extends Handler { } /** - * Asynchronously retrieves a media element from a Realm database based on the provided criteria. - * @param {string} databaseName - The name of the Realm database to query. - * @param {string} idEndpoint - The field in the database to filter on. - * @param {string} idValue - The value to match in the specified field. - * @param {WebSocket} ws - The WebSocket connection to send messages to the client. - * @returns {Promise} A Promise that resolves to the retrieved media element or rejects with an error. + * Asynchronously retrieves media element, processes it, and creates an updated message. + * + * @param {Object} message - The message object containing the data to be processed. + * @param {WebSocket} ws - The WebSocket connection used for communication. + * @returns {Promise} - A promise that resolves to the updated message object. + * @private */ - async #getMediaElement(databaseName, idEndpoint, idValue, ws) { + async #getMessageData(message, ws) { + const mediaElement = await this.#getMediaElement(message, ws); + console.log("mediaElement: ", mediaElement); + if (mediaElement) { + const responseNodes = parseReadResponse(message, mediaElement); + return createMessage(message, responseNodes, "update"); + } else { + throw new Error(`No data found with the Id: ${message.id}`); + } + } + + /** + * Asynchronously retrieves a media element from the database based on the provided message. + * + * @param {Object} message - The message containing the id and tree information. + * @param {WebSocket} ws - The WebSocket connection to send error messages if needed. + * @returns {Promise} - The media element object from the database. + */ + async #getMediaElement(message, ws) { try { + const { id, tree } = message; + const { databaseName, endpointId } = database[tree]; return await this.realm .objects(databaseName) - .filtered(`${idEndpoint} = '${idValue}'`)[0]; + .filtered(`${endpointId} = '${id}'`)[0]; } catch (error) { console.error("Error reading object from Realm:", error); sendMessageToClient( @@ -207,26 +260,24 @@ class RealmDBHandler extends Handler { /** * Handles changes to a media element and sends update messages to clients. - * @param {MediaElement} MediaElement - The media element that has changed. + * @param {mediaElement} mediaElement - The media element that has changed. * @param {object} changes - An object containing information about the changes. - * @param {MessageHeader} MessageHeader - The header information for the message. + * @param {messageHeader} messageHeader - The header information for the message. */ - #onMediaElementChange(MediaElement, changes, MessageHeader) { + #onMediaElementChange(mediaElement, changes, messageHeader) { if (changes.deleted) { console.log(`MediaElement is deleted: ${changes.deleted}`); } else { if (changes.changedProperties.length > 0) { const responseNodes = parseOnMediaElementChangeResponse( changes, - MediaElement + mediaElement + ); + const updateMessage = createMessage( + messageHeader, + responseNodes, + "update" ); - let updateMessage = UpdateMessageHeader(MessageHeader); - if (responseNodes.length == 1) { - updateMessage["node"] = responseNodes[0]; - } else { - updateMessage["nodes"] = responseNodes; - } - console.log(updateMessage); this.sendMessageToClients(JSON.stringify(updateMessage)); } From 56a1109b72ae91e5702fa4fba93bfefd83a77cd3 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Wed, 21 Aug 2024 14:08:31 +0200 Subject: [PATCH 22/39] Extracted common methods - Subscribe Databases - Refactoring: use variable naming convention - Refactory: rename database parameters file - Repair error writing data and send message to clients correctly - Add write operation to RealmDB - Update Readme documentation - catch all exceptions - extract similar code to handler.js - remove unused function - commit changes - added comment Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/handlers/handler.js | 67 +++++++++++---- .../handlers/iotdb/src/iotdb-handler.js | 84 +++++-------------- .../handlers/realmdb/src/realmdb-handler.js | 75 +++++------------ 3 files changed, 95 insertions(+), 131 deletions(-) diff --git a/cdsp/information-layer/handlers/handler.js b/cdsp/information-layer/handlers/handler.js index 6ed6f62..7ea3025 100644 --- a/cdsp/information-layer/handlers/handler.js +++ b/cdsp/information-layer/handlers/handler.js @@ -4,31 +4,68 @@ class Handler { } handleMessage(message, ws) { - switch (message.type) { - case "read": - this.read(message, ws); - break; - case "write": - this.write(message, ws); - break; - case "subscribe": - this.subscribe(message, ws); - break; - default: - ws.send(JSON.stringify({ error: "Unknown message type" })); + try { + switch (message.type) { + case "read": + this.read(message, ws); + break; + case "write": + this.write(message, ws); + break; + case "subscribe": + this.subscribe(message, ws); + break; + default: + ws.send(JSON.stringify({ error: "Unknown message type" })); + } + } catch (error) { + ws.send(JSON.stringify({ error: error.message })); } } read(message, ws) { - throw new Error("Read method not implemented, yet!"); + throw new Error("Read method not implemented yet!"); } write(message, ws) { - throw new Error("Write method not implemented, yet!"); + throw new Error("Write method not implemented yet!"); } subscribe(message, ws) { - throw new Error("Subscribe method not implemented, yet!"); + throw new Error("Subscribe method not implemented yet!"); + } + + /** + * Utility functions for handling messages and data structures common to IoTDB and RealmDB. + */ + + /** + * Sends a message to the client + * @param {WebSocket} ws - The WebSocket connection to send the response to. + * @param {Object} message - The message to be sent to the client. + */ + sendMessageToClient = (ws, message) => { + ws.send(JSON.stringify(message)); + }; + + /** + * Generic function to create or update a message. + * @param {Object} message - The original message. + * @param {Array} nodes - The nodes to be included in the message. + * @param {String} type - The type of the message. Should be either 'read' or 'update'. + * @returns {Object} - The transformed message. + */ + createOrUpdateMessage(message, nodes, type) { + const transformedNodes = nodes.map((node) => ({ + name: node.name, + value: node.value, + })); + return { + ...message, + nodes: transformedNodes, + type, + timestamp: new Date().toISOString(), + }; } } diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index ed5c6bd..ed23766 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -14,10 +14,6 @@ const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); const endpointsType = require("../config/endpointsType"); const database = require("../config/databaseParams"); -const sendMessageToClient = (ws, message) => { - ws.send(JSON.stringify(message)); -}; - /** * Creates an object to insert data in IoTDB based on the provided message. * @@ -40,54 +36,6 @@ function createObjectToInsert(message) { return data; } -/** - * Creates an update message object based on the provided message and response nodes. - * - * @param {Object} message - The original message object containing tree, id, and uuid properties. - * @param {Array} responseNodes - An array of response nodes to be included in the update message. - * @returns {Object} The constructed update message object. - */ -function createUpdateMessage(message, responseNodes) { - const { id, tree, uuid } = message; - let updateMessage = { - type: "update", - tree: tree, - id: id, - dateTime: new Date().toISOString(), - uuid: uuid, - }; - if (responseNodes.length == 1) { - updateMessage["node"] = responseNodes[0]; - } else { - updateMessage["nodes"] = responseNodes; - } - return updateMessage; -} - -/** - * Creates a read message object based on the provided message and nodes names. - * - * @param {Object} message - The message object containing tree, id, and uuid properties. - * @param {Array} nodeNames - An array of node names. If the array contains one field, it will be added as 'node'. - * If the array contains multiple fields, they will be added as 'nodes'. - * @returns {Object} The constructed read message object. - */ -function createReadMessage(message, nodeNames) { - const { id, tree, uuid } = message; - let readMessage = { - type: "read", - tree: tree, - id: id, - uuid: uuid, - }; - if (nodeNames.length == 1) { - readMessage["node"] = nodeNames[0]; - } else { - readMessage["nodes"] = nodeNames; - } - return readMessage; -} - class IoTDBHandler extends Handler { constructor() { super(); @@ -131,16 +79,23 @@ class IoTDBHandler extends Handler { await this.#openSessionIfNeeded(); const responseNodes = await this.#queryLastFields(message, ws); if (responseNodes.length > 0) { - const responseMessage = createUpdateMessage(message, responseNodes); + const responseMessage = this.createOrUpdateMessage( + message, + responseNodes, + "update" + ); console.log(responseMessage); - sendMessageToClient(ws, responseMessage); + this.sendMessageToClient(ws, responseMessage); } else { console.log("Object not found."); - sendMessageToClient(ws, JSON.stringify({ error: "Object not found." })); + this.sendMessageToClient( + ws, + JSON.stringify({ error: "Object not found." }) + ); } } catch (error) { console.error("Failed to read data from IoTDB: ", error); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: "Error reading object" }) ); @@ -191,22 +146,29 @@ class IoTDBHandler extends Handler { name, })); - const readMessage = createReadMessage(message, keyList); + const readMessage = this.createOrUpdateMessage(message, keyList, "read"); console.log(readMessage); const responseNodes = await this.#queryLastFields(message, ws); if (responseNodes.length) { - const responseMessage = createUpdateMessage(message, responseNodes); + const responseMessage = this.createOrUpdateMessage( + message, + responseNodes, + "update" + ); console.log(responseMessage); this.sendMessageToClients(responseMessage); } else { console.log("Object not found."); - sendMessageToClient(ws, JSON.stringify({ error: "Object not found." })); + this.sendMessageToClient( + ws, + JSON.stringify({ error: "Object not found." }) + ); } } catch (error) { console.error(`Failed writing data to IoTDB. ${error}`); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: `Failed writing data. ${error}` }) ); @@ -426,7 +388,7 @@ class IoTDBHandler extends Handler { })); } catch (error) { console.error(error); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: "Internal error constructing read object." }) ); diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index 8282963..ba03fc6 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -8,50 +8,6 @@ const { v4: uuidv4 } = require("uuid"); const app = new Realm.App({ id: config.realmAppId }); const credentials = Realm.Credentials.apiKey(config.realmApiKey); -const sendMessageToClient = (ws, message) => { - ws.send(JSON.stringify(message)); -}; - -/** - * Creates a message header object with the specified type and properties from the given original messageHeader. - * - * @param {Object} messageHeader - The original message header object. - * @param {string} type - The type of the message header, e.g., "update" or "read". - * @returns {Object} The newly created message header object. - */ -const createMessageHeader = (messageHeader, type) => { - const header = { - type, - tree: messageHeader.tree, - id: messageHeader.id, - uuid: messageHeader.uuid, - }; - - if (type === "update") { - header.dateTime = new Date().toISOString(); - } - - return header; -}; - -/** - * Creates a new message object with a header and response nodes. - * - * @param {string} message - The message content. - * @param {Array} responseNodes - An array of response nodes. - * @param {string} type - The type of the message, e.g., "update" or "read". - * @returns {Object} The newly created message object. - */ -const createMessage = (message, responseNodes, type) => { - const newMessage = createMessageHeader(message, type); - if (responseNodes.length === 1) { - newMessage.node = responseNodes[0]; - } else { - newMessage.nodes = responseNodes; - } - return newMessage; -}; - /** * Parses the response from a read event. * @@ -121,10 +77,10 @@ class RealmDBHandler extends Handler { try { const updateMessage = await this.#getMessageData(message, ws); console.log(updateMessage); - sendMessageToClient(ws, JSON.stringify(updateMessage)); + this.sendMessageToClient(ws, JSON.stringify(updateMessage)); } catch (error) { console.error("Error reading object from Realm:", error); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: "Error reading object" }) ); @@ -160,13 +116,17 @@ class RealmDBHandler extends Handler { } let messageNodes = endpoints.map((key) => ({ name: key })); - const readMessage = createMessage(message, messageNodes, "read"); + const readMessage = this.createOrUpdateMessage( + message, + messageNodes, + "read" + ); const updateMessage = await this.#getMessageData(readMessage, ws); console.log(updateMessage); this.sendMessageToClients(JSON.stringify(updateMessage)); } catch (error) { console.error("Error writing object changes in Realm:", error); - sendMessageToClient(ws, { error: "Error writing object changes" }); + this.sendMessageToClient(ws, { error: "Error writing object changes" }); } } @@ -196,23 +156,28 @@ class RealmDBHandler extends Handler { }) ); console.log(`Subscribed to changes for Object ID: ${objectId}`); - sendMessageToClient(ws, { + this.sendMessageToClient(ws, { success: `Subscribed to changes for Object ID: ${objectId}`, }); } else { console.log(`Object could not be subscribed`); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: "Object could not be subscribed" }) ); } } else { console.log(`Object not found`); - sendMessageToClient(ws, JSON.stringify({ error: "Object not found" })); + this.sendMessageToClient( + ws, + JSON.stringify({ error: "Object not found" }) + ); } } catch (error) { console.error("Error subscribing to object changes in Realm:", error); - sendMessageToClient(ws, { error: "Error subscribing to object changes" }); + this.sendMessageToClient(ws, { + error: "Error subscribing to object changes", + }); } } @@ -229,7 +194,7 @@ class RealmDBHandler extends Handler { console.log("mediaElement: ", mediaElement); if (mediaElement) { const responseNodes = parseReadResponse(message, mediaElement); - return createMessage(message, responseNodes, "update"); + return this.createOrUpdateMessage(message, responseNodes, "update"); } else { throw new Error(`No data found with the Id: ${message.id}`); } @@ -251,7 +216,7 @@ class RealmDBHandler extends Handler { .filtered(`${endpointId} = '${id}'`)[0]; } catch (error) { console.error("Error reading object from Realm:", error); - sendMessageToClient( + this.sendMessageToClient( ws, JSON.stringify({ error: "Error reading object" }) ); @@ -273,7 +238,7 @@ class RealmDBHandler extends Handler { changes, mediaElement ); - const updateMessage = createMessage( + const updateMessage = this.createOrUpdateMessage( messageHeader, responseNodes, "update" From 6d28e89e57bba09ecb488528c59c51364455f2a6 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Thu, 22 Aug 2024 13:14:02 +0200 Subject: [PATCH 23/39] Support dots separation for endpoint naming in realm db Signed-off-by: Andre Wendel --- .gitignore | 1 + cdsp/information-layer/handlers/handler.js | 40 ++++-- .../handlers/iotdb/src/iotdb-handler.js | 117 ++++++++++-------- .../iotdb/utils/IoTDBDataInterpreter.js | 34 +---- .../handlers/iotdb/utils/IoTDBRpcDataSets.js | 2 +- .../handlers/realmdb/src/realmdb-handler.js | 76 +++++------- cdsp/information-layer/router/src/.env | 2 +- 7 files changed, 135 insertions(+), 137 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/cdsp/information-layer/handlers/handler.js b/cdsp/information-layer/handlers/handler.js index 7ea3025..41b9a19 100644 --- a/cdsp/information-layer/handlers/handler.js +++ b/cdsp/information-layer/handlers/handler.js @@ -56,16 +56,40 @@ class Handler { * @returns {Object} - The transformed message. */ createOrUpdateMessage(message, nodes, type) { - const transformedNodes = nodes.map((node) => ({ - name: node.name, - value: node.value, - })); - return { - ...message, - nodes: transformedNodes, + const { id, tree, uuid } = message; + let newMessage = { type, - timestamp: new Date().toISOString(), + tree, + id, + dateTime: new Date().toISOString(), + uuid, }; + if (nodes.length === 1) { + newMessage["node"] = nodes[0]; + } else { + newMessage["nodes"] = nodes; + } + return newMessage; + } + + /** + * Transforms a message node by replacing all dots with underscores. + * + * @param {string} node - The message node to transform. + * @returns {string} - The transformed message node with dots replaced by underscores. + */ + transformEndpointFromMessageNode(node) { + return `${node}`.replace(/\./g, "_"); + } + + /** + * Transforms a database field name by replacing underscores with all dots. + * + * @param {string} field - The database filed to transform. + * @returns {string} - The transformed to message node replacing underscores by dots. + */ + transformEndpointFromDatabaseFields(field) { + return `${field}`.replace(/\_/g, "."); } } diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js index ed23766..d4c06b3 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js @@ -14,28 +14,6 @@ const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); const endpointsType = require("../config/endpointsType"); const database = require("../config/databaseParams"); -/** - * Creates an object to insert data in IoTDB based on the provided message. - * - * @param {Object} message - The message containing data to be inserted. - * @returns {Object} The data object to be inserted. - */ -function createObjectToInsert(message) { - const { id, tree } = message; - const data = { [database[tree].endpointId]: id }; - if (message.node) { - data[ - IoTDBDataInterpreter.transformEndpointFromMessageNode(message.node.name) - ] = message.node.value; - } else if (message.nodes) { - message.nodes.forEach((node) => { - data[IoTDBDataInterpreter.transformEndpointFromMessageNode(node.name)] = - node.value; - }); - } - return data; -} - class IoTDBHandler extends Handler { constructor() { super(); @@ -88,17 +66,11 @@ class IoTDBHandler extends Handler { this.sendMessageToClient(ws, responseMessage); } else { console.log("Object not found."); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Object not found." }) - ); + this.sendMessageToClient(ws, { error: "Object not found." }); } } catch (error) { console.error("Failed to read data from IoTDB: ", error); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Error reading object" }) - ); + this.sendMessageToClient(ws, { error: "Error reading object" }); } finally { this.#closeSessionIfNeeded(); } @@ -107,7 +79,7 @@ class IoTDBHandler extends Handler { async write(message, ws) { try { await this.#openSessionIfNeeded(); - const data = createObjectToInsert(message); + const data = this.#createObjectToInsert(message); const errorUndefinedTypes = []; let measurements = []; let dataTypes = []; @@ -120,7 +92,6 @@ class IoTDBHandler extends Handler { values.push(value); } else { errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); - continue; } } @@ -161,17 +132,11 @@ class IoTDBHandler extends Handler { this.sendMessageToClients(responseMessage); } else { console.log("Object not found."); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Object not found." }) - ); + this.sendMessageToClient(ws, { error: "Object not found." }); } } catch (error) { console.error(`Failed writing data to IoTDB. ${error}`); - this.sendMessageToClient( - ws, - JSON.stringify({ error: `Failed writing data. ${error}` }) - ); + this.sendMessageToClient(ws, { error: `Failed writing data. ${error}` }); } finally { this.#closeSessionIfNeeded(); } @@ -197,7 +162,7 @@ class IoTDBHandler extends Handler { try { const resp = await this.client.openSession(openSessionReq); - if (this.protocolVersion != resp.serverProtocolVersion) { + if (this.protocolVersion !== resp.serverProtocolVersion) { console.log( "Protocol differ, Client version is " + this.protocolVersion + @@ -205,7 +170,7 @@ class IoTDBHandler extends Handler { resp.serverProtocolVersion ); // version is less than 0.10 - if (resp.serverProtocolVersion == 0) { + if (resp.serverProtocolVersion === 0) { throw new Error("Protocol not supported."); } } @@ -320,8 +285,8 @@ class IoTDBHandler extends Handler { isAligned = false ) { if ( - values.length != dataTypes.length || - values.length != measurements.length + values.length !== dataTypes.length || + values.length !== measurements.length ) { throw "length of data types does not equal to length of values!"; } @@ -351,15 +316,14 @@ class IoTDBHandler extends Handler { async #queryLastFields(message, ws) { const { id: objectId, tree } = message; const { databaseName, endpointId } = database[tree]; - const fieldsToSearch = - IoTDBDataInterpreter.extractEndpointsFromNodes(message).join(", "); + const fieldsToSearch = this.#extractEndpointsFromNodes(message).join(", "); const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time ASC`; try { const sessionDataSet = await this.#executeQueryStatement(sql); if (!sessionDataSet || Object.keys(sessionDataSet).length === 0) { - throw new Error({ error: "Internal error constructing read object." }); + throw new Error("Internal error constructing read object."); } const mediaElements = []; @@ -368,13 +332,21 @@ class IoTDBHandler extends Handler { } let latestValues = {}; - mediaElements.forEach((mediaElement) => { + // extract underscores from media element key + const transformedMediaElement = Object.fromEntries( + Object.entries(mediaElement).map(([key, value]) => { + const newKey = this.transformEndpointFromDatabaseFields(key); + return [newKey, value]; + }) + ); + const transformedObject = IoTDBDataInterpreter.extractNodesFromTimeseries( - mediaElement, + transformedMediaElement, databaseName ); + Object.entries(transformedObject).forEach(([key, value]) => { if (value !== null) { latestValues[key] = value; @@ -388,11 +360,52 @@ class IoTDBHandler extends Handler { })); } catch (error) { console.error(error); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Internal error constructing read object." }) + this.sendMessageToClient(ws, { + error: "Internal error constructing read object.", + }); + } + } + + /** + * Extracts endpoint names from the given message. + * + * This function checks if the message has a single node or multiple nodes and + * extracts the names accordingly. + * + * @param {Object} message - The message containing node(s). + * @returns {Array} An array of endpoint names. + */ + #extractEndpointsFromNodes(message) { + let endpoints = []; + + if (message.node) { + endpoints.push(this.transformEndpointFromMessageNode(message.node.name)); + } else if (message.nodes) { + endpoints = message.nodes.map((node) => + this.transformEndpointFromMessageNode(node.name) ); } + return endpoints; + } + + /** + * Creates an object to insert data in IoTDB based on the provided message. + * + * @param {Object} message - The message containing data to be inserted. + * @returns {Object} The data object to be inserted. + */ + #createObjectToInsert(message) { + const { id, tree } = message; + const data = { [database[tree].endpointId]: id }; + if (message.node) { + data[this.transformEndpointFromMessageNode(message.node.name)] = + message.node.value; + } else if (message.nodes) { + message.nodes.forEach((node) => { + data[this.transformEndpointFromMessageNode(node.name)] = node.value; + }); + } + return data; } } diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js index e665885..2b06fc4 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js @@ -88,7 +88,7 @@ class IoTDBDataInterpreter { static extractNodesFromTimeseries(obj, databaseName) { return Object.entries(obj).reduce((acc, [key, value]) => { if (key.startsWith(databaseName)) { - const newKey = key.replace(`${databaseName}.`, "").replace(/_/g, "."); + const newKey = key.replace(`${databaseName}.`, ""); acc[newKey] = value; } return acc; @@ -108,38 +108,6 @@ class IoTDBDataInterpreter { return { timestamp }; } - - /** - * Extracts endpoint names from the given message. - * - * This function checks if the message has a single node or multiple nodes and - * extracts the names accordingly. - * - * @param {Object} message - The message containing node(s). - * @returns {Array} An array of endpoint names. - */ - static extractEndpointsFromNodes(message) { - let endpoints = []; - - if (message.node) { - endpoints.push(this.transformEndpointFromMessageNode(message.node.name)); - } else if (message.nodes) { - endpoints = message.nodes.map((node) => - this.transformEndpointFromMessageNode(node.name) - ); - } - return endpoints; - } - - /** - * Transforms a message node by replacing all dots with underscores. - * - * @param {string} node - The message node to transform. - * @returns {string} - The transformed message node with dots replaced by underscores. - */ - static transformEndpointFromMessageNode(node) { - return `${node}`.replace(/\./g, "_"); - } } module.exports = { IoTDBDataInterpreter }; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js index 8eda7a3..62bff90 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js +++ b/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js @@ -188,7 +188,7 @@ class IoTDBRpcDataSet { * @returns {boolean} True if there is a cached result, otherwise false. */ #hasCachedResult() { - return this.#queryDataSet !== null && this.#queryDataSet.time.length != 0; + return this.#queryDataSet !== null && this.#queryDataSet.time.length !== 0; } /** diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js index ba03fc6..db7038c 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js @@ -8,26 +8,6 @@ const { v4: uuidv4 } = require("uuid"); const app = new Realm.App({ id: config.realmAppId }); const credentials = Realm.Credentials.apiKey(config.realmApiKey); -/** - * Parses the response from a read event. - * - * @param {Object} message - The message object containing node or nodes information. - * @param {Object} queryResponseObj - The query response object containing values to be mapped. - * @returns {Object} - A data object with keys from the message nodes and values from the query response. - */ -function parseReadResponse(message, queryResponseObj) { - const data = []; - const nodes = message.node ? [message.node] : message.nodes; - nodes.forEach((node) => { - const prop = node.name; - data.push({ - name: prop, - value: queryResponseObj[prop], - }); - }); - return data; -} - /** * Parses the response from a media element change event. * @@ -77,13 +57,10 @@ class RealmDBHandler extends Handler { try { const updateMessage = await this.#getMessageData(message, ws); console.log(updateMessage); - this.sendMessageToClient(ws, JSON.stringify(updateMessage)); + this.sendMessageToClient(ws, updateMessage); } catch (error) { console.error("Error reading object from Realm:", error); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Error reading object" }) - ); + this.sendMessageToClient(ws, { error: "Error reading object" }); } } @@ -96,8 +73,9 @@ class RealmDBHandler extends Handler { if (mediaElement) { this.realm.write(() => { nodes.forEach(({ name, value }) => { + const prop = this.transformEndpointFromMessageNode(name); endpoints.push(name); - mediaElement[name] = value; + mediaElement[prop] = value; }); }); } else { @@ -105,8 +83,9 @@ class RealmDBHandler extends Handler { let document = { _id: uuidv4(), [endpointId]: message.id }; nodes.forEach(({ name, value }) => { + const prop = this.transformEndpointFromMessageNode(name); endpoints.push(name); - document[name] = value; + document[prop] = value; }); const databaseName = database[message.tree].databaseName; @@ -123,7 +102,7 @@ class RealmDBHandler extends Handler { ); const updateMessage = await this.#getMessageData(readMessage, ws); console.log(updateMessage); - this.sendMessageToClients(JSON.stringify(updateMessage)); + this.sendMessageToClients(updateMessage); } catch (error) { console.error("Error writing object changes in Realm:", error); this.sendMessageToClient(ws, { error: "Error writing object changes" }); @@ -161,17 +140,13 @@ class RealmDBHandler extends Handler { }); } else { console.log(`Object could not be subscribed`); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Object could not be subscribed" }) - ); + this.sendMessageToClient(ws, { + error: "Object could not be subscribed", + }); } } else { console.log(`Object not found`); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Object not found" }) - ); + this.sendMessageToClient(ws, { error: "Object not found" }); } } catch (error) { console.error("Error subscribing to object changes in Realm:", error); @@ -193,7 +168,7 @@ class RealmDBHandler extends Handler { const mediaElement = await this.#getMediaElement(message, ws); console.log("mediaElement: ", mediaElement); if (mediaElement) { - const responseNodes = parseReadResponse(message, mediaElement); + const responseNodes = this.#parseReadResponse(message, mediaElement); return this.createOrUpdateMessage(message, responseNodes, "update"); } else { throw new Error(`No data found with the Id: ${message.id}`); @@ -216,10 +191,7 @@ class RealmDBHandler extends Handler { .filtered(`${endpointId} = '${id}'`)[0]; } catch (error) { console.error("Error reading object from Realm:", error); - this.sendMessageToClient( - ws, - JSON.stringify({ error: "Error reading object" }) - ); + this.sendMessageToClient(ws, { error: "Error reading object" }); } } @@ -244,10 +216,30 @@ class RealmDBHandler extends Handler { "update" ); console.log(updateMessage); - this.sendMessageToClients(JSON.stringify(updateMessage)); + this.sendMessageToClients(updateMessage); } } } + + /** + * Parses the response from a read event. + * + * @param {Object} message - The message object containing node or nodes information. + * @param {Object} queryResponseObj - The query response object containing values to be mapped. + * @returns {Object} - A data object with keys from the message nodes and values from the query response. + */ + #parseReadResponse(message, queryResponseObj) { + const data = []; + const nodes = message.node ? [message.node] : message.nodes; + nodes.forEach((node) => { + const prop = this.transformEndpointFromMessageNode(node.name); + data.push({ + name: node.name, + value: queryResponseObj[prop], + }); + }); + return data; + } } module.exports = RealmDBHandler; diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env index 16ac659..bcaf5de 100644 --- a/cdsp/information-layer/router/src/.env +++ b/cdsp/information-layer/router/src/.env @@ -1 +1 @@ -HANDLER_TYPE=realmdb \ No newline at end of file +HANDLER_TYPE=iotdb \ No newline at end of file From deff29cdea841763e0cba9317d53f8a91f7fb726 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Tue, 27 Aug 2024 09:33:42 +0200 Subject: [PATCH 24/39] =?UTF-8?q?=E2=80=A2=20Import=20supported=20endpoint?= =?UTF-8?q?s=20for=20IoTDB=20and=20RealmDB=20from=20YAML/JSON=20files=20to?= =?UTF-8?q?=20configure=20database=20and=20element=20types.=20=E2=80=A2=20?= =?UTF-8?q?[FIXES]:=20=E2=80=A2=20Realm=20Handler:=20Messaging=20during=20?= =?UTF-8?q?document=20edits=20will=20now=20be=20sent=20only=20to=20subscri?= =?UTF-8?q?bed=20clients.=20=E2=80=A2=20Console=20Logging:=20Previously,?= =?UTF-8?q?=20it=20was=20difficult=20to=20differentiate=20between=20messag?= =?UTF-8?q?es=20(errors,=20logs,=20client=20messages)=20in=20the=20console?= =?UTF-8?q?.=20This=20has=20been=20addressed=20by=20including=20a=20logger?= =?UTF-8?q?=20that=20manages=20message=20styles=20and=20types.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andre Wendel --- cdsp/information-layer/README.md | 9 +- cdsp/information-layer/handlers/.gitignore | 3 + cdsp/information-layer/handlers/README.md | 11 +- .../handlers/config/README.md | 28 +++ .../handlers/config/config.js | 22 +++ .../handlers/config/vss_endpoints.json | 107 +++++++++++ .../handlers/config/vss_endpoints.yaml | 87 +++++++++ cdsp/information-layer/handlers/handler.js | 96 ---------- .../handlers/iotdb/config/endpointsType.js | 18 -- .../handlers/iotdb/utils/IoTDBConstants.js | 20 --- cdsp/information-layer/handlers/package.json | 6 + .../realmdb/config/RealmConfiguration.js | 37 ---- .../information-layer/handlers/src/handler.js | 166 ++++++++++++++++++ .../handlers/{ => src}/iotdb/.gitignore | 2 +- .../handlers/{ => src}/iotdb/README.md | 4 +- .../{ => src}/iotdb/config/databaseParams.js | 0 .../src/iotdb/config/endpointsType.js | 46 +++++ .../iotdb/gen-nodejs/IClientRPCService.js | 0 .../iotdb/gen-nodejs/client_types.js | 0 .../iotdb/gen-nodejs/common_types.js | 0 .../handlers/{ => src}/iotdb/package.json | 0 .../{ => src}/iotdb/src/iotdb-handler.js | 118 +++++++------ .../src/iotdb/utils/IoTDBConstants.js | 21 +++ .../iotdb/utils/IoTDBDataInterpreter.js | 48 ++--- .../{ => src}/iotdb/utils/IoTDBRpcDataSets.js | 2 +- .../{ => src}/iotdb/utils/SessionDataSet.js | 2 +- .../handlers/{ => src}/realmdb/.gitignore | 8 +- .../handlers/{ => src}/realmdb/README.md | 6 +- .../realmdb/config/database-params.js} | 8 +- .../src/realmdb/config/realm-configuration.js | 72 ++++++++ .../handlers/{ => src}/realmdb/package.json | 2 +- .../{ => src}/realmdb/src/realmdb-handler.js | 141 ++++++++------- cdsp/information-layer/router/README.md | 4 +- cdsp/information-layer/router/package.json | 4 +- cdsp/information-layer/router/src/.env | 5 +- .../router/src/websocket-server.js | 32 ++-- cdsp/information-layer/utils/logger.js | 51 ++++++ 37 files changed, 839 insertions(+), 347 deletions(-) create mode 100644 cdsp/information-layer/handlers/.gitignore create mode 100644 cdsp/information-layer/handlers/config/README.md create mode 100644 cdsp/information-layer/handlers/config/config.js create mode 100644 cdsp/information-layer/handlers/config/vss_endpoints.json create mode 100644 cdsp/information-layer/handlers/config/vss_endpoints.yaml delete mode 100644 cdsp/information-layer/handlers/handler.js delete mode 100644 cdsp/information-layer/handlers/iotdb/config/endpointsType.js delete mode 100644 cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js create mode 100644 cdsp/information-layer/handlers/package.json delete mode 100644 cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js create mode 100644 cdsp/information-layer/handlers/src/handler.js rename cdsp/information-layer/handlers/{ => src}/iotdb/.gitignore (83%) rename cdsp/information-layer/handlers/{ => src}/iotdb/README.md (95%) rename cdsp/information-layer/handlers/{ => src}/iotdb/config/databaseParams.js (100%) create mode 100644 cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js rename cdsp/information-layer/handlers/{ => src}/iotdb/gen-nodejs/IClientRPCService.js (100%) rename cdsp/information-layer/handlers/{ => src}/iotdb/gen-nodejs/client_types.js (100%) rename cdsp/information-layer/handlers/{ => src}/iotdb/gen-nodejs/common_types.js (100%) rename cdsp/information-layer/handlers/{ => src}/iotdb/package.json (100%) rename cdsp/information-layer/handlers/{ => src}/iotdb/src/iotdb-handler.js (80%) create mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js rename cdsp/information-layer/handlers/{ => src}/iotdb/utils/IoTDBDataInterpreter.js (69%) rename cdsp/information-layer/handlers/{ => src}/iotdb/utils/IoTDBRpcDataSets.js (99%) rename cdsp/information-layer/handlers/{ => src}/iotdb/utils/SessionDataSet.js (98%) rename cdsp/information-layer/handlers/{ => src}/realmdb/.gitignore (52%) rename cdsp/information-layer/handlers/{ => src}/realmdb/README.md (85%) rename cdsp/information-layer/handlers/{realmdb/config/databaseParams.js => src/realmdb/config/database-params.js} (61%) create mode 100644 cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js rename cdsp/information-layer/handlers/{ => src}/realmdb/package.json (87%) rename cdsp/information-layer/handlers/{ => src}/realmdb/src/realmdb-handler.js (63%) create mode 100644 cdsp/information-layer/utils/logger.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index ab7aee2..304f35d 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -20,6 +20,9 @@ The Hello World example in our case is quite simple. We feed an updated value fo ## Choose and prepare your Database +> [!WARNING] +> Before start the application, ensure that the supported endpoints are correctly defined and configured. See [how](./handlers/config/README.md). + ### Realm - Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `Vehicle_VehicleIdentification_VIN` in a collection named *`Vehicles`*. - Ensure that this document as well contains VSS data. Here you can see the supported data in a vehicle document within the *Vehicles* should look like in ATLAS: @@ -73,15 +76,15 @@ The Hello World example in our case is quite simple. We feed an updated value fo See [here](./router/README.md#Run) how to start the database router. ## Look out for the Websocket Server message in the console -If you the handler is running and you are subscribed to that element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: +If the handler is running and you are [subscribed](#subscribing-to-changes) to an element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: ``` { type: 'update', tree: 'VSS', - id: '', + id: '', dateTime: '', - uuid: '', + uuid: '', node: { name: 'CurrentLocation_Longitude', value: `-157845.68200000003` } } ``` diff --git a/cdsp/information-layer/handlers/.gitignore b/cdsp/information-layer/handlers/.gitignore new file mode 100644 index 0000000..645f5bd --- /dev/null +++ b/cdsp/information-layer/handlers/.gitignore @@ -0,0 +1,3 @@ +# Node.js +node_modules/ +package-lock.json \ No newline at end of file diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md index cb4711b..adccb2f 100644 --- a/cdsp/information-layer/handlers/README.md +++ b/cdsp/information-layer/handlers/README.md @@ -1,4 +1,11 @@ # Handlers -- [IotDB](./iotdb) -- [RealmDB](./realmdb) +We support two different databases. + +- [IotDB](./src/iotdb) +- [RealmDB](./src/realmdb) + +> [!WARNING] +> Before start working with any of them, ensure that the supported endpoints are correctly defined and configured. See [how](./handlers/config/README.md). +> +See [hier](../../information-layer/router/README.md) how to install the Database-Router. \ No newline at end of file diff --git a/cdsp/information-layer/handlers/config/README.md b/cdsp/information-layer/handlers/config/README.md new file mode 100644 index 0000000..4f7c265 --- /dev/null +++ b/cdsp/information-layer/handlers/config/README.md @@ -0,0 +1,28 @@ +# Configuration Handler for Endpoints + +This module is responsible for handling the configuration of supported endpoints in the application. It supports JSON, YAML, or YML formats for defining the endpoints. + +The files in this directory `vss_endpoints.yaml` and `vss_endpoints.json` contain the same endpoint definition (only one of them is necessary to build) and based on that, the system will configure the data schema used during the Database configuration. + +> [!WARNING] +> - Before starting the application, ensure that the desired YAML, YML or JSON file is correctly placed in the root directory of the module. This file should contain the definitions of the supported endpoints. The name and extension to use can be configured in the `config.js` file. +> - Ensure that the used file is correctly formatted and contains valid endpoint definitions. +> - **The application will not function correctly if the endpoints file is missing or incorrectly placed.** + +## File: `config.js` + +### Description + +The `config.js` file contains the logic to retrieve the full path to the endpoints configuration file (`vss_endpoints.yaml` in this case). This file is crucial for the application to understand which endpoints are supported and how they should be handled. + +### Functions + +#### `getEndpointsPath` + +This function resolves the root directory path of the current module and joins it with the `ENDPOINTS_FILE` constant to form the full path to the endpoints file. + +```javascript +const getEndpointsPath = () => { + const rootPath = path.resolve(__dirname); + return path.join(rootPath, ENDPOINTS_FILE); +}; diff --git a/cdsp/information-layer/handlers/config/config.js b/cdsp/information-layer/handlers/config/config.js new file mode 100644 index 0000000..f668fa8 --- /dev/null +++ b/cdsp/information-layer/handlers/config/config.js @@ -0,0 +1,22 @@ +const path = require("path"); + +/** + * This file contains the description of the supported endpoints. + * It supports JSON, YAML or YML format. + */ +const ENDPOINTS_FILE = "vss_endpoints.yaml"; + +/** + * Retrieves the full path to the endpoints file. + * + * This function resolves the root directory path of the current module + * and joins it with the ENDPOINTS_FILE constant to form the full path. + * + * @returns {string} The full path to the endpoints file. + */ +const getEndpointsPath = () => { + const rootPath = path.resolve(__dirname); + return path.join(rootPath, ENDPOINTS_FILE); +}; + +module.exports = { getEndpointsPath }; diff --git a/cdsp/information-layer/handlers/config/vss_endpoints.json b/cdsp/information-layer/handlers/config/vss_endpoints.json new file mode 100644 index 0000000..845e2aa --- /dev/null +++ b/cdsp/information-layer/handlers/config/vss_endpoints.json @@ -0,0 +1,107 @@ +{ + "Vehicle": { + "children": { + "Chassis": { + "children": { + "SteeringWheel": { + "children": { + "Angle": { + "datatype": "int16", + "description": "Steering wheel angle. Positive = degrees to the left. Negative = degrees to the right.", + "type": "sensor", + "unit": "degrees" + } + }, + "description": "Steering wheel signals", + "type": "branch" + } + }, + "description": "All data concerning steering, suspension, wheels, and brakes.", + "type": "branch" + }, + "CurrentLocation": { + "children": { + "Latitude": { + "datatype": "double", + "description": "Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", + "max": 90, + "min": -90, + "type": "sensor", + "unit": "degrees" + }, "Longitude": { + "datatype": "double", + "description": "Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", + "max": 180, + "min": -180, + "type": "sensor", + "unit": "degrees" + } + }, + "description": "The current latitude and longitude of the vehicle.", + "type": "branch" + }, + "Powertrain": { + "children": { + "TractionBattery": { + "children": { + "NominalVoltage": { + "comment": "Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.", + "datatype": "uint16", + "description": "Nominal Voltage of the battery.", + "type": "attribute", + "unit": "V" + }, + "StateOfCharge": { + "children": { + "CurrentEnergy": { + "comment": "Current energy could be calculated as .StateOfCharge.Current * .NetCapacity.", + "datatype": "float", + "description": "Physical state of charge of high voltage battery expressed in kWh.", + "type": "sensor", + "unit": "kWh" + } + }, + "description": "Information on the state of charge of the vehicle's high voltage battery.", + "type": "branch" + } + }, + "description": "Battery Management data.", + "type": "branch" + }, + "Transmission": { + "children": { + "CurrentGear": { + "datatype": "int8", + "description": "The current gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse.", + "type": "sensor" + } + }, + "description": "Transmission-specific data, stopping at the drive shafts.", + "type": "branch" + } + }, + "description": "Powertrain data for battery management, etc.", + "type": "branch" + }, + "Speed": { + "datatype": "float", + "description": "Vehicle speed.", + "type": "sensor", + "unit": "km/h" + }, + "VehicleIdentification": { + "children": { + "VIN": { + "datatype": "string", + "description": "17-character Vehicle Identification Number (VIN) as defined by ISO 3779.", + "type": "attribute" + } + }, + "description": "Attributes that identify a vehicle.", + "type": "branch" + } + }, + "description": "High-level vehicle data.", + "type": "branch" + } +} \ No newline at end of file diff --git a/cdsp/information-layer/handlers/config/vss_endpoints.yaml b/cdsp/information-layer/handlers/config/vss_endpoints.yaml new file mode 100644 index 0000000..c628d66 --- /dev/null +++ b/cdsp/information-layer/handlers/config/vss_endpoints.yaml @@ -0,0 +1,87 @@ +Vehicle: + description: High-level vehicle data. + type: branch + +Vehicle.Chassis: + description: All data concerning steering, suspension, wheels, and brakes. + type: branch + +Vehicle.Chassis.SteeringWheel: + description: Steering wheel signals + type: branch + +Vehicle.Chassis.SteeringWheel.Angle: + datatype: int16 + description: Steering wheel angle. Positive = degrees to the left. Negative = degrees to the right. + type: sensor + unit: degrees + +Vehicle.CurrentLocation: + description: The current latitude and longitude of the vehicle. + type: branch + +Vehicle.CurrentLocation.Latitude: + datatype: double + description: Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + max: 90 + min: -90 + type: sensor + unit: degrees + +Vehicle.CurrentLocation.Longitude: + datatype: double + description: Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna. + max: 180 + min: -180 + type: sensor + unit: degrees + +Vehicle.Powertrain: + description: Powertrain data for battery management, etc. + type: branch + +Vehicle.Powertrain.TractionBattery: + description: Battery Management data. + type: branch + +Vehicle.Powertrain.TractionBattery.NominalVoltage: + comment: Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity. + datatype: uint16 + description: Nominal Voltage of the battery. + type: attribute + unit: V + +Vehicle.Powertrain.TractionBattery.StateOfCharge: + description: Information on the state of charge of the vehicle's high voltage battery. + type: branch + +Vehicle.Powertrain.TractionBattery.StateOfCharge.CurrentEnergy: + comment: Current energy could be calculated as .StateOfCharge.Current * .NetCapacity. + datatype: float + description: Physical state of charge of high voltage battery expressed in kWh. + type: sensor + unit: kWh + +Vehicle.Powertrain.Transmission: + description: Transmission-specific data, stopping at the drive shafts. + type: branch + +Vehicle.Powertrain.Transmission.CurrentGear: + datatype: int8 + description: The current gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse. + type: sensor + +Vehicle.Speed: + datatype: float + description: Vehicle speed. + type: sensor + unit: km/h + +Vehicle.VehicleIdentification: + description: Attributes that identify a vehicle. + type: branch + +Vehicle.VehicleIdentification.VIN: + datatype: string + description: 17-character Vehicle Identification Number (VIN) as defined by ISO 3779. + type: attribute diff --git a/cdsp/information-layer/handlers/handler.js b/cdsp/information-layer/handlers/handler.js deleted file mode 100644 index 41b9a19..0000000 --- a/cdsp/information-layer/handlers/handler.js +++ /dev/null @@ -1,96 +0,0 @@ -class Handler { - authenticateAndConnect(sendMessageToClients) { - throw new Error("Method 'authenticateAndConnect' must be implemented."); - } - - handleMessage(message, ws) { - try { - switch (message.type) { - case "read": - this.read(message, ws); - break; - case "write": - this.write(message, ws); - break; - case "subscribe": - this.subscribe(message, ws); - break; - default: - ws.send(JSON.stringify({ error: "Unknown message type" })); - } - } catch (error) { - ws.send(JSON.stringify({ error: error.message })); - } - } - - read(message, ws) { - throw new Error("Read method not implemented yet!"); - } - - write(message, ws) { - throw new Error("Write method not implemented yet!"); - } - - subscribe(message, ws) { - throw new Error("Subscribe method not implemented yet!"); - } - - /** - * Utility functions for handling messages and data structures common to IoTDB and RealmDB. - */ - - /** - * Sends a message to the client - * @param {WebSocket} ws - The WebSocket connection to send the response to. - * @param {Object} message - The message to be sent to the client. - */ - sendMessageToClient = (ws, message) => { - ws.send(JSON.stringify(message)); - }; - - /** - * Generic function to create or update a message. - * @param {Object} message - The original message. - * @param {Array} nodes - The nodes to be included in the message. - * @param {String} type - The type of the message. Should be either 'read' or 'update'. - * @returns {Object} - The transformed message. - */ - createOrUpdateMessage(message, nodes, type) { - const { id, tree, uuid } = message; - let newMessage = { - type, - tree, - id, - dateTime: new Date().toISOString(), - uuid, - }; - if (nodes.length === 1) { - newMessage["node"] = nodes[0]; - } else { - newMessage["nodes"] = nodes; - } - return newMessage; - } - - /** - * Transforms a message node by replacing all dots with underscores. - * - * @param {string} node - The message node to transform. - * @returns {string} - The transformed message node with dots replaced by underscores. - */ - transformEndpointFromMessageNode(node) { - return `${node}`.replace(/\./g, "_"); - } - - /** - * Transforms a database field name by replacing underscores with all dots. - * - * @param {string} field - The database filed to transform. - * @returns {string} - The transformed to message node replacing underscores by dots. - */ - transformEndpointFromDatabaseFields(field) { - return `${field}`.replace(/\_/g, "."); - } -} - -module.exports = Handler; diff --git a/cdsp/information-layer/handlers/iotdb/config/endpointsType.js b/cdsp/information-layer/handlers/iotdb/config/endpointsType.js deleted file mode 100644 index 5b10c3b..0000000 --- a/cdsp/information-layer/handlers/iotdb/config/endpointsType.js +++ /dev/null @@ -1,18 +0,0 @@ -const { MessageDataType } = require("../utils/IoTDBConstants"); - -/* - * Define the supported endpoints and the corresponding data types. - */ -const endpointsType = Object.freeze({ - Vehicle_Chassis_SteeringWheel_Angle: MessageDataType.INT16, - Vehicle_CurrentLocation_Latitude: MessageDataType.DOUBLE, - Vehicle_CurrentLocation_Longitude: MessageDataType.DOUBLE, - Vehicle_Powertrain_TractionBattery_NominalVoltage: MessageDataType.UINT16, - Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: - MessageDataType.FLOAT, - Vehicle_Powertrain_Transmission_CurrentGear: MessageDataType.INT8, - Vehicle_Speed: MessageDataType.FLOAT, - Vehicle_VehicleIdentification_VIN: MessageDataType.STRING, -}); - -module.exports = endpointsType; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js b/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js deleted file mode 100644 index 8d6048d..0000000 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js +++ /dev/null @@ -1,20 +0,0 @@ -const IoTDBDataType = Object.freeze({ - BOOLEAN: 0, - INT32: 1, - INT64: 2, - FLOAT: 3, - DOUBLE: 4, - TEXT: 5, -}); - -const MessageDataType = Object.freeze({ - INT8: 0, - INT16: 1, - INT32: 2, - UINT16: 3, - FLOAT: 4, - DOUBLE: 5, - STRING: 6, -}); - -module.exports = { IoTDBDataType, MessageDataType }; diff --git a/cdsp/information-layer/handlers/package.json b/cdsp/information-layer/handlers/package.json new file mode 100644 index 0000000..63909dd --- /dev/null +++ b/cdsp/information-layer/handlers/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "js-yaml": "^4.1.0" + } +} diff --git a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js b/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js deleted file mode 100644 index 38d8011..0000000 --- a/cdsp/information-layer/handlers/realmdb/config/RealmConfiguration.js +++ /dev/null @@ -1,37 +0,0 @@ -const database = require("./databaseParams"); - -const MediaElementSchema = { - primaryKey: "_id", - name: database.VSS.databaseName, - properties: { - _id: "string", - Vehicle_Chassis_SteeringWheel_Angle: "int", - Vehicle_CurrentLocation_Latitude: "double", - Vehicle_CurrentLocation_Longitude: "double", - Vehicle_Powertrain_TractionBattery_NominalVoltage: "int", - Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: "float", - Vehicle_Powertrain_Transmission_CurrentGear: "int", - Vehicle_Speed: "float", - Vehicle_VehicleIdentification_VIN: "string", - }, -}; - -/** - * Generates a configuration object for a Realm database. - * - * @param {object} user - The user object from the authentication. - * @returns {object} The configuration object for the Realm database. - */ -const realmConfig = (user) => ({ - schema: [MediaElementSchema], - path: "myrealm12.realm", - sync: { - user: user, - flexible: true, - error: (error) => { - console.error("Realm sync error:", error); - }, - }, -}); - -module.exports = realmConfig; diff --git a/cdsp/information-layer/handlers/src/handler.js b/cdsp/information-layer/handlers/src/handler.js new file mode 100644 index 0000000..0490ac4 --- /dev/null +++ b/cdsp/information-layer/handlers/src/handler.js @@ -0,0 +1,166 @@ +const config = require("../config/config"); +const fs = require("fs"); +const yaml = require("js-yaml"); +const { logMessage, MessageType } = require("../../utils/logger"); +/** + * Reads and parses an endpoints file in either JSON, YML or YAML format. + * + * @param {string} filePath - The path to the endpoints file. + * @returns {Object} The parsed content of the endpoints file. + * @throws {Error} If the file format is unsupported. + */ +function readEndpointsFile(filePath) { + const fileContent = fs.readFileSync(filePath, "utf8"); + if (filePath.endsWith(".json")) { + return JSON.parse(fileContent); + } else if (filePath.endsWith(".yaml") || filePath.endsWith(".yml")) { + return yaml.load(fileContent); + } else { + throw new Error("Unsupported endpoints file format"); + } +} + +/** + * Recursively extracts data types from an endpoints object. + * + * @param {Object} endpointsObj - The object containing endpoint definitions. + * @param {string} [parentKey=""] - The parent key used to build the nested key path. + * @param {Object} [result={}] - The object to store the extracted data types. + * @returns {Object} An object mapping endpoint keys to their data types. + */ +function extractDataTypes(endpointsObj, parentKey = "", result = {}) { + for (const key in endpointsObj) { + if (endpointsObj.hasOwnProperty(key)) { + const value = endpointsObj[key]; + const newKey = parentKey ? `${parentKey}.${key}` : key; + if (value && typeof value === "object") { + if (value.datatype) { + result[newKey] = value.datatype; + } else { + extractDataTypes(value.children || value, newKey, result); + } + } + } + } + return result; +} + +class Handler { + handleMessage(message, ws) { + try { + switch (message.type) { + case "read": + this.read(message, ws); + break; + case "write": + this.write(message, ws); + break; + case "subscribe": + this.subscribe(message, ws); + break; + default: + ws.send(JSON.stringify({ error: "Unknown message type" })); + } + } catch (error) { + ws.send(JSON.stringify({ error: error.message })); + } + } + + authenticateAndConnect(sendMessageToClients) { + throw new Error("Method 'authenticateAndConnect' must be implemented."); + } + + read(message, ws) { + throw new Error("Read method not implemented yet!"); + } + + write(message, ws) { + throw new Error("Write method not implemented yet!"); + } + + subscribe(message, ws) { + throw new Error("Subscribe method not implemented yet!"); + } + + /** + * Utility functions for handling messages and data structures common to IoTDB and RealmDB. + */ + + /** + * Sends a message to the client + * @param {WebSocket} ws - The WebSocket connection to send the response to. + * @param {Object} message - The message to be sent to the client. + */ + _sendMessageToClient = (ws, message) => { + logMessage(JSON.stringify(message), MessageType.SENT); + ws.send(JSON.stringify(message)); + }; + + /** + * Generic function to create an update message. + * @param {Object} message - The original message from client. + * @param {Array} nodes - The nodes to be included in the message. + * @returns {Object} - The transformed message. + */ + _createUpdateMessage(message, nodes) { + const { id, tree, uuid } = message; + let newMessage = { + type: "update", + tree, + id, + dateTime: new Date().toISOString(), + uuid, + }; + if (nodes.length === 1) { + newMessage["node"] = nodes[0]; + } else { + newMessage["nodes"] = nodes; + } + return newMessage; + } + + /** + * Transforms a message node by replacing all dots with underscores. + * + * @param {string} node - The message node to transform. + * @returns {string} - The transformed message node with dots replaced by underscores. + */ + _transformEndpointsWithUnderscores(node) { + return `${node}`.replace(/\./g, "_"); + } + + /** + * Transforms a database field name by replacing underscores with all dots. + * + * @param {string} field - The database filed to transform. + * @returns {string} - The transformed to message node replacing underscores by dots. + */ + _transformEndpointsWithDots(field) { + return `${field}`.replace(/\_/g, "."); + } + + /** + * Retrieves and processes supported endpoints. + * + * This method reads the endpoints configuration file, extracts the data types, + * and transforms the endpoint names to use underscores. It returns an object + * with the transformed endpoint names as keys and their corresponding data types. + * + * @returns {Object} An object containing the supported endpoints with transformed names and data types. + */ + _getSupportedEndpoints() { + const endpointPath = config.getEndpointsPath(); + const endpointObj = readEndpointsFile(endpointPath); + const supportedEndpoints = extractDataTypes(endpointObj); + let result = {}; + Object.entries(supportedEndpoints).forEach(([node, value]) => { + const underscored_node = this._transformEndpointsWithUnderscores(node); + if (value !== null) { + result[underscored_node] = value; + } + }); + return result; + } +} + +module.exports = Handler; diff --git a/cdsp/information-layer/handlers/iotdb/.gitignore b/cdsp/information-layer/handlers/src/iotdb/.gitignore similarity index 83% rename from cdsp/information-layer/handlers/iotdb/.gitignore rename to cdsp/information-layer/handlers/src/iotdb/.gitignore index 9b7b860..3cdddbd 100644 --- a/cdsp/information-layer/handlers/iotdb/.gitignore +++ b/cdsp/information-layer/handlers/src/iotdb/.gitignore @@ -3,7 +3,7 @@ node_modules/ package-lock.json # Credentials Config File -config.js +config/config.js # MAC **/.DS_Store diff --git a/cdsp/information-layer/handlers/iotdb/README.md b/cdsp/information-layer/handlers/src/iotdb/README.md similarity index 95% rename from cdsp/information-layer/handlers/iotdb/README.md rename to cdsp/information-layer/handlers/src/iotdb/README.md index 430d176..03028ab 100644 --- a/cdsp/information-layer/handlers/iotdb/README.md +++ b/cdsp/information-layer/handlers/src/iotdb/README.md @@ -1,3 +1,5 @@ +# IoTDB + This directory contains the IoTDB Handler as a Node.js application. As [Apache IoTDB](https://iotdb.apache.org/) is a time-series database, the IoTDB Handler connects to an existing IoTDB instance using the Thrift protocol. The handler utilizes the [IoTDB Thrift API](https://github.com/apache/thrift) to communicate with the database and perform operations. Configuration details, such as the IoTDB host, port, user credentials, and time zone, are specified in the handler's configuration file. The IoTDB Handler is designed to manage sessions, execute queries, and interact with the IoTDB instance efficiently during runtime. # Features @@ -36,4 +38,4 @@ module.exports = { ## Starting the IoTDB handler -You do not need to start IotDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). \ No newline at end of file +You do not need to start IotDB Handler manually. It is started by the DB-Router like described [here](../../../router/README.md#Run). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/iotdb/config/databaseParams.js b/cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js similarity index 100% rename from cdsp/information-layer/handlers/iotdb/config/databaseParams.js rename to cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js diff --git a/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js b/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js new file mode 100644 index 0000000..8d30e2d --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js @@ -0,0 +1,46 @@ +const { SupportedMessageDataTypes } = require("../utils/IoTDBConstants"); + +class EndpointsSchema { + constructor(supportedEndpoints) { + const properties = {}; + + Object.entries(supportedEndpoints).forEach(([key, value]) => { + if (SupportedMessageDataTypes.hasOwnProperty(value)) { + properties[key] = value; + } else { + throw new Error( + `The initialized endpoints contains an unsupported data type: ${value}` + ); + } + }); + + this.endpointsSchema = properties; + Object.freeze(this.endpointsSchema); + } + + getEndpointsSchema() { + return this.endpointsSchema; + } +} + +// Singleton instance holder +let endpointsSchemaInstance = null; + +/** + * Creates and returns a singleton instance of EndpointsSchema. + * If the instance does not already exist, it initializes it with the provided supported endpoints + * and freezes the instance to prevent further modifications. + * + * @param {Object} supportedEndpoints - An object of supported endpoints to initialize the schema. + * @returns {Object} The endpoints schema instance. + */ +function createEndpointsSchema(supportedEndpoints) { + if (!endpointsSchemaInstance) { + endpointsSchemaInstance = new EndpointsSchema(supportedEndpoints); + Object.freeze(endpointsSchemaInstance); + } + + return endpointsSchemaInstance.getEndpointsSchema(); +} + +module.exports = { createEndpointsSchema }; diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js similarity index 100% rename from cdsp/information-layer/handlers/iotdb/gen-nodejs/IClientRPCService.js rename to cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js similarity index 100% rename from cdsp/information-layer/handlers/iotdb/gen-nodejs/client_types.js rename to cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js diff --git a/cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js similarity index 100% rename from cdsp/information-layer/handlers/iotdb/gen-nodejs/common_types.js rename to cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js diff --git a/cdsp/information-layer/handlers/iotdb/package.json b/cdsp/information-layer/handlers/src/iotdb/package.json similarity index 100% rename from cdsp/information-layer/handlers/iotdb/package.json rename to cdsp/information-layer/handlers/src/iotdb/package.json diff --git a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js similarity index 80% rename from cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js rename to cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js index d4c06b3..2152024 100644 --- a/cdsp/information-layer/handlers/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js @@ -11,25 +11,32 @@ const Handler = require("../../handler"); const config = require("../config/config"); const SessionDataSet = require("../utils/SessionDataSet"); const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); -const endpointsType = require("../config/endpointsType"); +const { createEndpointsSchema } = require("../config/endpointsType"); const database = require("../config/databaseParams"); +const { + logMessage, + logWithColor, + MessageType, + COLORS, +} = require("../../../../utils/logger"); class IoTDBHandler extends Handler { constructor() { super(); this.client = null; - this.sendMessageToClients = null; + this._sendMessageToClients = null; this.sessionId = null; this.protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3; this.statementId = null; this.zoneId = config.timeZoneId; this.fetchSize = config.fetchSize; this.isSessionClosed = true; + this.endpointsSchema = null; } async authenticateAndConnect(sendMessageToClients) { try { - this.sendMessageToClients = sendMessageToClients; + this._sendMessageToClients = sendMessageToClients; const connection = thrift.createConnection( config.iotdbHost, @@ -42,13 +49,22 @@ class IoTDBHandler extends Handler { this.client = thrift.createClient(Client, connection); - connection.on("error", (err) => { - console.error("thrift connection error:", err); + connection.on("error", (error) => { + logMessage( + "thrift connection error: ".concat(error), + MessageType.ERROR + ); }); - console.log("Successfully connected to IoTDB using thrift."); + const supportedEndpoint = this._getSupportedEndpoints(); + this.endpointsSchema = createEndpointsSchema(supportedEndpoint); + + console.info("Successfully connected to IoTDB using thrift"); } catch (error) { - console.error("Failed to authenticate with IoTDB:", error); + logMessage( + "Failed to authenticate with IoTDB: ".concat(error), + MessageType.ERROR + ); } } @@ -57,20 +73,16 @@ class IoTDBHandler extends Handler { await this.#openSessionIfNeeded(); const responseNodes = await this.#queryLastFields(message, ws); if (responseNodes.length > 0) { - const responseMessage = this.createOrUpdateMessage( + const responseMessage = this._createUpdateMessage( message, - responseNodes, - "update" + responseNodes ); - console.log(responseMessage); - this.sendMessageToClient(ws, responseMessage); + this._sendMessageToClient(ws, responseMessage); } else { - console.log("Object not found."); - this.sendMessageToClient(ws, { error: "Object not found." }); + this._sendMessageToClient(ws, { error: "Object not found." }); } } catch (error) { - console.error("Failed to read data from IoTDB: ", error); - this.sendMessageToClient(ws, { error: "Error reading object" }); + this._sendMessageToClient(ws, { error: "Error reading object" }); } finally { this.#closeSessionIfNeeded(); } @@ -86,9 +98,9 @@ class IoTDBHandler extends Handler { let values = []; for (const [key, value] of Object.entries(data)) { - if (endpointsType.hasOwnProperty(key)) { + if (this.endpointsSchema.hasOwnProperty(key)) { measurements.push(key); - dataTypes.push(endpointsType[key]); + dataTypes.push(this.endpointsSchema[key]); values.push(value); } else { errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); @@ -110,33 +122,26 @@ class IoTDBHandler extends Handler { values ); - const response = `Insert one record to device ${deviceId}, status: `; - console.log(response, status); - - let keyList = measurements.map((name) => ({ - name, - })); - - const readMessage = this.createOrUpdateMessage(message, keyList, "read"); - console.log(readMessage); + logWithColor( + `Record inserted to device ${deviceId}, status code: `.concat( + JSON.stringify(status) + ), + COLORS.GREY + ); const responseNodes = await this.#queryLastFields(message, ws); if (responseNodes.length) { - const responseMessage = this.createOrUpdateMessage( + const responseMessage = this._createUpdateMessage( message, - responseNodes, - "update" + responseNodes ); - console.log(responseMessage); - this.sendMessageToClients(responseMessage); + this._sendMessageToClients(responseMessage); } else { - console.log("Object not found."); - this.sendMessageToClient(ws, { error: "Object not found." }); + this._sendMessageToClient(ws, { error: "Object not found." }); } } catch (error) { - console.error(`Failed writing data to IoTDB. ${error}`); - this.sendMessageToClient(ws, { error: `Failed writing data. ${error}` }); + this._sendMessageToClient(ws, { error: `Failed writing data. ${error}` }); } finally { this.#closeSessionIfNeeded(); } @@ -163,7 +168,7 @@ class IoTDBHandler extends Handler { const resp = await this.client.openSession(openSessionReq); if (this.protocolVersion !== resp.serverProtocolVersion) { - console.log( + console.info( "Protocol differ, Client version is " + this.protocolVersion + ", but Server version is " + @@ -178,9 +183,12 @@ class IoTDBHandler extends Handler { this.sessionId = resp.sessionId; this.statementId = await this.client.requestStatementId(this.sessionId); this.isSessionClosed = false; - console.log("Session started!"); + console.info("Session started!"); } catch (error) { - console.error("Failed starting session with IoTDB: ", error); + logMessage( + "Failed starting session with IoTDB: ".concat(error), + MessageType.ERROR + ); } } @@ -200,13 +208,15 @@ class IoTDBHandler extends Handler { try { this.client.closeSession(req); } catch (error) { - console.error( - "Error occurs when closing session at server. Maybe server is down. Error message: ", - error + logMessage( + "Error occurs when closing session at server. Maybe server is down. Error message: ".concat( + error + ), + MessageType.ERROR ); } finally { this.isSessionClosed = true; - console.log("Session closed!"); + console.info("Session closed!"); } } @@ -261,7 +271,10 @@ class IoTDBHandler extends Handler { ); } } catch (error) { - console.error("Failed executing query statement: ", error); + logMessage( + "Failed executing query statement: ".concat(error), + MessageType.ERROR + ); } } @@ -336,7 +349,7 @@ class IoTDBHandler extends Handler { // extract underscores from media element key const transformedMediaElement = Object.fromEntries( Object.entries(mediaElement).map(([key, value]) => { - const newKey = this.transformEndpointFromDatabaseFields(key); + const newKey = this._transformEndpointsWithDots(key); return [newKey, value]; }) ); @@ -359,9 +372,8 @@ class IoTDBHandler extends Handler { value, })); } catch (error) { - console.error(error); - this.sendMessageToClient(ws, { - error: "Internal error constructing read object.", + this._sendMessageToClient(ws, { + error: "internal error constructing read object", }); } } @@ -379,10 +391,12 @@ class IoTDBHandler extends Handler { let endpoints = []; if (message.node) { - endpoints.push(this.transformEndpointFromMessageNode(message.node.name)); + endpoints.push( + this._transformEndpointsWithUnderscores(message.node.name) + ); } else if (message.nodes) { endpoints = message.nodes.map((node) => - this.transformEndpointFromMessageNode(node.name) + this._transformEndpointsWithUnderscores(node.name) ); } return endpoints; @@ -398,11 +412,11 @@ class IoTDBHandler extends Handler { const { id, tree } = message; const data = { [database[tree].endpointId]: id }; if (message.node) { - data[this.transformEndpointFromMessageNode(message.node.name)] = + data[this._transformEndpointsWithUnderscores(message.node.name)] = message.node.value; } else if (message.nodes) { message.nodes.forEach((node) => { - data[this.transformEndpointFromMessageNode(node.name)] = node.value; + data[this._transformEndpointsWithUnderscores(node.name)] = node.value; }); } return data; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js new file mode 100644 index 0000000..152f176 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js @@ -0,0 +1,21 @@ +const IoTDBDataType = Object.freeze({ + BOOLEAN: 0, + INT32: 1, + INT64: 2, + FLOAT: 3, + DOUBLE: 4, + TEXT: 5, +}); + +const SupportedMessageDataTypes = Object.freeze({ + boolean: "boolean", + string: "string", + float: "float", + double: "double", + int8: "int8", + int16: "int16", + uint8: "uint8", + uint16: "uint16", +}); + +module.exports = { IoTDBDataType, SupportedMessageDataTypes }; diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js similarity index 69% rename from cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js rename to cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js index 2b06fc4..840112e 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBDataInterpreter.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js @@ -1,5 +1,7 @@ -const { IoTDBDataType, MessageDataType } = require("./IoTDBConstants"); -const database = require("../config/databaseParams"); +const { + IoTDBDataType, + SupportedMessageDataTypes, +} = require("./IoTDBConstants"); class IoTDBDataInterpreter { /** @@ -9,10 +11,9 @@ class IoTDBDataInterpreter { * @returns {Buffer} - Serialized values as a Buffer. */ static serializeValues(dataTypes, values) { - // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js - // function serializeBoolean(value) { - // return [IoTDBDataType.BOOLEAN, value]; - // } + function serializeBoolean(value) { + return [IoTDBDataType.BOOLEAN, value]; + } function serializeInt32(value) { const int32 = new Int32Array([value]); @@ -20,12 +21,11 @@ class IoTDBDataInterpreter { return [IoTDBDataType.INT32, ...uint8]; } - // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js - // function serializeInt64(value) { - // const bigint64 = new BigInt64Array([value]); - // const uint8 = new Uint8Array(bigint64.buffer).reverse(); - // return [IoTDBDataType.INT64, ...uint8]; - // } + function serializeInt64(value) { + const bigint64 = new BigInt64Array([value]); + const uint8 = new Uint8Array(bigint64.buffer).reverse(); + return [IoTDBDataType.INT64, ...uint8]; + } function serializeFloat(value) { const float32 = new Float32Array([value]); @@ -50,29 +50,29 @@ class IoTDBDataInterpreter { for (let i = 0; i < dataTypes.length; i++) { switch (dataTypes[i]) { - // case MessageDataType.BOOLEAN: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js - // serializedValues.push(...serializeBoolean(values[i])); - // break; - case MessageDataType.INT8: - case MessageDataType.INT16: - case MessageDataType.UINT16: - //case MessageDataType.UINT32: + case SupportedMessageDataTypes.boolean: + serializedValues.push(...serializeBoolean(values[i])); + break; + case SupportedMessageDataTypes.int8: + case SupportedMessageDataTypes.int16: + case SupportedMessageDataTypes.uint8: + case SupportedMessageDataTypes.uint16: serializedValues.push(...serializeInt32(values[i])); break; - // case MessageDataType.INT64: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // case SupportedMessageDataTypes.int64: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js // serializedValues.push(...serializeInt64(values[i])); // break; - case MessageDataType.FLOAT: + case SupportedMessageDataTypes.float: serializedValues.push(...serializeFloat(values[i])); break; - case MessageDataType.DOUBLE: + case SupportedMessageDataTypes.double: serializedValues.push(...serializeDouble(values[i])); break; - case MessageDataType.STRING: + case SupportedMessageDataTypes.string: serializedValues.push(...serializeText(values[i])); break; default: - throw new Error("Unsupported data type"); + throw new Error(`Unsupported data type: ${dataTypes[i]}`); } } return Buffer.from(serializedValues); diff --git a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js similarity index 99% rename from cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js rename to cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js index 62bff90..b103b23 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/IoTDBRpcDataSets.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js @@ -242,7 +242,7 @@ class IoTDBRpcDataSet { this.#queryDataSet.valueList[i] = valueBuffer.slice(4 + length); break; default: - throw new Error("Unsupported data type."); + throw new Error(`Unsupported data type: ${dataType}`); } } } diff --git a/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js b/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js similarity index 98% rename from cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js rename to cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js index 47bb9bc..c4b0b79 100644 --- a/cdsp/information-layer/handlers/iotdb/utils/SessionDataSet.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js @@ -120,7 +120,7 @@ class SessionDataSet { if (dataTypeProcessors[dataType]) { obj[tsName] = dataTypeProcessors[dataType](valueBytes); } else { - throw new Error("Unsupported data type."); + throw new Error(`Unsupported data type: ${dataType}`); } } else { let tsName = diff --git a/cdsp/information-layer/handlers/realmdb/.gitignore b/cdsp/information-layer/handlers/src/realmdb/.gitignore similarity index 52% rename from cdsp/information-layer/handlers/realmdb/.gitignore rename to cdsp/information-layer/handlers/src/realmdb/.gitignore index 7652e67..4bdca67 100644 --- a/cdsp/information-layer/handlers/realmdb/.gitignore +++ b/cdsp/information-layer/handlers/src/realmdb/.gitignore @@ -1,12 +1,6 @@ -# MongoDB Realm -mongodb-realm/ - # Node.js node_modules/ package-lock.json # Credentials Config File -config.js - -# MAC -**/.DS_Store +config/config.js \ No newline at end of file diff --git a/cdsp/information-layer/handlers/realmdb/README.md b/cdsp/information-layer/handlers/src/realmdb/README.md similarity index 85% rename from cdsp/information-layer/handlers/realmdb/README.md rename to cdsp/information-layer/handlers/src/realmdb/README.md index e23a4bb..6e68fb1 100644 --- a/cdsp/information-layer/handlers/realmdb/README.md +++ b/cdsp/information-layer/handlers/src/realmdb/README.md @@ -1,4 +1,6 @@ -This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embedds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. +# RealmDB + +This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embeds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. # Features - **Authentication**: Authenticates with MongoDB Realm using an API key. @@ -37,4 +39,4 @@ module.exports = { ## Starting the RealmDB handler -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../router/README.md#Run). \ No newline at end of file +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../../router/README.md#Run). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/realmdb/config/databaseParams.js b/cdsp/information-layer/handlers/src/realmdb/config/database-params.js similarity index 61% rename from cdsp/information-layer/handlers/realmdb/config/databaseParams.js rename to cdsp/information-layer/handlers/src/realmdb/config/database-params.js index 5f7300b..43b198e 100644 --- a/cdsp/information-layer/handlers/realmdb/config/databaseParams.js +++ b/cdsp/information-layer/handlers/src/realmdb/config/database-params.js @@ -1,11 +1,15 @@ /* * Contains the definition of the database name and its identifier endpoint for each catalog. */ -const databaseParams = Object.freeze({ +const mediaElementsParams = Object.freeze({ VSS: { databaseName: "Vehicles", // name of the configured RealmDB for the VSS database endpointId: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID }, }); -module.exports = databaseParams; +const databaseConfig = Object.freeze({ + storePath: "myrealm12.realm", +}); + +module.exports = { mediaElementsParams, databaseConfig }; diff --git a/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js b/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js new file mode 100644 index 0000000..89ba3c9 --- /dev/null +++ b/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js @@ -0,0 +1,72 @@ +const { mediaElementsParams, databaseConfig } = require("./database-params"); +const dotenv = require("dotenv"); +dotenv.config(); + +function realmConfig(user, supportedEndpoints) { + const mediaElementSchema = createMediaElementSchema(supportedEndpoints); + return { + schema: [mediaElementSchema], + path: databaseConfig.storePath, + sync: { + user: user, + flexible: true, + error: (error) => { + console.error("Realm sync error:", error); + }, + }, + // `schemaVersion` is by default 0, it can be incremented when the schema changes, + // but you need to write the logic to migrate existing data to the new schema. + // See: https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/model-data/modify-an-object-schema/ + schemaVersion: getSchemaVersion(), + migration: (oldRealm, newRealm) => { + // Perform migration logic here + }, + }; +} + +const getSchemaVersion = () => { + const schemaVersion = parseInt(process.env.VERSION, 10); + if (isNaN(schemaVersion)) { + throw new Error( + "Version must be specified as an ENV variable and it must be 0 or a positive integer" + ); + } + return schemaVersion; +}; + +function createMediaElementSchema(supportedEndpoints) { + const properties = { _id: "string" }; + + Object.entries(supportedEndpoints).forEach(([key, value]) => { + switch (value) { + case "boolean": + properties[key] = "bool"; + break; + case "string": + case "float": + case "double": + properties[key] = value; + break; + case "int8": + case "int16": + case "uint8": + case "uint16": + properties[key] = "int"; + break; + default: + throw new Error( + `The initialized endpoints contains an unsupported data type: ${value}` + ); + } + }); + + const mediaElementSchema = { + primaryKey: "_id", + name: mediaElementsParams.VSS.databaseName, + properties: properties, + }; + + return mediaElementSchema; +} + +module.exports = realmConfig; diff --git a/cdsp/information-layer/handlers/realmdb/package.json b/cdsp/information-layer/handlers/src/realmdb/package.json similarity index 87% rename from cdsp/information-layer/handlers/realmdb/package.json rename to cdsp/information-layer/handlers/src/realmdb/package.json index 45c1a6e..71a4504 100644 --- a/cdsp/information-layer/handlers/realmdb/package.json +++ b/cdsp/information-layer/handlers/src/realmdb/package.json @@ -4,7 +4,7 @@ "description": "Realm database handler", "main": "realmdb-handler.js", "dependencies": { - "realm": "^12.9.0", + "realm": "^12.13.1", "uuid": "^9.0.1" } } diff --git a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js similarity index 63% rename from cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js rename to cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js index db7038c..ce6ef53 100644 --- a/cdsp/information-layer/handlers/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js @@ -1,13 +1,17 @@ const Realm = require("realm"); const Handler = require("../../handler"); const config = require("../config/config"); -const database = require("../config/databaseParams"); -const realmConfig = require("../config/realmConfiguration"); +const { mediaElementsParams } = require("../config/database-params"); +const realmConfig = require("../config/realm-configuration"); const { v4: uuidv4 } = require("uuid"); - const app = new Realm.App({ id: config.realmAppId }); const credentials = Realm.Credentials.apiKey(config.realmApiKey); - +const { + logMessage, + logWithColor, + MessageType, + COLORS, +} = require("../../../../utils/logger"); /** * Parses the response from a media element change event. * @@ -26,41 +30,49 @@ class RealmDBHandler extends Handler { constructor() { super(); this.realm = null; - this.sendMessageToClients = null; + this._sendMessageToClients = null; } async authenticateAndConnect(sendMessageToClients) { try { - this.sendMessageToClients = sendMessageToClients; + this._sendMessageToClients = sendMessageToClients; const user = await app.logIn(credentials); - console.log("Successfully authenticated with Realm"); - - const realmConfigObj = realmConfig(user); + console.info("Successfully authenticated to RealmDB"); + const supportedEndpoints = this._getSupportedEndpoints(); + const realmConfigObj = realmConfig(user, supportedEndpoints); this.realm = await Realm.open(realmConfigObj); - console.log("Realm connection established successfully"); + console.info("Connection established successfully"); - Object.entries(database).forEach(async ([key, value]) => { + Object.entries(mediaElementsParams).forEach(async ([key, value]) => { try { const databaseName = value.databaseName; await this.realm.objects(databaseName).subscribe(); - console.log(`Subscribed to the database ${key}: ${databaseName}`); + console.info(`Subscribed to the database ${key}: ${databaseName}`); } catch (error) { - throw new Error("Error subscribing databases."); + logMessage( + "Error subscribing databases: ".concat(error), + MessageType.ERROR + ); } }); } catch (error) { - console.error("Failed to authenticate with Realm:", error); + logMessage( + "Failed to authenticate with Realm: ".concat(error), + MessageType.ERROR + ); } } async read(message, ws) { try { const updateMessage = await this.#getMessageData(message, ws); - console.log(updateMessage); - this.sendMessageToClient(ws, updateMessage); + this._sendMessageToClient(ws, updateMessage); } catch (error) { - console.error("Error reading object from Realm:", error); - this.sendMessageToClient(ws, { error: "Error reading object" }); + logMessage( + "Error reading object from Realm: ".concat(error), + MessageType.ERROR + ); + this._sendMessageToClient(ws, { error: "Error reading object" }); } } @@ -73,21 +85,21 @@ class RealmDBHandler extends Handler { if (mediaElement) { this.realm.write(() => { nodes.forEach(({ name, value }) => { - const prop = this.transformEndpointFromMessageNode(name); + const prop = this._transformEndpointsWithUnderscores(name); endpoints.push(name); mediaElement[prop] = value; }); }); } else { - const endpointId = database[message.tree].endpointId; + const endpointId = mediaElementsParams[message.tree].endpointId; let document = { _id: uuidv4(), [endpointId]: message.id }; nodes.forEach(({ name, value }) => { - const prop = this.transformEndpointFromMessageNode(name); + const prop = this._transformEndpointsWithUnderscores(name); endpoints.push(name); document[prop] = value; }); - const databaseName = database[message.tree].databaseName; + const databaseName = mediaElementsParams[message.tree].databaseName; this.realm.write(() => { this.realm.create(databaseName, document); @@ -95,17 +107,15 @@ class RealmDBHandler extends Handler { } let messageNodes = endpoints.map((key) => ({ name: key })); - const readMessage = this.createOrUpdateMessage( - message, - messageNodes, - "read" - ); - const updateMessage = await this.#getMessageData(readMessage, ws); - console.log(updateMessage); - this.sendMessageToClients(updateMessage); + + const updateMessage = await this.#getMessageData(message, ws); + this._sendMessageToClients(updateMessage); } catch (error) { - console.error("Error writing object changes in Realm:", error); - this.sendMessageToClient(ws, { error: "Error writing object changes" }); + logMessage( + "Error writing object changes in Realm: ".concat(error), + MessageType.ERROR + ); + this._sendMessageToClient(ws, { error: "Error writing object changes" }); } } @@ -115,9 +125,10 @@ class RealmDBHandler extends Handler { if (mediaElement) { const objectId = mediaElement._id; const { id, tree, uuid } = message; - const { databaseName, endpointId } = database[tree]; - console.log( - `Subscribing element: Object ID: ${objectId} with ${endpointId}: '${id}' on ${databaseName}` + const { databaseName, endpointId } = mediaElementsParams[tree]; + logWithColor( + `Subscribing element: Object ID: ${objectId} with ${endpointId}: '${id}' on ${databaseName}`, + COLORS.GREY ); const mediaElementToSubscribe = await this.realm.objectForPrimaryKey( @@ -128,29 +139,30 @@ class RealmDBHandler extends Handler { if (mediaElementToSubscribe) { mediaElementToSubscribe.addListener( (mediaElementToSubscribe, changes) => - this.#onMediaElementChange(mediaElementToSubscribe, changes, { - id: id, - tree: tree, - uuid: uuid, - }) + this.#onMediaElementChange( + mediaElementToSubscribe, + changes, + { + id: id, + tree: tree, + uuid: uuid, + }, + ws + ) ); - console.log(`Subscribed to changes for Object ID: ${objectId}`); - this.sendMessageToClient(ws, { - success: `Subscribed to changes for Object ID: ${objectId}`, + this._sendMessageToClient(ws, { + success: `subscribed to ${endpointId}: '${id}'`, }); } else { - console.log(`Object could not be subscribed`); - this.sendMessageToClient(ws, { + this._sendMessageToClient(ws, { error: "Object could not be subscribed", }); } } else { - console.log(`Object not found`); - this.sendMessageToClient(ws, { error: "Object not found" }); + this._sendMessageToClient(ws, { error: "Object not found" }); } } catch (error) { - console.error("Error subscribing to object changes in Realm:", error); - this.sendMessageToClient(ws, { + this._sendMessageToClient(ws, { error: "Error subscribing to object changes", }); } @@ -166,10 +178,13 @@ class RealmDBHandler extends Handler { */ async #getMessageData(message, ws) { const mediaElement = await this.#getMediaElement(message, ws); - console.log("mediaElement: ", mediaElement); + logWithColor( + `Media Element: \n ${JSON.stringify(mediaElement)}`, + COLORS.GREY + ); if (mediaElement) { const responseNodes = this.#parseReadResponse(message, mediaElement); - return this.createOrUpdateMessage(message, responseNodes, "update"); + return this._createUpdateMessage(message, responseNodes); } else { throw new Error(`No data found with the Id: ${message.id}`); } @@ -185,13 +200,12 @@ class RealmDBHandler extends Handler { async #getMediaElement(message, ws) { try { const { id, tree } = message; - const { databaseName, endpointId } = database[tree]; + const { databaseName, endpointId } = mediaElementsParams[tree]; return await this.realm .objects(databaseName) .filtered(`${endpointId} = '${id}'`)[0]; } catch (error) { - console.error("Error reading object from Realm:", error); - this.sendMessageToClient(ws, { error: "Error reading object" }); + this._sendMessageToClient(ws, { error: "Error reading object" }); } } @@ -201,22 +215,25 @@ class RealmDBHandler extends Handler { * @param {object} changes - An object containing information about the changes. * @param {messageHeader} messageHeader - The header information for the message. */ - #onMediaElementChange(mediaElement, changes, messageHeader) { + #onMediaElementChange(mediaElement, changes, messageHeader, ws) { + logMessage( + "Media element changed", + MessageType.RECEIVED, + `Web-Socket Connection Event Received` + ); if (changes.deleted) { - console.log(`MediaElement is deleted: ${changes.deleted}`); + logMessage(changes.deleted, COLORS.YELLOW, "MediaElement is deleted"); } else { if (changes.changedProperties.length > 0) { const responseNodes = parseOnMediaElementChangeResponse( changes, mediaElement ); - const updateMessage = this.createOrUpdateMessage( + const updateMessage = this._createUpdateMessage( messageHeader, - responseNodes, - "update" + responseNodes ); - console.log(updateMessage); - this.sendMessageToClients(updateMessage); + this._sendMessageToClient(ws, updateMessage); } } } @@ -232,7 +249,7 @@ class RealmDBHandler extends Handler { const data = []; const nodes = message.node ? [message.node] : message.nodes; nodes.forEach((node) => { - const prop = this.transformEndpointFromMessageNode(node.name); + const prop = this._transformEndpointsWithUnderscores(node.name); data.push({ name: node.name, value: queryResponseObj[prop], diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md index 554d403..e93a185 100644 --- a/cdsp/information-layer/router/README.md +++ b/cdsp/information-layer/router/README.md @@ -12,10 +12,10 @@ npm install ``` # Run - -In the `.env` file are defined the environment variables: +The `.env` file contains key-value pairs of environment variables that are used during the build and runtime of the Docker container. This allows for easy configuration of the application without changing the source code. - **HANDLER_TYPE**: Configure `realmdb` to start the RealmDB Handler or `iotdb` to start the IoTDB Handler. +- **VERSION**: This variable is automatically incremented by the build script, ensuring that every Docker image build has a unique version identifier. > [!WARNING] > Create a `.env` file in the same directory as your `docker-compose.yml`. If it doesn't exist, create it in the same directory as `websocket-server.js`. diff --git a/cdsp/information-layer/router/package.json b/cdsp/information-layer/router/package.json index 4bef0ba..d5aafb0 100644 --- a/cdsp/information-layer/router/package.json +++ b/cdsp/information-layer/router/package.json @@ -2,9 +2,9 @@ "name": "websocket-server", "version": "1.0.0", "description": "WebSocket server", - "main": "websocket-server.js", + "main": "src/websocket-server.js", "scripts": { - "start": "node websocket-server.js" + "start": "node src/websocket-server.js" }, "dependencies": { "ajv": "^8.17.1", diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env index bcaf5de..a900aca 100644 --- a/cdsp/information-layer/router/src/.env +++ b/cdsp/information-layer/router/src/.env @@ -1 +1,4 @@ -HANDLER_TYPE=iotdb \ No newline at end of file +# HANDLER_TYPE can be initialized with two different values: `realmdb` or `iotdb` +HANDLER_TYPE=realmdb +# VERSION must be 0 or a positive integer. This is used for versioning the RealmDB configuration schema. +VERSION=0 diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index 6a4b3d4..b4895b1 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -1,12 +1,19 @@ const WebSocket = require("ws"); -const RealmDBHandler = require("../../handlers/realmdb/src/realmdb-handler"); -const IoTDBHandler = require("../../handlers/iotdb/src/iotdb-handler"); +const RealmDBHandler = require("../../handlers/src/realmdb/src/realmdb-handler"); +const IoTDBHandler = require("../../handlers/src/iotdb/src/iotdb-handler"); const { getHandlerType } = require("../config/config"); const { validateMessage } = require("../utils/message-validator"); +const { + logMessage, + logWithColor, + MessageType, + COLORS, +} = require("../../utils/logger"); const handlerType = getHandlerType(); let handler; -console.log(`this is the handler type: ${handlerType}`); + +logWithColor(`\n ** Handler: ${handlerType} ** \n`, COLORS.BOLD); switch (handlerType) { case "realmdb": @@ -25,14 +32,17 @@ const server = new WebSocket.Server({ port: 8080 }); let clients = []; server.on("connection", (ws) => { - console.log("Client connected"); + logWithColor("* Client connected *", COLORS.YELLOW); clients.push(ws); // Add client to the array ws.on("message", (message) => { - console.log(`Message received: ${message}`); + logMessage(JSON.stringify(message), MessageType.RECEIVED); const validatedMessage = validateMessage(message); if (validatedMessage instanceof Error) { - console.error(`Invalid message format: ${validatedMessage.message}`); + logMessage( + `Invalid message format: ${validatedMessage.message}`, + MessageType.ERROR + ); ws.send( JSON.stringify({ error: `Invalid message format`, @@ -44,21 +54,19 @@ server.on("connection", (ws) => { }); ws.on("close", () => { - console.log("Client disconnected"); + console.info("* Client disconnected *"); // Remove disconnected client from the array clients = clients.filter((client) => client !== ws); }); }); const sendMessageToClients = (message) => { + logMessage(JSON.stringify(message), MessageType.SENT); clients.forEach((client) => { client.send(JSON.stringify(message)); }); }; -console.log(`Starting authentication and connection to ${handlerType} ...`); +console.info(`Starting authentication and connection ...`); handler.authenticateAndConnect(sendMessageToClients); - -console.log( - `WebSocket server started on ws://localhost:8080 using ${handlerType} handler` -); +logWithColor(`Web-Socket server started on ws://localhost:8080\n`, COLORS.BOLD); diff --git a/cdsp/information-layer/utils/logger.js b/cdsp/information-layer/utils/logger.js new file mode 100644 index 0000000..8b0f957 --- /dev/null +++ b/cdsp/information-layer/utils/logger.js @@ -0,0 +1,51 @@ +const COLORS = { + RESET: "\x1b[0m", + GREEN: "\x1b[32m", + BLUE: "\x1b[34m", + RED: "\x1b[31m", + PALE_WHITE: "\x1b[37m", + GREY: "\x1b[90m", + YELLOW: "\x1b[33m", + BOLD: "\x1b[1m", +}; + +const MessageType = { + RECEIVED: COLORS.GREEN, + SENT: COLORS.BLUE, + ERROR: COLORS.RED, + OTHER: COLORS, +}; + +function logWithColor(message, color) { + console.log("\n", color, message, COLORS.RESET); +} + +function logMessage(featureStr, type, label = "") { + let color = type; + const datetimeNow = new Date().toLocaleString(); + let labelText; + switch (type) { + case MessageType.RECEIVED: + labelText = "\u2193 ".concat(label || "Client Received"); + break; + case MessageType.SENT: + labelText = "\u2191 ".concat(label || "Client Sent"); + break; + case MessageType.ERROR: + labelText = "\u2716".concat(label || "Internal Error"); + break; + default: + if (Object.values(MessageType.OTHER).includes(type)) { + labelText = label || "Message"; + } else { + color = COLORS.RESET; + labelText = label || "777"; + } + break; + } + const logEntry = `\n${COLORS.PALE_WHITE}${datetimeNow}${COLORS.RESET} ${color}${labelText}${COLORS.RESET}`; + console.log(logEntry); + console.log(featureStr); +} + +module.exports = { logMessage, logWithColor, MessageType, COLORS }; From c8ef06d999097db95a97eb344baee4fef7623b9e Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Fri, 6 Sep 2024 15:54:14 +0200 Subject: [PATCH 25/39] Dockerize informations-layer Signed-off-by: Andre Wendel --- .vscode/settings.json | 4 + cdsp/information-layer/.dockerignore | 6 + cdsp/information-layer/.gitignore | 6 + cdsp/information-layer/.prettierignore | 5 + cdsp/information-layer/Dockerfile | 45 ++++ cdsp/information-layer/README.md | 255 +++++++++++------- cdsp/information-layer/handlers/README.md | 12 +- .../handlers/config/README.md | 26 +- .../handlers/config/config.js | 33 ++- .../vss_data_points.json} | 7 +- .../vss_data_points.yaml} | 2 +- cdsp/information-layer/handlers/package.json | 6 - .../handlers/{ => src}/.gitignore | 0 .../information-layer/handlers/src/handler.js | 61 +++-- .../handlers/src/iotdb/.gitignore | 3 - .../handlers/src/iotdb/README.md | 50 ++-- .../src/iotdb/config/data-points-type.js | 46 ++++ .../src/iotdb/config/database-params.js | 51 ++++ .../src/iotdb/config/databaseParams.js | 11 - .../src/iotdb/config/endpointsType.js | 46 ---- .../handlers/src/iotdb/src/iotdb-handler.js | 113 ++++---- .../{IoTDBConstants.js => iotdb-constants.js} | 0 ...terpreter.js => iotdb-data-interpreter.js} | 8 +- ...BRpcDataSets.js => iotdb-rpc-data-sets.js} | 8 +- ...{SessionDataSet.js => session-data-set.js} | 12 +- .../handlers/src/package.json | 8 + .../handlers/src/realmdb/.gitignore | 5 +- .../handlers/src/realmdb/README.md | 52 ++-- .../src/realmdb/config/database-params.js | 41 ++- .../src/realmdb/config/realm-configuration.js | 20 +- .../src/realmdb/src/realmdb-handler.js | 170 ++++++++---- cdsp/information-layer/package.json | 22 ++ cdsp/information-layer/router/README.md | 27 +- .../information-layer/router/config/config.js | 4 +- cdsp/information-layer/router/package.json | 1 - cdsp/information-layer/router/src/.env | 4 - .../router/src/websocket-server.js | 8 +- .../router/utils/message-validator.js | 11 + docker/.gitignore | 3 +- docker/README.md | 115 ++++++-- docker/docker-compose-cdsp.yml | 89 +++--- docker/start_docker.sh | 0 42 files changed, 900 insertions(+), 496 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 cdsp/information-layer/.dockerignore create mode 100644 cdsp/information-layer/.gitignore create mode 100644 cdsp/information-layer/.prettierignore create mode 100644 cdsp/information-layer/Dockerfile rename cdsp/information-layer/handlers/config/{vss_endpoints.json => schema-files/vss_data_points.json} (98%) rename cdsp/information-layer/handlers/config/{vss_endpoints.yaml => schema-files/vss_data_points.yaml} (98%) delete mode 100644 cdsp/information-layer/handlers/package.json rename cdsp/information-layer/handlers/{ => src}/.gitignore (100%) create mode 100644 cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js create mode 100644 cdsp/information-layer/handlers/src/iotdb/config/database-params.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js rename cdsp/information-layer/handlers/src/iotdb/utils/{IoTDBConstants.js => iotdb-constants.js} (100%) rename cdsp/information-layer/handlers/src/iotdb/utils/{IoTDBDataInterpreter.js => iotdb-data-interpreter.js} (96%) rename cdsp/information-layer/handlers/src/iotdb/utils/{IoTDBRpcDataSets.js => iotdb-rpc-data-sets.js} (98%) rename cdsp/information-layer/handlers/src/iotdb/utils/{SessionDataSet.js => session-data-set.js} (93%) create mode 100644 cdsp/information-layer/handlers/src/package.json create mode 100644 cdsp/information-layer/package.json delete mode 100644 cdsp/information-layer/router/src/.env create mode 100644 docker/start_docker.sh diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..96da0b8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "pieces.cloudCapabilities": "Blended", + "pieces.telemetry": true +} diff --git a/cdsp/information-layer/.dockerignore b/cdsp/information-layer/.dockerignore new file mode 100644 index 0000000..1c412eb --- /dev/null +++ b/cdsp/information-layer/.dockerignore @@ -0,0 +1,6 @@ +# ignore mongodb generated files +mongodb-realm + +# ignore all node generated file +node_modules +package-lock.json \ No newline at end of file diff --git a/cdsp/information-layer/.gitignore b/cdsp/information-layer/.gitignore new file mode 100644 index 0000000..79ef773 --- /dev/null +++ b/cdsp/information-layer/.gitignore @@ -0,0 +1,6 @@ +# MongoDB Realm +mongodb-realm/ + +# Node.js +node_modules/ +package-lock.json diff --git a/cdsp/information-layer/.prettierignore b/cdsp/information-layer/.prettierignore new file mode 100644 index 0000000..3e52534 --- /dev/null +++ b/cdsp/information-layer/.prettierignore @@ -0,0 +1,5 @@ +#ignore node modules +node_modules + +#ignore autogenerated files by thrift +handlers/src/iotdb/gen-nodejs \ No newline at end of file diff --git a/cdsp/information-layer/Dockerfile b/cdsp/information-layer/Dockerfile new file mode 100644 index 0000000..e0336a0 --- /dev/null +++ b/cdsp/information-layer/Dockerfile @@ -0,0 +1,45 @@ +# Base image for Node.js +FROM node:22.5.1 + +######################### +# GENERAL CONFIGURATION # +######################### + +# HANDLER_TYPE can be initialized with two different values: `realmdb` or `iotdb` +ENV HANDLER_TYPE=${HANDLER_TYPE} + +######################### +# REALMDB CONFIGURATION # +######################### + +# VERSION must be 0 or a positive integer. This is used for versioning the RealmDB configuration schema. +ENV VERSION_REALMDB_SCHEMA=${VERSION_REALMDB_SCHEMA} + +# Access to ATLAS Cloud instance +ENV REALMDB_APP_ID=${REALMDB_APP_ID} +ENV REALMDB_API_KEY=${REALMDB_API_KEY} + +####################### +# IOTDB CONFIGURATION # +####################### + +# Access to iotdb-service +ENV IOTDB_HOST: ${IOTDB_HOST} +ENV IOTDB_PORT: ${IOTDB_PORT} +ENV IOTDB_USER: ${IOTDB_USER} +ENV IOTDB_PASSWORD: ${IOTDB_PASSWORD} +ENV IOTDB_FETCH_SIZE: ${IOTDB_FETCH_SIZE} + +# Set working directory inside the container +WORKDIR /app + +COPY . ./ + +# Install dependencies, including workspaces +RUN npm install --production + +# Expose the necessary port +EXPOSE 8080 + +# Command to run the WebSocket server +CMD ["node", "router/src/websocket-server.js"] \ No newline at end of file diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 304f35d..ab73937 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -1,33 +1,33 @@ +# Information Layer Playground components + This directory contains files related to the [Information Layer](https://en.wikipedia.org/wiki/DIKW_pyramid) of the Central Data Service Playground. -# Information Layer Playground components - - [Database-Handlers](./handlers) - - [Database-Router](./router) +- [Database-Handlers](./handlers/README.md) +- [Database-Router](./router/README.md) # Setting up a CDSP Information Layer -Setting up an information layer in the CDSP involves running a [Database-Router](./router), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). + +Setting up an information layer in the CDSP involves running a [Database-Router](./router/README.md), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). ## Installation of Database-Handler -Please follow installation instructions of the chosen [handler](./handlers/). - -## Installation of Database-Router -See [hier](./router/README.md#Install) how to install the Database-Router. +Please follow installation instructions of the chosen [handler](./handlers/README.md). -# Running "Hello World" example +# Running "Hello World" example (WIP) The Hello World example in our case is quite simple. We feed an updated value for the `CurrentLocation_Longitude` into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. ## Choose and prepare your Database > [!WARNING] -> Before start the application, ensure that the supported endpoints are correctly defined and configured. See [how](./handlers/config/README.md). +> Before start the application, ensure that the supported data points are correctly defined and configured. See [how](./handlers/config/README.md). ### Realm -- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle *document* with an `Vehicle_VehicleIdentification_VIN` in a collection named *`Vehicles`*. -- Ensure that this document as well contains VSS data. Here you can see the supported data in a vehicle document within the *Vehicles* should look like in ATLAS: - ``` +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle _document_ with an `Vehicle_VehicleIdentification_VIN` in a collection named _`Vehicles`_. +- Ensure that this document as well contains VSS data. Here you can see the data supported in this repository for a vehicle document within _Vehicles_ that should be reflected in ATLAS: + + ```text _id: "" (String) Vehicle_Chassis_SteeringWheel_Angle: (Int32) Vehicle_CurrentLocation_Latitude: (Double) @@ -40,10 +40,11 @@ The Hello World example in our case is quite simple. We feed an updated value fo ``` ### IoTDB -- Ensure to start and run Docker containers defined in a [Docker Compose file](/docker/). -- Ensure that in the IoTDB CLI there is a `root.Vehicles` *database* like this: - ``` +- Ensure to start and run Docker containers defined in a [Docker Compose file](/docker/README.md). +- Ensure that in the IoTDB CLI there is a `root.Vehicles` _database_ like this: + + ```text IoTDB> show databases; +-------------+----+-----------------------+---------------------+---------------------+ | Database| TTL|SchemaReplicationFactor|DataReplicationFactor|TimePartitionInterval| @@ -54,9 +55,9 @@ The Hello World example in our case is quite simple. We feed an updated value fo It costs 0.004s ``` -- Create two *timeseries* with the `root.Vehicles.Vehicle_VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the *Vehicles* should look like in IoTDB CLI: +- Create two _timeseries_ with the `root.Vehicles.Vehicle_VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the _Vehicles_ should look like in IoTDB CLI: - ``` + ```text IoTDB> show timeseries; +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| @@ -70,26 +71,83 @@ The Hello World example in our case is quite simple. We feed an updated value fo |root.Vehicles.Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| | root.Vehicles.Vehicle_Powertrain_TractionBattery_NominalVoltage| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - + ``` + ## Start the Database Router -See [here](./router/README.md#Run) how to start the database router. +### Using Docker Compose + +See [here](/docker/README.md) how to start the services using Docker. + +### Using Docker directly from Dockerfile in information-layer + +Go to `covesa.cdsp/cdsp/information-layer` and run in CLI: + +```shell +$ docker build -t webserver-service . +``` + +To run `RealmDB` use: + +> [!IMPORTANT] See [here](./handlers/src/realmdb/README.md) all the required ENV variables. + +```shell +$ docker run --name websocket-service -e HANDLER_TYPE=realmdb [-e required_env_variables] -p 8080:8080 websocket-service +``` + +To run `IoTDB` use: + +> [!IMPORTANT] See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. + +```shell +$ docker run --name websocket-service -e HANDLER_TYPE=iotdb --network cdsp_default [-e required_env_variables] -p 8080:8080 websocket-service +``` + +### Using Node.js + +#### Install + +Execute in this directory: + +```shell +npm install +``` + +To start the websocket-server using `RealmDB` execute the command: + +To run `RealmDB` use: + +> [!IMPORTANT] See [here](./handlers/src/realmdb/README.md) all the required ENV variables. + +```shell +$ HANDLER_TYPE=realm [ENV_VARIABLE_NAME required_env_variables] npm start +``` + +To start the websocket-server using `IoTDB` execute the command: + +> [!IMPORTANT] See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. + +```shell +$ HANDLER_TYPE=iotdb IOTDB_HOST=localhost [ENV_VARIABLE_NAME required_env_variables] npm start +``` ## Look out for the Websocket Server message in the console + If the handler is running and you are [subscribed](#subscribing-to-changes) to an element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: -``` +```json { - type: 'update', - tree: 'VSS', - id: '', - dateTime: '', - uuid: '', - node: { name: 'CurrentLocation_Longitude', value: `-157845.68200000003` } + "type": "update", + "tree": "VSS", + "id": "", + "dateTime": "", + "uuid": "", + "node": { "name": "CurrentLocation_Longitude", "value": "-157845.68200000003" } } ``` # Connect your own Websocket Client + Connect your own websocket client by connecting to `ws://localhost:8080` The examples use the VIN (Vehicle Identification Number) as object identifier. @@ -98,82 +156,95 @@ The examples use the VIN (Vehicle Identification Number) as object identifier. To read data, send a message with the type of request and VIN as object ID: - * Example for one Node: - ```json - { - "type": "read", - "tree": "VSS", - "id": "", - "uuid": "", - "node": { +- Example for one Node: + ```json + { + "type": "read", + "tree": "VSS", + "id": "", + "uuid": "", + "node": { + "name": "" + } + } + ``` +- Example for multiple Nodes: + ```json + { + "type": "read", + "tree": "VSS", + "id": "", + "uuid": "", + "nodes": [ + { "name": "" + }, + { + "name": "" } - } - ``` - * Example for multiple Nodes: - ```json - { - "type": "read", - "tree": "VSS", - "id": "", - "uuid": "", - "nodes": [ - { - "name": "" - }, - { - "name": "" - } - ] - } - ``` + ] + } + ``` ### Writing data To write data, send a message with the type of request and VIN as object ID (at this moment only with IoTDB available): - * Example for one Node: - ```json - { - "type": "write", - "tree": "VSS", - "id": "", - "uuid": "", - "node": { - "name": "", - "value": "" - } - } - ``` - * Example for multiple Nodes: - ```json - { - "type": "write", - "tree": "VSS", - "id": "", - "uuid": "", - "nodes": [ - { - "name": "", - "value": "" - }, - { - "name": "", - "value": "" - } - ] +- Example for one Node: + ```json + { + "type": "write", + "tree": "VSS", + "id": "", + "uuid": "", + "node": { + "name": "", + "value": "" } - ``` -### Subscribing to changes - -To subscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): - + } + ``` +- Example for multiple Nodes: ```json { - "type": "subscribe", + "type": "write", "tree": "VSS", "id": "", - "uuid": "SOME_UUID" + "uuid": "", + "nodes": [ + { + "name": "", + "value": "" + }, + { + "name": "", + "value": "" + } + ] } ``` - + +### Subscribing to changes + +To subscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): + +```json +{ + "type": "subscribe", + "tree": "VSS", + "id": "", + "uuid": "SOME_UUID" +} +``` + +### Subscribing to changes + +To unsubscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): + +```json +{ + "type": "unsubscribe", + "tree": "VSS", + "id": "", + "uuid": "SOME_UUID" +} +``` diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md index adccb2f..b81bd95 100644 --- a/cdsp/information-layer/handlers/README.md +++ b/cdsp/information-layer/handlers/README.md @@ -1,11 +1,11 @@ # Handlers -We support two different databases. +We support two different databases. For each of them is required to configurate the corresponding ENV variables in `/docker/.env` file. -- [IotDB](./src/iotdb) -- [RealmDB](./src/realmdb) +- [IotDB](./src/iotdb/README.md) +- [RealmDB](./src/realmdb/README.md) > [!WARNING] -> Before start working with any of them, ensure that the supported endpoints are correctly defined and configured. See [how](./handlers/config/README.md). -> -See [hier](../../information-layer/router/README.md) how to install the Database-Router. \ No newline at end of file +> Before start working with any of them, ensure that the supported data points are correctly defined and configured. See [how](./handlers/config/README.md). + +See [hier](../../information-layer/README.md) how to install and start the Websocket-Server. diff --git a/cdsp/information-layer/handlers/config/README.md b/cdsp/information-layer/handlers/config/README.md index 4f7c265..8cbbd5c 100644 --- a/cdsp/information-layer/handlers/config/README.md +++ b/cdsp/information-layer/handlers/config/README.md @@ -1,28 +1,18 @@ -# Configuration Handler for Endpoints +# Configuration Handler for supported Data Points -This module is responsible for handling the configuration of supported endpoints in the application. It supports JSON, YAML, or YML formats for defining the endpoints. +This module is responsible for handling the configuration of supported data points in the application. It supports JSON, YAML, or YML formats for defining the data points. -The files in this directory `vss_endpoints.yaml` and `vss_endpoints.json` contain the same endpoint definition (only one of them is necessary to build) and based on that, the system will configure the data schema used during the Database configuration. +The `vss_data_points.yaml` and `vss_data_points.json` files in the `./schema-files` directory contain the same data point definition (only one of them is necessary to build) and based on that, the system will configure the data schema used during the Database configuration. > [!WARNING] -> - Before starting the application, ensure that the desired YAML, YML or JSON file is correctly placed in the root directory of the module. This file should contain the definitions of the supported endpoints. The name and extension to use can be configured in the `config.js` file. -> - Ensure that the used file is correctly formatted and contains valid endpoint definitions. -> - **The application will not function correctly if the endpoints file is missing or incorrectly placed.** +> +> - Before starting the application, ensure that the desired YAML, YML or JSON file is correctly placed in the `./schema-files` directory. This file should contain the definitions of the supported data points. The name and extension to use can be configured in the `/docker/.env` file, it uses the ENV variable named `DATA_POINTS_SCHEMA_FILE`. If it is not specified, it uses `vss_data_points.yaml` by default, which is one of the files contained in this repository. . +> - Ensure that the used file is correctly formatted and contains valid data points definitions. +> - **The application will not function correctly if the data points file is missing or incorrectly placed.** ## File: `config.js` ### Description -The `config.js` file contains the logic to retrieve the full path to the endpoints configuration file (`vss_endpoints.yaml` in this case). This file is crucial for the application to understand which endpoints are supported and how they should be handled. +The `config.js` file contains the logic to retrieve the data defined in the ENV variables and the full path to the data points schema configuration file (`./schema-files/vss_data_points.yaml` in this case). This file is crucial for the application to understand which data points are supported and how they should be handled. -### Functions - -#### `getEndpointsPath` - -This function resolves the root directory path of the current module and joins it with the `ENDPOINTS_FILE` constant to form the full path to the endpoints file. - -```javascript -const getEndpointsPath = () => { - const rootPath = path.resolve(__dirname); - return path.join(rootPath, ENDPOINTS_FILE); -}; diff --git a/cdsp/information-layer/handlers/config/config.js b/cdsp/information-layer/handlers/config/config.js index f668fa8..4313b06 100644 --- a/cdsp/information-layer/handlers/config/config.js +++ b/cdsp/information-layer/handlers/config/config.js @@ -1,22 +1,37 @@ const path = require("path"); - +const dotenv = require("dotenv"); +dotenv.config(); /** - * This file contains the description of the supported endpoints. + * This file contains the description of the supported data points. * It supports JSON, YAML or YML format. */ -const ENDPOINTS_FILE = "vss_endpoints.yaml"; +const ENDPOINTS_FILE = "vss_data_points.yaml"; + +/** + * Retrieves the value of an environment variable. + * + * @param {string} envVar - The environment variable to retrieve. + * @returns {string|null} - The value of the environment variable. + */ +const getEnvValue = (envVar) => { + if (!process.env[envVar]) { + console.info(`${envVar} environment variable is not set in .env file.`); + return null; + } + return process.env[envVar]; +}; /** - * Retrieves the full path to the endpoints file. + * Retrieves the full path to the data points file. * - * This function resolves the root directory path of the current module + * This function resolves the schema-files directory path of the current module * and joins it with the ENDPOINTS_FILE constant to form the full path. * - * @returns {string} The full path to the endpoints file. + * @returns {string} The full path to the data points file. */ -const getEndpointsPath = () => { - const rootPath = path.resolve(__dirname); +const getDataPointsPath = () => { + const rootPath = path.resolve(`${__dirname}/schema-files`); return path.join(rootPath, ENDPOINTS_FILE); }; -module.exports = { getEndpointsPath }; +module.exports = { getDataPointsPath, getEnvValue }; diff --git a/cdsp/information-layer/handlers/config/vss_endpoints.json b/cdsp/information-layer/handlers/config/schema-files/vss_data_points.json similarity index 98% rename from cdsp/information-layer/handlers/config/vss_endpoints.json rename to cdsp/information-layer/handlers/config/schema-files/vss_data_points.json index 845e2aa..5792bca 100644 --- a/cdsp/information-layer/handlers/config/vss_endpoints.json +++ b/cdsp/information-layer/handlers/config/schema-files/vss_data_points.json @@ -1,6 +1,6 @@ { "Vehicle": { - "children": { + "children": { "Chassis": { "children": { "SteeringWheel": { @@ -28,7 +28,8 @@ "min": -90, "type": "sensor", "unit": "degrees" - }, "Longitude": { + }, + "Longitude": { "datatype": "double", "description": "Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", "max": 180, @@ -104,4 +105,4 @@ "description": "High-level vehicle data.", "type": "branch" } -} \ No newline at end of file +} diff --git a/cdsp/information-layer/handlers/config/vss_endpoints.yaml b/cdsp/information-layer/handlers/config/schema-files/vss_data_points.yaml similarity index 98% rename from cdsp/information-layer/handlers/config/vss_endpoints.yaml rename to cdsp/information-layer/handlers/config/schema-files/vss_data_points.yaml index c628d66..625c731 100644 --- a/cdsp/information-layer/handlers/config/vss_endpoints.yaml +++ b/cdsp/information-layer/handlers/config/schema-files/vss_data_points.yaml @@ -40,7 +40,7 @@ Vehicle.Powertrain: description: Powertrain data for battery management, etc. type: branch -Vehicle.Powertrain.TractionBattery: +Vehicle.Powertrain.TractionBattery: description: Battery Management data. type: branch diff --git a/cdsp/information-layer/handlers/package.json b/cdsp/information-layer/handlers/package.json deleted file mode 100644 index 63909dd..0000000 --- a/cdsp/information-layer/handlers/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "dependencies": { - "dotenv": "^16.4.5", - "js-yaml": "^4.1.0" - } -} diff --git a/cdsp/information-layer/handlers/.gitignore b/cdsp/information-layer/handlers/src/.gitignore similarity index 100% rename from cdsp/information-layer/handlers/.gitignore rename to cdsp/information-layer/handlers/src/.gitignore diff --git a/cdsp/information-layer/handlers/src/handler.js b/cdsp/information-layer/handlers/src/handler.js index 0490ac4..155af45 100644 --- a/cdsp/information-layer/handlers/src/handler.js +++ b/cdsp/information-layer/handlers/src/handler.js @@ -3,35 +3,35 @@ const fs = require("fs"); const yaml = require("js-yaml"); const { logMessage, MessageType } = require("../../utils/logger"); /** - * Reads and parses an endpoints file in either JSON, YML or YAML format. + * Reads and parses a data points file in either JSON, YML or YAML format. * - * @param {string} filePath - The path to the endpoints file. - * @returns {Object} The parsed content of the endpoints file. + * @param {string} filePath - The path to the data points file. + * @returns {Object} The parsed content of the data points file. * @throws {Error} If the file format is unsupported. */ -function readEndpointsFile(filePath) { +function readDataPointsFile(filePath) { const fileContent = fs.readFileSync(filePath, "utf8"); if (filePath.endsWith(".json")) { return JSON.parse(fileContent); } else if (filePath.endsWith(".yaml") || filePath.endsWith(".yml")) { return yaml.load(fileContent); } else { - throw new Error("Unsupported endpoints file format"); + throw new Error("Unsupported data points file format"); } } /** - * Recursively extracts data types from an endpoints object. + * Recursively extracts data types from a data point object. * - * @param {Object} endpointsObj - The object containing endpoint definitions. + * @param {Object} dataPointsObj - The object containing data point definitions. * @param {string} [parentKey=""] - The parent key used to build the nested key path. * @param {Object} [result={}] - The object to store the extracted data types. - * @returns {Object} An object mapping endpoint keys to their data types. + * @returns {Object} An object mapping data point keys to their data types. */ -function extractDataTypes(endpointsObj, parentKey = "", result = {}) { - for (const key in endpointsObj) { - if (endpointsObj.hasOwnProperty(key)) { - const value = endpointsObj[key]; +function extractDataTypes(dataPointsObj, parentKey = "", result = {}) { + for (const key in dataPointsObj) { + if (dataPointsObj.hasOwnProperty(key)) { + const value = dataPointsObj[key]; const newKey = parentKey ? `${parentKey}.${key}` : key; if (value && typeof value === "object") { if (value.datatype) { @@ -58,6 +58,9 @@ class Handler { case "subscribe": this.subscribe(message, ws); break; + case "unsubscribe": + this.unsubscribe(message, ws); + break; default: ws.send(JSON.stringify({ error: "Unknown message type" })); } @@ -82,6 +85,14 @@ class Handler { throw new Error("Subscribe method not implemented yet!"); } + unsubscribe(message, ws) { + throw new Error("Unsubscribe method not implemented yet!"); + } + + unsubscribe_client(uuid) { + throw new Error("Unsubscribe client method not implemented yet!"); + } + /** * Utility functions for handling messages and data structures common to IoTDB and RealmDB. */ @@ -125,7 +136,7 @@ class Handler { * @param {string} node - The message node to transform. * @returns {string} - The transformed message node with dots replaced by underscores. */ - _transformEndpointsWithUnderscores(node) { + _transformDatapointsWithUnderscores(node) { return `${node}`.replace(/\./g, "_"); } @@ -135,26 +146,26 @@ class Handler { * @param {string} field - The database filed to transform. * @returns {string} - The transformed to message node replacing underscores by dots. */ - _transformEndpointsWithDots(field) { + _transformDataPointsWithDots(field) { return `${field}`.replace(/\_/g, "."); } /** - * Retrieves and processes supported endpoints. + * Retrieves and processes supported data points. * - * This method reads the endpoints configuration file, extracts the data types, - * and transforms the endpoint names to use underscores. It returns an object - * with the transformed endpoint names as keys and their corresponding data types. + * This method reads the data points configuration file, extracts the data types, + * and transforms the data point names to use underscores. It returns an object + * with the transformed data point names as keys and their corresponding data types. * - * @returns {Object} An object containing the supported endpoints with transformed names and data types. + * @returns {Object} An object containing the supported data points with transformed names and data types. */ - _getSupportedEndpoints() { - const endpointPath = config.getEndpointsPath(); - const endpointObj = readEndpointsFile(endpointPath); - const supportedEndpoints = extractDataTypes(endpointObj); + _getSupportedDataPoints() { + const datapointPath = config.getDataPointsPath(); + const dataPointObj = readDataPointsFile(datapointPath); + const supportedDataPoints = extractDataTypes(dataPointObj); let result = {}; - Object.entries(supportedEndpoints).forEach(([node, value]) => { - const underscored_node = this._transformEndpointsWithUnderscores(node); + Object.entries(supportedDataPoints).forEach(([node, value]) => { + const underscored_node = this._transformDatapointsWithUnderscores(node); if (value !== null) { result[underscored_node] = value; } diff --git a/cdsp/information-layer/handlers/src/iotdb/.gitignore b/cdsp/information-layer/handlers/src/iotdb/.gitignore index 3cdddbd..473d609 100644 --- a/cdsp/information-layer/handlers/src/iotdb/.gitignore +++ b/cdsp/information-layer/handlers/src/iotdb/.gitignore @@ -2,8 +2,5 @@ node_modules/ package-lock.json -# Credentials Config File -config/config.js - # MAC **/.DS_Store diff --git a/cdsp/information-layer/handlers/src/iotdb/README.md b/cdsp/information-layer/handlers/src/iotdb/README.md index 03028ab..097c1b8 100644 --- a/cdsp/information-layer/handlers/src/iotdb/README.md +++ b/cdsp/information-layer/handlers/src/iotdb/README.md @@ -4,38 +4,44 @@ This directory contains the IoTDB Handler as a Node.js application. As [Apache I # Features -- **Authentication**: Authenticates with IoTDB using the IoTDB host, port, user credentials, and time zone. +- **Authentication**: Authenticates with IoTDB using the IoTDB host, port, user credentials, number of rows to be fetched, and time zone. +- **Read Data**: Retrieves data from the IoTDB using a VIN as object ID. +- **Write Data**: Write data to the IoTDB using a VIN as object ID. - **Error Handling**: Logs and handles errors during database operations and synchronization. -# Installation - -Execute within `iotdb` directory - -```bash -npm install -``` - # Configure IoTDB Before the Database-Router can start the IoTDB Handler without any errors you need to start and run Docker containers defined in a [Docker Compose file](/docker/). ## Configure of a IoTDB Handler -Create `config/config.js` with the following format, replacing the app id and the api key with yours. - -```js -module.exports = { - iotdbHost: "your-iotdb-host", // Default "localhost" - iotdbPort: 6667, // Set this to the appropriate IotDB Port - iotdbUser: "your-iotdb-user", // Default "root" - iotdbPassword: "your-iotdb-password", // Default "root" - timeZoneId: Intl.DateTimeFormat().resolvedOptions().timeZone, // Set this to the appropriate time zone - fetchSize: 10000, // number of rows that will be fetched from the database at a time when executing a query -}; +Create (if it does not exist) `/docker/.env` and add the following environment variables, replacing the values with yours. + +```shell + ######################### + # GENERAL CONFIGURATION # + ######################### + + # HANDLER_TYPE define the database to initialize + HANDLER_TYPE=iotdb + # DATA_POINTS_SCHEMA_FILE is the YAML or JSON file containing all data points supported. See the ../../config/README.md for more information. + DATA_POINTS_SCHEMA_FILE=vss_data_points.yaml + + ####################### + # IOTDB CONFIGURATION # + ####################### + + # Access to iotdb-service. All this are optional, they have an predefine default value + IOTDB_HOST="your-iotdb-host" # Docker container name for IoTDB or host, default container name "iotdb-service" + IOTDB_PORT=6667 # Set this to the appropriate IotDB Port, default "6667" + IOTDB_USER="your-iotdb-user" # Default "root" + IOTDB_PASSWORD="your-iotdb-password" # Default "root" + IOTDB_TIMEZONE="your-time-zone" # Default your local configured time zone + FETCH_SIZE=10000 #number of rows that will be fetched from the database at a time when executing a query, default 10000 ``` -> **_IMPORTANT:_** Do not commit this file to github! +> **_IMPORTANT:_** Do not commit this file to GitHub! ## Starting the IoTDB handler -You do not need to start IotDB Handler manually. It is started by the DB-Router like described [here](../../../router/README.md#Run). \ No newline at end of file +You do not need to start IotDB Handler manually. It is started by the Websocket-Server like described [here](../../../README.md). diff --git a/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js b/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js new file mode 100644 index 0000000..d4de5b3 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js @@ -0,0 +1,46 @@ +const { SupportedMessageDataTypes } = require("../utils/iotdb-constants"); + +class DataPointsSchema { + constructor(supportedDataPoints) { + const properties = {}; + + Object.entries(supportedDataPoints).forEach(([key, value]) => { + if (SupportedMessageDataTypes.hasOwnProperty(value)) { + properties[key] = value; + } else { + throw new Error( + `The initialized data points contains an unsupported data type: ${value}`, + ); + } + }); + + this.dataPointsSchema = properties; + Object.freeze(this.dataPointsSchema); + } + + getDataPointsSchema() { + return this.dataPointsSchema; + } +} + +// Singleton instance holder +let dataPointsSchemaInstance = null; + +/** + * Creates and returns a singleton instance of DataPointsSchema. + * If the instance does not already exist, it initializes it with the provided supported data points + * and freezes the instance to prevent further modifications. + * + * @param {Object} supportedEndpoints - An object of supported data points to initialize the schema. + * @returns {Object} The data points schema instance. + */ +function createDataPointsSchema(supportedEndpoints) { + if (!dataPointsSchemaInstance) { + dataPointsSchemaInstance = new DataPointsSchema(supportedEndpoints); + Object.freeze(dataPointsSchemaInstance); + } + + return dataPointsSchemaInstance.getDataPointsSchema(); +} + +module.exports = { createDataPointsSchema }; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/database-params.js b/cdsp/information-layer/handlers/src/iotdb/config/database-params.js new file mode 100644 index 0000000..3edff12 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/config/database-params.js @@ -0,0 +1,51 @@ +const { getEnvValue } = require("../../../config/config"); + +/* + * Contains the definition of the database name and its identifier data point for each catalog. + */ +const databaseParams = Object.freeze({ + VSS: { + databaseName: "root.Vehicles", // name of the configured IoTDB for the VSS database + dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID + }, +}); + +const useDefaultValue = (defaultValue) => { + console.info(`Using default: ${defaultValue}`); + return defaultValue; +}; + +/** + * Retrieves the database configuration for IoTDB. + * + * This function gathers configuration values for connecting to an IoTDB instance. + * It first attempts to get the values from environment variables. If the environment + * variables are not set, it uses default values. + * + * @returns {Object} An object containing the IoTDB configuration. + */ +const getDatabaseConfig = () => { + const iotdb_config = {}; + + let default_timeZoneId = Intl.DateTimeFormat().resolvedOptions().timeZone; + + iotdb_config["iotdbHost"] = + getEnvValue("IOTDB_HOST") || useDefaultValue("iotdb-service"); + iotdb_config["iotdbPort"] = + getEnvValue("IOTDB_PORT") || useDefaultValue(6667); + iotdb_config["iotdbUser"] = + getEnvValue("IOTDB_USER") || useDefaultValue("root"); + iotdb_config["iotdbPassword"] = + getEnvValue("IOTDB_PASSWORD") || useDefaultValue("root"); + iotdb_config["fetchSize"] = + getEnvValue("IOTDB_FETCH_SIZE") || useDefaultValue(10000); + iotdb_config["timeZoneId"] = + getEnvValue("IOTDB_TIME_ZONE_ID") || useDefaultValue(default_timeZoneId); + + return Object.freeze(iotdb_config); +}; + +const databaseConfig = + getEnvValue("HANDLER_TYPE") === "iotdb" ? getDatabaseConfig() : {}; + +module.exports = { databaseParams, databaseConfig }; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js b/cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js deleted file mode 100644 index d9ba29b..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/config/databaseParams.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Contains the definition of the database name and its identifier endpoint for each catalog. - */ -const databaseParams = Object.freeze({ - VSS: { - databaseName: "root.Vehicles", // name of the configured IoTDB for the VSS database - endpointId: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID - }, -}); - -module.exports = databaseParams; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js b/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js deleted file mode 100644 index 8d30e2d..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/config/endpointsType.js +++ /dev/null @@ -1,46 +0,0 @@ -const { SupportedMessageDataTypes } = require("../utils/IoTDBConstants"); - -class EndpointsSchema { - constructor(supportedEndpoints) { - const properties = {}; - - Object.entries(supportedEndpoints).forEach(([key, value]) => { - if (SupportedMessageDataTypes.hasOwnProperty(value)) { - properties[key] = value; - } else { - throw new Error( - `The initialized endpoints contains an unsupported data type: ${value}` - ); - } - }); - - this.endpointsSchema = properties; - Object.freeze(this.endpointsSchema); - } - - getEndpointsSchema() { - return this.endpointsSchema; - } -} - -// Singleton instance holder -let endpointsSchemaInstance = null; - -/** - * Creates and returns a singleton instance of EndpointsSchema. - * If the instance does not already exist, it initializes it with the provided supported endpoints - * and freezes the instance to prevent further modifications. - * - * @param {Object} supportedEndpoints - An object of supported endpoints to initialize the schema. - * @returns {Object} The endpoints schema instance. - */ -function createEndpointsSchema(supportedEndpoints) { - if (!endpointsSchemaInstance) { - endpointsSchemaInstance = new EndpointsSchema(supportedEndpoints); - Object.freeze(endpointsSchemaInstance); - } - - return endpointsSchemaInstance.getEndpointsSchema(); -} - -module.exports = { createEndpointsSchema }; diff --git a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js index 2152024..4f5a8d2 100644 --- a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js @@ -8,11 +8,10 @@ const { } = require("../gen-nodejs/client_types"); const thrift = require("thrift"); const Handler = require("../../handler"); -const config = require("../config/config"); -const SessionDataSet = require("../utils/SessionDataSet"); -const { IoTDBDataInterpreter } = require("../utils/IoTDBDataInterpreter"); -const { createEndpointsSchema } = require("../config/endpointsType"); -const database = require("../config/databaseParams"); +const SessionDataSet = require("../utils/session-data-set"); +const { IoTDBDataInterpreter } = require("../utils/iotdb-data-interpreter"); +const { createDataPointsSchema } = require("../config/data-points-type"); +const { databaseParams, databaseConfig } = require("../config/database-params"); const { logMessage, logWithColor, @@ -28,10 +27,10 @@ class IoTDBHandler extends Handler { this.sessionId = null; this.protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3; this.statementId = null; - this.zoneId = config.timeZoneId; - this.fetchSize = config.fetchSize; + this.zoneId = databaseConfig.timeZoneId; + this.fetchSize = databaseConfig.fetchSize; this.isSessionClosed = true; - this.endpointsSchema = null; + this.dataPointsSchema = null; } async authenticateAndConnect(sendMessageToClients) { @@ -39,12 +38,12 @@ class IoTDBHandler extends Handler { this._sendMessageToClients = sendMessageToClients; const connection = thrift.createConnection( - config.iotdbHost, - config.iotdbPort, + databaseConfig.iotdbHost, + databaseConfig.iotdbPort, { transport: thrift.TFramedTransport, protocol: thrift.TBinaryProtocol, - } + }, ); this.client = thrift.createClient(Client, connection); @@ -52,18 +51,18 @@ class IoTDBHandler extends Handler { connection.on("error", (error) => { logMessage( "thrift connection error: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); }); - const supportedEndpoint = this._getSupportedEndpoints(); - this.endpointsSchema = createEndpointsSchema(supportedEndpoint); + const supportedDataPoint = this._getSupportedDataPoints(); + this.dataPointsSchema = createDataPointsSchema(supportedDataPoint); console.info("Successfully connected to IoTDB using thrift"); } catch (error) { logMessage( "Failed to authenticate with IoTDB: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); } } @@ -75,7 +74,7 @@ class IoTDBHandler extends Handler { if (responseNodes.length > 0) { const responseMessage = this._createUpdateMessage( message, - responseNodes + responseNodes, ); this._sendMessageToClient(ws, responseMessage); } else { @@ -84,7 +83,7 @@ class IoTDBHandler extends Handler { } catch (error) { this._sendMessageToClient(ws, { error: "Error reading object" }); } finally { - this.#closeSessionIfNeeded(); + await this.#closeSessionIfNeeded(); } } @@ -98,35 +97,35 @@ class IoTDBHandler extends Handler { let values = []; for (const [key, value] of Object.entries(data)) { - if (this.endpointsSchema.hasOwnProperty(key)) { + if (this.dataPointsSchema.hasOwnProperty(key)) { measurements.push(key); - dataTypes.push(this.endpointsSchema[key]); + dataTypes.push(this.dataPointsSchema[key]); values.push(value); } else { - errorUndefinedTypes.push(`The endpoint "${key}" is not supported`); + errorUndefinedTypes.push(`The data point "${key}" is not supported`); } } if (errorUndefinedTypes.length) { errorUndefinedTypes.forEach((error) => console.error(error)); - throw new Error("One or more endpoints are not supported."); + throw new Error("One or more data points are not supported."); } const timestamp = new Date().getTime(); - const deviceId = database[message.tree].databaseName; + const deviceId = databaseParams[message.tree].databaseName; const status = await this.#insertRecord( deviceId, timestamp, measurements, dataTypes, - values + values, ); logWithColor( `Record inserted to device ${deviceId}, status code: `.concat( - JSON.stringify(status) + JSON.stringify(status), ), - COLORS.GREY + COLORS.GREY, ); const responseNodes = await this.#queryLastFields(message, ws); @@ -134,16 +133,16 @@ class IoTDBHandler extends Handler { if (responseNodes.length) { const responseMessage = this._createUpdateMessage( message, - responseNodes + responseNodes, ); - this._sendMessageToClients(responseMessage); + this._sendMessageToClient(ws, responseMessage); } else { this._sendMessageToClient(ws, { error: "Object not found." }); } } catch (error) { this._sendMessageToClient(ws, { error: `Failed writing data. ${error}` }); } finally { - this.#closeSessionIfNeeded(); + await this.#closeSessionIfNeeded(); } } @@ -157,10 +156,10 @@ class IoTDBHandler extends Handler { } const openSessionReq = new TSOpenSessionReq({ - username: config.iotdbUser, - password: config.iotdbPassword, + username: databaseConfig.iotdbUser, + password: databaseConfig.iotdbPassword, client_protocol: this.protocolVersion, - zoneId: config.timeZoneId, + zoneId: databaseConfig.timeZoneId, configuration: { version: "V_0_13" }, }); @@ -172,7 +171,7 @@ class IoTDBHandler extends Handler { "Protocol differ, Client version is " + this.protocolVersion + ", but Server version is " + - resp.serverProtocolVersion + resp.serverProtocolVersion, ); // version is less than 0.10 if (resp.serverProtocolVersion === 0) { @@ -187,7 +186,7 @@ class IoTDBHandler extends Handler { } catch (error) { logMessage( "Failed starting session with IoTDB: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); } } @@ -210,9 +209,9 @@ class IoTDBHandler extends Handler { } catch (error) { logMessage( "Error occurs when closing session at server. Maybe server is down. Error message: ".concat( - error + error, ), - MessageType.ERROR + MessageType.ERROR, ); } finally { this.isSessionClosed = true; @@ -267,13 +266,13 @@ class IoTDBHandler extends Handler { this.statementId, this.sessionId, resp.queryDataSet, - resp.ignoreTimeStamp + resp.ignoreTimeStamp, ); } } catch (error) { logMessage( "Failed executing query statement: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); } } @@ -295,7 +294,7 @@ class IoTDBHandler extends Handler { measurements, dataTypes, values, - isAligned = false + isAligned = false, ) { if ( values.length !== dataTypes.length || @@ -305,7 +304,7 @@ class IoTDBHandler extends Handler { } const valuesInBytes = IoTDBDataInterpreter.serializeValues( dataTypes, - values + values, ); let request = new TSInsertRecordReq({ @@ -328,9 +327,9 @@ class IoTDBHandler extends Handler { */ async #queryLastFields(message, ws) { const { id: objectId, tree } = message; - const { databaseName, endpointId } = database[tree]; - const fieldsToSearch = this.#extractEndpointsFromNodes(message).join(", "); - const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${endpointId} = '${objectId}' ORDER BY Time ASC`; + const { databaseName, dataPointId } = databaseParams[tree]; + const fieldsToSearch = this.#extractDataPointsFromNodes(message).join(", "); + const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${dataPointId} = '${objectId}' ORDER BY Time ASC`; try { const sessionDataSet = await this.#executeQueryStatement(sql); @@ -349,15 +348,15 @@ class IoTDBHandler extends Handler { // extract underscores from media element key const transformedMediaElement = Object.fromEntries( Object.entries(mediaElement).map(([key, value]) => { - const newKey = this._transformEndpointsWithDots(key); + const newKey = this._transformDataPointsWithDots(key); return [newKey, value]; - }) + }), ); const transformedObject = IoTDBDataInterpreter.extractNodesFromTimeseries( transformedMediaElement, - databaseName + databaseName, ); Object.entries(transformedObject).forEach(([key, value]) => { @@ -379,27 +378,27 @@ class IoTDBHandler extends Handler { } /** - * Extracts endpoint names from the given message. + * Extracts data point names from the given message. * * This function checks if the message has a single node or multiple nodes and * extracts the names accordingly. * * @param {Object} message - The message containing node(s). - * @returns {Array} An array of endpoint names. + * @returns {Array} An array of data point names. */ - #extractEndpointsFromNodes(message) { - let endpoints = []; + #extractDataPointsFromNodes(message) { + let dataPoints = []; if (message.node) { - endpoints.push( - this._transformEndpointsWithUnderscores(message.node.name) + dataPoints.push( + this._transformDatapointsWithUnderscores(message.node.name), ); } else if (message.nodes) { - endpoints = message.nodes.map((node) => - this._transformEndpointsWithUnderscores(node.name) + dataPoints = message.nodes.map((node) => + this._transformDatapointsWithUnderscores(node.name), ); } - return endpoints; + return dataPoints; } /** @@ -410,13 +409,13 @@ class IoTDBHandler extends Handler { */ #createObjectToInsert(message) { const { id, tree } = message; - const data = { [database[tree].endpointId]: id }; + const data = { [databaseParams[tree].dataPointId]: id }; if (message.node) { - data[this._transformEndpointsWithUnderscores(message.node.name)] = + data[this._transformDatapointsWithUnderscores(message.node.name)] = message.node.value; } else if (message.nodes) { message.nodes.forEach((node) => { - data[this._transformEndpointsWithUnderscores(node.name)] = node.value; + data[this._transformDatapointsWithUnderscores(node.name)] = node.value; }); } return data; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js similarity index 100% rename from cdsp/information-layer/handlers/src/iotdb/utils/IoTDBConstants.js rename to cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js similarity index 96% rename from cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js rename to cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js index 840112e..7a52b4f 100644 --- a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js @@ -1,9 +1,9 @@ const { IoTDBDataType, SupportedMessageDataTypes, -} = require("./IoTDBConstants"); +} = require("./iotdb-constants"); -class IoTDBDataInterpreter { +class IotdbDataInterpreter { /** * Serializes values based on the specified data types. * @param {Array} dataTypes - Array of data types to serialize the values as. @@ -59,7 +59,7 @@ class IoTDBDataInterpreter { case SupportedMessageDataTypes.uint16: serializedValues.push(...serializeInt32(values[i])); break; - // case SupportedMessageDataTypes.int64: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/IoTDBConstants.js + // case SupportedMessageDataTypes.int64: // this type is not supported by now, see: cdsp/information-layer/handlers/iotdb/utils/iotdb-constants.js // serializedValues.push(...serializeInt64(values[i])); // break; case SupportedMessageDataTypes.float: @@ -110,4 +110,4 @@ class IoTDBDataInterpreter { } } -module.exports = { IoTDBDataInterpreter }; +module.exports = { IoTDBDataInterpreter: IotdbDataInterpreter }; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js similarity index 98% rename from cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js rename to cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js index b103b23..18a3745 100644 --- a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSets.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js @@ -1,4 +1,4 @@ -const { IoTDBDataType } = require("./IoTDBConstants"); +const { IoTDBDataType } = require("./iotdb-constants"); class IoTDBRpcDataSet { // Static properties static TIMESTAMP_STR = "Time"; @@ -36,7 +36,7 @@ class IoTDBRpcDataSet { sessionId, queryDataSet, ignoreTimestamp, - fetchSize + fetchSize, ) { this.#columnNameList = []; this.#columnTypeList = []; @@ -75,7 +75,7 @@ class IoTDBRpcDataSet { let index = columnNameIndex[name]; this.#columnOrdinalDict.set( name, - index + IoTDBRpcDataSet.START_INDEX + index + IoTDBRpcDataSet.START_INDEX, ); this.#columnTypeDeduplicatedList[index] = IoTDBDataType[columnTypeList[i]]; @@ -85,7 +85,7 @@ class IoTDBRpcDataSet { this.#timeBytes = Buffer.alloc(0); this.#currentBitmap = Array(this.#columnTypeDeduplicatedList.length).fill( - Buffer.alloc(0) + Buffer.alloc(0), ); this.#value = Array(this.#columnTypeDeduplicatedList.length).fill(null); } diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js b/cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js similarity index 93% rename from cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js rename to cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js index c4b0b79..6bf0cb5 100644 --- a/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js @@ -1,6 +1,6 @@ -const { IoTDBDataType } = require("./IoTDBConstants"); -const IoTDBRpcDataSet = require("./IoTDBRpcDataSets"); -const { IoTDBDataInterpreter } = require("./IoTDBDataInterpreter"); +const { IoTDBDataType } = require("./iotdb-constants"); +const IoTDBRpcDataSet = require("./iotdb-rpc-data-sets"); +const { IoTDBDataInterpreter } = require("./iotdb-data-interpreter"); const dataTypeProcessors = { [IoTDBDataType.BOOLEAN]: (bytes) => @@ -39,7 +39,7 @@ class SessionDataSet { statementId, sessionId, queryDataSet, - ignoreTimestamp + ignoreTimestamp, ) { this.iotdbRpcDataSet = new IoTDBRpcDataSet( columnNameList, @@ -51,7 +51,7 @@ class SessionDataSet { sessionId, queryDataSet, ignoreTimestamp, - 1024 // Buffer size or default value + 1024, // Buffer size or default value ); } @@ -92,7 +92,7 @@ class SessionDataSet { */ constructRowRecordFromValueArray() { let time64 = IoTDBDataInterpreter.extractTimestamp( - this.iotdbRpcDataSet.getTimeBytes() + this.iotdbRpcDataSet.getTimeBytes(), ); let obj = { timestamp: time64 }; diff --git a/cdsp/information-layer/handlers/src/package.json b/cdsp/information-layer/handlers/src/package.json new file mode 100644 index 0000000..40ea91b --- /dev/null +++ b/cdsp/information-layer/handlers/src/package.json @@ -0,0 +1,8 @@ +{ + "name": "handlers", + "version": "1.0.0", + "description": "Database handlers", + "dependencies": { + "js-yaml": "^4.1.0" + } +} diff --git a/cdsp/information-layer/handlers/src/realmdb/.gitignore b/cdsp/information-layer/handlers/src/realmdb/.gitignore index 4bdca67..645f5bd 100644 --- a/cdsp/information-layer/handlers/src/realmdb/.gitignore +++ b/cdsp/information-layer/handlers/src/realmdb/.gitignore @@ -1,6 +1,3 @@ # Node.js node_modules/ -package-lock.json - -# Credentials Config File -config/config.js \ No newline at end of file +package-lock.json \ No newline at end of file diff --git a/cdsp/information-layer/handlers/src/realmdb/README.md b/cdsp/information-layer/handlers/src/realmdb/README.md index 6e68fb1..013dee7 100644 --- a/cdsp/information-layer/handlers/src/realmdb/README.md +++ b/cdsp/information-layer/handlers/src/realmdb/README.md @@ -1,42 +1,52 @@ # RealmDB This directory contains the RealmDB Handler as Node.js application. As [RealmDB](https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/) is an embedded database, the RealmDB Handler directly embeds the RealmSDK which creates the [RealmDB database](https://github.com/realm/realm-js) file(s) automatically in the working directory during runtime of RealmDB Handler. + # Features - **Authentication**: Authenticates with MongoDB Realm using an API key. -- **Read Data**: Retrieves data from the Realm database using a primary key. -- **Subscribe to Changes**: Listens to changes in specific data objects and sends updates to WebSocket clients. +- **Read Data**: Retrieves data from the Realm database using a VIN (for VSS object) object ID. +- **Write Data**: Write data to the Realm database using a VIN (for VSS object) as object ID.- +- **Subscribe to Changes**: Listens to changes in specific data objects using VIN (for VSS object) as object ID and sends updates to WebSocket clients. +- **Unsubscribe to Changes**: Unsubscribe listener to a specific data object using VIN (for VSS object) as object ID. +- **Unsubscribe client**: Unsubscribe all listeners applied to a client. - **Error Handling**: Logs and handles errors during database operations and synchronization. -# Installation - -Execute within `realmdb` directory - -```bash -npm install -``` - # Configure RealmDB -Before the Database-Router can start the RealmDB Handler without any errors you need to configure the RealmSDK before. +Before the Database-Router can start the RealmDB Handler without any errors you need to start and run Docker containers defined in a [Docker Compose file](/docker/). ## Create a ATLAS Cloud instance -To get APIKey and AppID you need to setup a [ATLAS cloud](https://cloud.mongodb.com/) instance and App Services. There is a free Tier solution (Status as of May 29, 2024) and you will find a lot of documentation in the internet how to set up everything. +To get APIKey and AppID you need to set up a [ATLAS cloud](https://cloud.mongodb.com/) instance and App Services. There is a free Tier solution (Status as of May 29, 2024) and you will find a lot of documentation in the internet how to set up everything. ## Configure of a RealmDB Handler -Create `config/config.js` with the following format, replacing the app id and the api key with yours. - -```js -module.exports = { - realmAppId: "your-realm-AppId", - realmApiKey: "your-realm-ApiKey", -}; +Create (if it does not exist) `/docker/.env` and add the following environment variables, replacing the app id and the api key with yours. + +```sh + ######################### + # GENERAL CONFIGURATION # + ######################### + + # HANDLER_TYPE define the database to initialize + HANDLER_TYPE=realmdb + # DATA_POINTS_SCHEMA_FILE is the YAML or JSON file containing all data points supported. See the ../../config/README.md for more information. + DATA_POINTS_SCHEMA_FILE=vss_data_points.yaml + ######################### + # REALMDB CONFIGURATION # + ######################### + + # VERSION must be 0 or a positive integer. This is used for versioning the RealmDB configuration schema. + VERSION_REALMDB_SCHEMA=0 + + # Access to ATLAS Cloud instance + REALMDB_APP_ID="your-app-key" + REALMDB_API_KEY="your-api-key" ``` -> **_IMPORTANT:_** Do not commit this file to github! +> **_IMPORTANT:_** Do not commit this file to GitHub! ## Starting the RealmDB handler -You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../../router/README.md#Run). \ No newline at end of file +You do not need to start RealmDB Handler manually. It is started by the DB-Router like described [here](../../../README.md). diff --git a/cdsp/information-layer/handlers/src/realmdb/config/database-params.js b/cdsp/information-layer/handlers/src/realmdb/config/database-params.js index 43b198e..c9d585b 100644 --- a/cdsp/information-layer/handlers/src/realmdb/config/database-params.js +++ b/cdsp/information-layer/handlers/src/realmdb/config/database-params.js @@ -1,15 +1,46 @@ +const { getEnvValue } = require("../../../config/config"); + /* - * Contains the definition of the database name and its identifier endpoint for each catalog. + * Contains the definition of the database name and its identifier data point for each catalog. */ const mediaElementsParams = Object.freeze({ VSS: { databaseName: "Vehicles", // name of the configured RealmDB for the VSS database - endpointId: "Vehicle_VehicleIdentification_VIN", // endpoint used as element ID + dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID }, }); -const databaseConfig = Object.freeze({ - storePath: "myrealm12.realm", -}); +/** + * Retrieves the database configuration. + * + * This function fetches the Realm application ID and API key from the environment variables. + * If either of these values is not found, it throws an error. + * + * @throws {Error} If the REALMDB_APP_ID is not set in the environment variables. + * @throws {Error} If the REALMDB_API_KEY is not set in the environment variables. + * + * @returns {Object} The database configuration object containing: + * - storePath: The path to the Realm database file. + * - realmAppId: The Realm application ID. + * - realmApiKey: The Realm API key. + */ +const getDatabaseConfig = () => { + const realmAppId = getEnvValue("REALMDB_APP_ID"); + const realmApiKey = getEnvValue("REALMDB_API_KEY"); + if (!realmAppId) { + throw new Error("REALMDB_APP_ID is required, any default has been set"); + } else if (!realmApiKey) { + throw new Error("REALMDB_API_KEY is required, any default has been set"); + } + + return Object.freeze({ + storePath: "myrealm12.realm", + realmAppId: realmAppId, + realmApiKey: realmApiKey, + }); +}; + +const databaseConfig = + getEnvValue("HANDLER_TYPE") === "realmdb" ? getDatabaseConfig() : {}; module.exports = { mediaElementsParams, databaseConfig }; diff --git a/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js b/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js index 89ba3c9..26912dd 100644 --- a/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js +++ b/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js @@ -1,9 +1,15 @@ const { mediaElementsParams, databaseConfig } = require("./database-params"); -const dotenv = require("dotenv"); -dotenv.config(); +const { getEnvValue } = require("../../../config/config"); -function realmConfig(user, supportedEndpoints) { - const mediaElementSchema = createMediaElementSchema(supportedEndpoints); +/** + * Configures the Realm database settings. + * + * @param {Object} user - The user object for authentication. + * @param {Array} supportedEndpoints - List of supported endpoints for the media element schema. + * @returns {Object} - The configuration object for the Realm database. + */ +function realmConfig(user, supportedDataPoints) { + const mediaElementSchema = createMediaElementSchema(supportedDataPoints); return { schema: [mediaElementSchema], path: databaseConfig.storePath, @@ -25,10 +31,10 @@ function realmConfig(user, supportedEndpoints) { } const getSchemaVersion = () => { - const schemaVersion = parseInt(process.env.VERSION, 10); + const schemaVersion = parseInt(getEnvValue("VERSION_REALMDB_SCHEMA"), 10); if (isNaN(schemaVersion)) { throw new Error( - "Version must be specified as an ENV variable and it must be 0 or a positive integer" + "Version must be specified as an ENV variable and it must be 0 or a positive integer", ); } return schemaVersion; @@ -55,7 +61,7 @@ function createMediaElementSchema(supportedEndpoints) { break; default: throw new Error( - `The initialized endpoints contains an unsupported data type: ${value}` + `The initialized data points contains an unsupported data type: ${value}`, ); } }); diff --git a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js index ce6ef53..17c3c7e 100644 --- a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js @@ -1,17 +1,18 @@ const Realm = require("realm"); const Handler = require("../../handler"); -const config = require("../config/config"); -const { mediaElementsParams } = require("../config/database-params"); +const { + mediaElementsParams, + databaseConfig, +} = require("../config/database-params"); const realmConfig = require("../config/realm-configuration"); const { v4: uuidv4 } = require("uuid"); -const app = new Realm.App({ id: config.realmAppId }); -const credentials = Realm.Credentials.apiKey(config.realmApiKey); const { logMessage, logWithColor, MessageType, COLORS, } = require("../../../../utils/logger"); + /** * Parses the response from a media element change event. * @@ -31,19 +32,24 @@ class RealmDBHandler extends Handler { super(); this.realm = null; this._sendMessageToClients = null; + this.listeners = new Map(); } async authenticateAndConnect(sendMessageToClients) { try { this._sendMessageToClients = sendMessageToClients; + + const app = new Realm.App({ id: databaseConfig.realmAppId }); + const credentials = Realm.Credentials.apiKey(databaseConfig.realmApiKey); const user = await app.logIn(credentials); console.info("Successfully authenticated to RealmDB"); - const supportedEndpoints = this._getSupportedEndpoints(); - const realmConfigObj = realmConfig(user, supportedEndpoints); + + const supportedDataPoints = this._getSupportedDataPoints(); + const realmConfigObj = realmConfig(user, supportedDataPoints); this.realm = await Realm.open(realmConfigObj); console.info("Connection established successfully"); - Object.entries(mediaElementsParams).forEach(async ([key, value]) => { + for (const [key, value] of Object.entries(mediaElementsParams)) { try { const databaseName = value.databaseName; await this.realm.objects(databaseName).subscribe(); @@ -51,14 +57,14 @@ class RealmDBHandler extends Handler { } catch (error) { logMessage( "Error subscribing databases: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); } - }); + } } catch (error) { logMessage( "Failed to authenticate with Realm: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); } } @@ -70,7 +76,7 @@ class RealmDBHandler extends Handler { } catch (error) { logMessage( "Error reading object from Realm: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); this._sendMessageToClient(ws, { error: "Error reading object" }); } @@ -80,23 +86,23 @@ class RealmDBHandler extends Handler { try { const mediaElement = await this.#getMediaElement(message, ws); let nodes = message.node ? [message.node] : message.nodes; - const endpoints = []; + const dataPoints = []; if (mediaElement) { this.realm.write(() => { nodes.forEach(({ name, value }) => { - const prop = this._transformEndpointsWithUnderscores(name); - endpoints.push(name); + const prop = this._transformDatapointsWithUnderscores(name); + dataPoints.push(name); mediaElement[prop] = value; }); }); } else { - const endpointId = mediaElementsParams[message.tree].endpointId; - let document = { _id: uuidv4(), [endpointId]: message.id }; + const dataPointId = mediaElementsParams[message.tree].dataPointId; + let document = { _id: uuidv4(), [dataPointId]: message.id }; nodes.forEach(({ name, value }) => { - const prop = this._transformEndpointsWithUnderscores(name); - endpoints.push(name); + const prop = this._transformDatapointsWithUnderscores(name); + dataPoints.push(name); document[prop] = value; }); const databaseName = mediaElementsParams[message.tree].databaseName; @@ -106,14 +112,12 @@ class RealmDBHandler extends Handler { }); } - let messageNodes = endpoints.map((key) => ({ name: key })); - const updateMessage = await this.#getMessageData(message, ws); - this._sendMessageToClients(updateMessage); + this._sendMessageToClient(ws, updateMessage); } catch (error) { logMessage( "Error writing object changes in Realm: ".concat(error), - MessageType.ERROR + MessageType.ERROR, ); this._sendMessageToClient(ws, { error: "Error writing object changes" }); } @@ -125,20 +129,25 @@ class RealmDBHandler extends Handler { if (mediaElement) { const objectId = mediaElement._id; const { id, tree, uuid } = message; - const { databaseName, endpointId } = mediaElementsParams[tree]; - logWithColor( - `Subscribing element: Object ID: ${objectId} with ${endpointId}: '${id}' on ${databaseName}`, - COLORS.GREY - ); + const { databaseName, dataPointId } = mediaElementsParams[tree]; - const mediaElementToSubscribe = await this.realm.objectForPrimaryKey( - databaseName, - objectId - ); + if (!this.listeners.has(ws)) { + this.listeners.set(ws, new Map()); + } - if (mediaElementToSubscribe) { - mediaElementToSubscribe.addListener( - (mediaElementToSubscribe, changes) => + if (!this.listeners.get(ws).has(id)) { + logWithColor( + `Subscribing element for user '${uuid}': Object ID: ${objectId} with ${dataPointId}: '${id}' on ${databaseName}`, + COLORS.GREY, + ); + + const mediaElementToSubscribe = await this.realm.objectForPrimaryKey( + databaseName, + objectId, + ); + + if (mediaElementToSubscribe) { + const listener = (mediaElementToSubscribe, changes) => this.#onMediaElementChange( mediaElementToSubscribe, changes, @@ -147,15 +156,34 @@ class RealmDBHandler extends Handler { tree: tree, uuid: uuid, }, - ws - ) - ); - this._sendMessageToClient(ws, { - success: `subscribed to ${endpointId}: '${id}'`, - }); + ws, + ); + + mediaElementToSubscribe.addListener(listener); + + // Store the listener so we can remove it later + this.listeners.get(ws).set(id, { + objectId: objectId, + mediaElement: mediaElementToSubscribe, + listener: listener, + }); + + this._sendMessageToClient(ws, { + success: `Subscribed to ${dataPointId}: '${id}'`, + }); + + logWithColor( + `Subscription added! Amount Clients: ${this.listeners.size}`, + COLORS.GREY, + ); + } else { + this._sendMessageToClient(ws, { + error: "Object could not be subscribed", + }); + } } else { this._sendMessageToClient(ws, { - error: "Object could not be subscribed", + success: `Subscription was already done to ${dataPointId}: '${id}'`, }); } } else { @@ -168,6 +196,52 @@ class RealmDBHandler extends Handler { } } + async unsubscribe(message, ws) { + const { id, tree, uuid } = message; + const { databaseName, dataPointId } = mediaElementsParams[tree]; + + if (this.listeners.has(ws)) { + const wsListeners = this.listeners.get(ws); + if (wsListeners.has(id)) { + const listener = wsListeners.get(id); + logWithColor( + `Unsubscribing element for user '${uuid}': Object ID: ${listener.objectId} with ${dataPointId}: '${id}' on ${databaseName}`, + COLORS.GREY, + ); + listener.mediaElement.removeListener(listener.listener); + wsListeners.delete(id); + + if (wsListeners.size === 0) { + this.listeners.delete(ws); + } + + this._sendMessageToClient(ws, { + success: `Unsubscribed to ${dataPointId}: '${id}'`, + }); + } else { + this._sendMessageToClient(ws, { + error: `No subscription found for VIN: ${id}`, + }); + } + } else { + this._sendMessageToClient(ws, { + error: `No subscription found for VIN: ${id}`, + }); + } + logWithColor( + `Subscription removed! Amount Clients: ${this.listeners.size}`, + COLORS.GREY, + ); + } + + async unsubscribe_client(ws) { + this.listeners.delete(ws); + logWithColor( + `All client subscriptions removed! Amount Clients: ${this.listeners.size}`, + COLORS.GREY, + ); + } + /** * Asynchronously retrieves media element, processes it, and creates an updated message. * @@ -180,7 +254,7 @@ class RealmDBHandler extends Handler { const mediaElement = await this.#getMediaElement(message, ws); logWithColor( `Media Element: \n ${JSON.stringify(mediaElement)}`, - COLORS.GREY + COLORS.GREY, ); if (mediaElement) { const responseNodes = this.#parseReadResponse(message, mediaElement); @@ -200,10 +274,10 @@ class RealmDBHandler extends Handler { async #getMediaElement(message, ws) { try { const { id, tree } = message; - const { databaseName, endpointId } = mediaElementsParams[tree]; + const { databaseName, dataPointId } = mediaElementsParams[tree]; return await this.realm .objects(databaseName) - .filtered(`${endpointId} = '${id}'`)[0]; + .filtered(`${dataPointId} = '${id}'`)[0]; } catch (error) { this._sendMessageToClient(ws, { error: "Error reading object" }); } @@ -219,7 +293,7 @@ class RealmDBHandler extends Handler { logMessage( "Media element changed", MessageType.RECEIVED, - `Web-Socket Connection Event Received` + `Web-Socket Connection Event Received`, ); if (changes.deleted) { logMessage(changes.deleted, COLORS.YELLOW, "MediaElement is deleted"); @@ -227,11 +301,11 @@ class RealmDBHandler extends Handler { if (changes.changedProperties.length > 0) { const responseNodes = parseOnMediaElementChangeResponse( changes, - mediaElement + mediaElement, ); const updateMessage = this._createUpdateMessage( messageHeader, - responseNodes + responseNodes, ); this._sendMessageToClient(ws, updateMessage); } @@ -249,7 +323,7 @@ class RealmDBHandler extends Handler { const data = []; const nodes = message.node ? [message.node] : message.nodes; nodes.forEach((node) => { - const prop = this._transformEndpointsWithUnderscores(node.name); + const prop = this._transformDatapointsWithUnderscores(node.name); data.push({ name: node.name, value: queryResponseObj[prop], diff --git a/cdsp/information-layer/package.json b/cdsp/information-layer/package.json new file mode 100644 index 0000000..a86d372 --- /dev/null +++ b/cdsp/information-layer/package.json @@ -0,0 +1,22 @@ +{ + "name": "information-layer", + "version": "1.0.0", + "description": "WebSocket server with handlers for IoTDB and RealmDB", + "private": true, + "workspaces": [ + "handlers/src", + "handlers/src/iotdb", + "handlers/src/realmdb", + "router" + ], + "main": "router/src/websocket-server.js", + "scripts": { + "start": "node router/src/websocket-server.js" + }, + "dependencies": { + "dotenv": "^16.4.5" + }, + "devDependencies": { + "prettier": "3.3.3" + } +} diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md index e93a185..38ff920 100644 --- a/cdsp/information-layer/router/README.md +++ b/cdsp/information-layer/router/README.md @@ -1,27 +1,4 @@ -With this component, you can configure which database it connects to. +# Websocket-Server -> [!WARNING] -> While configuring Docker for environment variable definition, the `dotenv` package is used to load environment variables from an `.env` file into `process.env`. +This project is a [WebSocket server](src/websocket-server.js) that dynamically integrates different database handlers (e.g., RealmDB, IoTDB) based on the [configuration](../handlers/README.md). It listens for incoming WebSocket connections, processes messages according to the specified handler, and broadcasts messages to connected clients. -# Install - -Execute in this directory: - -```bash -npm install -``` - -# Run -The `.env` file contains key-value pairs of environment variables that are used during the build and runtime of the Docker container. This allows for easy configuration of the application without changing the source code. - -- **HANDLER_TYPE**: Configure `realmdb` to start the RealmDB Handler or `iotdb` to start the IoTDB Handler. -- **VERSION**: This variable is automatically incremented by the build script, ensuring that every Docker image build has a unique version identifier. - -> [!WARNING] -> Create a `.env` file in the same directory as your `docker-compose.yml`. If it doesn't exist, create it in the same directory as `websocket-server.js`. - -Start router by executing in [src](./src/) directory the command: - -```bash -node websocket-server.js -``` diff --git a/cdsp/information-layer/router/config/config.js b/cdsp/information-layer/router/config/config.js index 2aaa80f..4233552 100644 --- a/cdsp/information-layer/router/config/config.js +++ b/cdsp/information-layer/router/config/config.js @@ -1,10 +1,10 @@ -const dotenv = require('dotenv'); +const dotenv = require("dotenv"); dotenv.config(); const getHandlerType = () => { const handlerType = process.env.HANDLER_TYPE; if (!handlerType) { - throw new Error('Handler type must be specified as an ENV variable.'); + throw new Error("HANDLER_TYPE must be specified as an ENV variable"); } return handlerType.toLowerCase(); }; diff --git a/cdsp/information-layer/router/package.json b/cdsp/information-layer/router/package.json index d5aafb0..333c2ac 100644 --- a/cdsp/information-layer/router/package.json +++ b/cdsp/information-layer/router/package.json @@ -8,7 +8,6 @@ }, "dependencies": { "ajv": "^8.17.1", - "dotenv": "^16.4.5", "ws": "^7.4.6" } } diff --git a/cdsp/information-layer/router/src/.env b/cdsp/information-layer/router/src/.env deleted file mode 100644 index a900aca..0000000 --- a/cdsp/information-layer/router/src/.env +++ /dev/null @@ -1,4 +0,0 @@ -# HANDLER_TYPE can be initialized with two different values: `realmdb` or `iotdb` -HANDLER_TYPE=realmdb -# VERSION must be 0 or a positive integer. This is used for versioning the RealmDB configuration schema. -VERSION=0 diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index b4895b1..8bf9c9e 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -41,12 +41,12 @@ server.on("connection", (ws) => { if (validatedMessage instanceof Error) { logMessage( `Invalid message format: ${validatedMessage.message}`, - MessageType.ERROR + MessageType.ERROR, ); ws.send( JSON.stringify({ error: `Invalid message format`, - }) + }), ); } else { handler.handleMessage(validatedMessage, ws); @@ -54,9 +54,11 @@ server.on("connection", (ws) => { }); ws.on("close", () => { - console.info("* Client disconnected *"); + // Remove all client listeners + handler.unsubscribe_client(ws); // Remove disconnected client from the array clients = clients.filter((client) => client !== ws); + console.info("* Client disconnected *"); }); }); diff --git a/cdsp/information-layer/router/utils/message-validator.js b/cdsp/information-layer/router/utils/message-validator.js index ca7f1d8..8948273 100644 --- a/cdsp/information-layer/router/utils/message-validator.js +++ b/cdsp/information-layer/router/utils/message-validator.js @@ -95,6 +95,14 @@ const schemas = { required: itemsHeader, additionalProperties: false, }, + unsubscribe: { + type: "object", + properties: { + ...createCommonStructure("unsubscribe"), + }, + required: itemsHeader, + additionalProperties: false, + }, }; const validateMessage = (message) => { @@ -111,6 +119,9 @@ const validateMessage = (message) => { case "subscribe": schemaKey = "subscribe"; break; + case "unsubscribe": + schemaKey = "unsubscribe"; + break; default: throw new Error(ajv.errorsText(validate.errors)); } diff --git a/docker/.gitignore b/docker/.gitignore index b8ed0da..1881067 100644 --- a/docker/.gitignore +++ b/docker/.gitignore @@ -2,4 +2,5 @@ data/ logs/ - +# Enviroment variables containing secrets +.env \ No newline at end of file diff --git a/docker/README.md b/docker/README.md index 1913f13..297d06e 100644 --- a/docker/README.md +++ b/docker/README.md @@ -3,6 +3,12 @@ This directory contains files related to the Docker deployment of the Central Da # Central Data Service Playground The compose file `docker-compose-cdsp.yml` provides a containerized deployment of the playground using docker. +## Table of contents +- [Docker installation](#docker-installation) +- [VISSR docker image build setup](#vissr-docker-image-build-setup) +- [Websocket-Server docker image build setup](#websocket-server-docker-image-build-setup) +- [Deploy with Docker Compose](#deploy-with-docker-compose) + ## Docker installation If you are not familiar with Docker it is a widely deployed and well documented technology. For which you should find numerous tutorials on its use on the internet. @@ -32,7 +38,7 @@ Depending on your distro you may need to setup `GOROOT` and `GOPATH`. This was n ### Create persistent local volume `/tmp/docker` The upstream Docker compose assumes the existence of the local directory `/tmp/docker` but does not create it. Fix the issue by creating it yourself: -``` +```shell $ mkdir /tmp/docker ``` See upstream issue report https://github.com/w3c/automotive-viss2/issues/99 for details. @@ -44,8 +50,8 @@ See upstream issue report https://github.com/w3c/automotive-viss2/issues/86 for ### Disable Access Grant support (agt_public_key.rsa build error) There is a current issue with the upstream VISSR VISS Server Dockerfile in which the server fails to build due to a missing public key for the Access Control server. See upstream issue report https://github.com/w3c/automotive-viss2/issues/88 for details. After discussion with the upstream maintainers the current workaround is to comment out the relevant following line from the end of the `vissv2server` section of the Dockerfile. The change should be made to `cdsp/cdsp/vissr/Dockerfile.rlserver` -``` -#COPY --from=builder /build/server/agt_server/agt_public_key.rsa . +```shell +# COPY --from=builder /build/server/agt_server/agt_public_key.rsa . ``` If your project requires Access Grant support please discuss enabling it with the VISSR community. @@ -72,8 +78,8 @@ A solution is to add the CA root certificate to the VISSR Dockerfile which will The VISSR Dockerfile already includes an example of this for a Cisco system which uses the CA root certificate `cisco.crt`. From `cdsp/vissr/Dockerfile.rlserver`: -``` -#corporate proxy settings can sometimes cause tls verification error. Add root crt to docker container. +```dockerfile +# corporate proxy settings can sometimes cause tls verification error. Add root crt to docker container. COPY testCredGen/cicso-umbrella/cisco.crt /usr/local/share/ca-certificates/cisco.crt RUN update-ca-certificates ``` @@ -82,7 +88,7 @@ To add your own: 2. Copy the `.crt` file into `cdsp/vissr/testCredGen` 3. Add your own line to the Dockerfile to copy the certificate so that it is included when `update-ca-certificates` is run. As shown below. -``` +```dockerfile COPY testCredGen/cicso-umbrella/cisco.crt /usr/local/share/ca-certificates/cisco.crt COPY testCredGen/ /usr/local/share/ RUN update-ca-certificates @@ -97,39 +103,98 @@ You can start working with the playground by starting the deployment with just t In parallel you can work through any VISSR build issues to add VISS support northbound and the other features it supports. Deploy (start) just IoTDB: +```shell +$ sudo docker compose -f docker-compose-cdsp.yml up -d iotdb-service +# [+] Running 1/0 +# ✔ Container iotdb-service Running 0.0s +``` + +## Websocket-Server docker image build setup + +This guide provides instructions for deploying the Websocket-Server using Docker Compose. You can choose to deploy the server with either RealmDB or IoTDB as the backend service. + +### Prerequisites + +- Correct configuration of the `.env` file based on the database you are using (RealmDB or IoTDB) + +### Configuring the `.env` File + +The `.env` file contains environment variables that need to be configured depending on the database you are using. Detailed instructions on how to configure the `.env` file can be found in the [database handlers README](../cdsp/information-layer/handlers/README.md). + +> [!IMPORTANT] +> Before proceeding with the deployment, ensure that the `.env` file is correctly configured for the database you plan to use. + +### Using RealmDB + +To deploy the Websocket-Server with RealmDB, use the following command: + +```shell +$ sudo docker compose -f docker-compose-cdsp.yml up -d websocket-service +# [+] Running 1/1 +# ✔ Container websocket-service Started 0.4s ``` +### Using IoTDB + +When deploying with IoTDB, ensure that the iotdb-service is up and running before starting the Websocket-Server. + +> [!IMPORTANT] If required, ensure that the iotdb-service container is started before running the Websocket-Server. You can also configure your own IoTDB connection. + +#### Start IoTDB and Websocket-Server + +To start both the iotdb-service and websocket-service, use the following commands: + +```shell $ sudo docker compose -f docker-compose-cdsp.yml up -d iotdb-service -[+] Running 1/0 - ✔ Container iotdb-service Running 0.0s +# [+] Running 1/1 +# ✔ Container iotdb-service Started 0.4s 0.4s + +$ sudo docker compose -f docker-compose-cdsp.yml up -d websocket-service +# [+] Running 1/1 +# ✔ Container websocket-service Started 0.4s +``` + +### Expected result + +Listing should show three running containers as shown below: +```shell +$ sudo docker ps +``` + +``` +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +025b5dd05c56 cdsp-websocket-service "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp websocket-service +e16c8ed4ed42 apache/iotdb:1.2.2-standalone "/usr/bin/dumb-init …" 23 minutes ago Up 19 minutes 0.0.0.0:6667->6667/tcp, :::6667->6667/tcp iotdb-service ``` ## Deploy with Docker Compose ### Start/stop containers Start the containers: -``` +```shell $ sudo docker compose -f docker-compose-cdsp.yml up -d -[+] Running 4/5 - ⠴ Network cdsp_default Created 1.5s - ✔ Container vissr_container_volumes Started 0.5s - ✔ Container iotdb-service Started 0.7s - ✔ Container app_redis Started 1.0s - ✔ Container vissv2server Started 1.3s +# [+] Running 4/5 +# ⠴ Network cdsp_default Created 1.5s +# ✔ Container vissr_container_volumes Started 0.5s +# ✔ Container iotdb-service Started 0.7s +# ✔ Container app_redis Started 1.0s +# ✔ Container vissv2server Started 1.3s ``` Stop and remove the containers: -``` +```shell $ sudo docker compose -f docker-compose-cdsp.yml down -[+] Running 5/5 - ✔ Container vissv2server Removed 0.0s - ✔ Container app_redis Removed 0.3s - ✔ Container iotdb-service Removed 2.2s - ✔ Container vissr_container_volumes Removed 0.0s - ✔ Network cdsp_default Removed 0.1s +# [+] Running 5/5 +# ✔ Container vissv2server Removed 0.0s +# ✔ Container app_redis Removed 0.3s +# ✔ Container iotdb-service Removed 2.2s +# ✔ Container vissr_container_volumes Removed 0.0s +# ✔ Network cdsp_default Removed 0.1s ``` ### Expected Result Listing should show three running containers as shown below: -``` +```shell $ sudo docker ps +``` +``` NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS app_redis redis "docker-entrypoint.s…" redis 10 minutes ago Up 10 minutes 6379/tcp iotdb-service apache/iotdb:1.2.2-standalone "/usr/bin/dumb-init …" iotdb-service 10 minutes ago Up 10 minutes 0.0.0.0:6667->6667/tcp, :::6667->6667/tcp @@ -137,8 +202,10 @@ vissv2server cdsp-vissv2server "/app/vissv2server -…" vissv ``` #### Apache IoTDB You can confirm the Apache IoTDB server is running by connecting to it with the IoTDB CLI client (_quit_ to exit the client): -``` +```shell $ sudo docker exec -ti iotdb-service /iotdb/sbin/start-cli.sh -h iotdb-service +``` +``` --------------------- Starting IoTDB Cli --------------------- diff --git a/docker/docker-compose-cdsp.yml b/docker/docker-compose-cdsp.yml index 8ef75a5..5976d11 100644 --- a/docker/docker-compose-cdsp.yml +++ b/docker/docker-compose-cdsp.yml @@ -27,48 +27,61 @@ services: - dn_target_config_node_list=iotdb-service:10710 volumes: - ./data:/iotdb/data - - ./logs:/iotdb/logs + - ./logs/iotdb:/iotdb/logs -# VISSR acting as VISS Data Server +# WebSocket server service + websocket-service: + build: + context: ../cdsp/information-layer + dockerfile: Dockerfile + container_name: websocket-service + ports: + - "8080:8080" + volumes: + - ./logs/information-layer:/app/logs + env_file: + - .env + + # VISSR acting as VISS Data Server tmp: - image: busybox - container_name: vissr_container_volumes - user: root - command: > - chmod -R 777 /tmp/docker/ - volumes: - - /tmp/docker/ + image: busybox + container_name: vissr_container_volumes + user: root + command: > + chmod -R 777 /tmp/docker/ + volumes: + - /tmp/docker/ redis: - image: redis - container_name: app_redis - privileged: true - user: root - restart: on-failure:3 - command: redis-server /etc/redis.conf - volumes: - - ../cdsp/vissr/redis/redis.conf:/etc/redis.conf - volumes_from: - - tmp + image: redis + container_name: app_redis + privileged: true + user: root + restart: on-failure:3 + command: redis-server /etc/redis.conf + volumes: + - ../cdsp/vissr/redis/redis.conf:/etc/redis.conf + volumes_from: + - tmp vissv2server: - container_name: vissv2server - depends_on: - - redis - - iotdb-service - restart: on-failure:3 - build: - context: ../cdsp/vissr # context set to repo root - dockerfile: Dockerfile.rlserver - target: vissv2server - entrypoint: [ /app/vissv2server,-s,apache-iotdb] - ports: - - "0.0.0.0:8081:8081" - - "127.0.0.1:8888:8888" - - "0.0.0.0:8887:8887" - - "0.0.0.0:8600:8600" - volumes: - - ./logs:/app/logs - volumes_from: - - tmp + container_name: vissv2server + depends_on: + - redis + - iotdb-service + restart: on-failure:3 + build: + context: ../cdsp/vissr # context set to repo root + dockerfile: Dockerfile.rlserver + target: vissv2server + entrypoint: [ /app/vissv2server,-s,apache-iotdb] + ports: + - "0.0.0.0:8081:8081" + - "127.0.0.1:8888:8888" + - "0.0.0.0:8887:8887" + - "0.0.0.0:8600:8600" + volumes: + - ./logs/vssr:/app/logs + volumes_from: + - tmp diff --git a/docker/start_docker.sh b/docker/start_docker.sh new file mode 100644 index 0000000..e69de29 From 7f1ae371f5286530d8dc5d612880bfd21d171f6b Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Fri, 6 Sep 2024 16:45:06 +0200 Subject: [PATCH 26/39] Fixed doc typos Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/handlers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md index b81bd95..a2eb5f4 100644 --- a/cdsp/information-layer/handlers/README.md +++ b/cdsp/information-layer/handlers/README.md @@ -8,4 +8,4 @@ We support two different databases. For each of them is required to configurate > [!WARNING] > Before start working with any of them, ensure that the supported data points are correctly defined and configured. See [how](./handlers/config/README.md). -See [hier](../../information-layer/README.md) how to install and start the Websocket-Server. +See [here](../../information-layer/README.md) how to install and start the Websocket-Server. From 838af3fd046a460c746d4a53671078639d3baf83 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Fri, 13 Sep 2024 09:12:00 +0200 Subject: [PATCH 27/39] Remove unnecessary config files and add it as gitignore. Signed-off-by: Andre Wendel --- .gitignore | 1 + .vscode/settings.json | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 485dee6..d48c759 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +.vscode \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 96da0b8..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "pieces.cloudCapabilities": "Blended", - "pieces.telemetry": true -} From dfb873f314dcdd6caccbb5c81939cf0a8b418729 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Mon, 16 Sep 2024 11:34:47 +0200 Subject: [PATCH 28/39] Data transmission via websocket client in knowledge layer: - Update documentation and remove unused code. - Start the websocket client and update docuentation - Working synchronous calls - First running implementation of websocket_client Signed-off-by: Andre Wendel --- .gitignore | 3 + cdsp/knowledge-layer/.clang-format | 5 ++ cdsp/knowledge-layer/.gitignore | 2 + cdsp/knowledge-layer/CMakeLists.txt | 24 +++++ cdsp/knowledge-layer/README.md | 78 +++++++++++++++- .../connector/websocket-client/CMakeLists.txt | 11 +++ .../connector/websocket-client/README.md | 4 +- .../connector/websocket-client/main.cpp | 25 ++++++ .../websocket-client/websocket_client.cpp | 90 +++++++++++++++++++ .../websocket-client/websocket_client.hpp | 36 ++++++++ 10 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 cdsp/knowledge-layer/.clang-format create mode 100644 cdsp/knowledge-layer/.gitignore create mode 100644 cdsp/knowledge-layer/CMakeLists.txt create mode 100644 cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt create mode 100644 cdsp/knowledge-layer/connector/websocket-client/main.cpp create mode 100644 cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp create mode 100644 cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp diff --git a/.gitignore b/.gitignore index d48c759..2db98af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ +# IntelliJ Settings .idea + +# VSCode Settings .vscode \ No newline at end of file diff --git a/cdsp/knowledge-layer/.clang-format b/cdsp/knowledge-layer/.clang-format new file mode 100644 index 0000000..88980f1 --- /dev/null +++ b/cdsp/knowledge-layer/.clang-format @@ -0,0 +1,5 @@ +BasedOnStyle: Google +IndentWidth: 4 +ColumnLimit: 100 +AllowShortIfStatementsOnASingleLine: false +SpaceAfterCStyleCast: true diff --git a/cdsp/knowledge-layer/.gitignore b/cdsp/knowledge-layer/.gitignore new file mode 100644 index 0000000..961e9ce --- /dev/null +++ b/cdsp/knowledge-layer/.gitignore @@ -0,0 +1,2 @@ +# CMake build folder +build/ \ No newline at end of file diff --git a/cdsp/knowledge-layer/CMakeLists.txt b/cdsp/knowledge-layer/CMakeLists.txt new file mode 100644 index 0000000..f4e70f8 --- /dev/null +++ b/cdsp/knowledge-layer/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.10) + +project(knowledge-layer) + +# C++ standard +set(CMAKE_CXX_STANDARD 17) + +# Find Boost libraries +find_package(Boost 1.86.0 REQUIRED COMPONENTS system filesystem thread) + +# FetchContent to include nlohmann/json +include(FetchContent) +FetchContent_Declare( + json + GIT_REPOSITORY https://github.com/nlohmann/json.git + GIT_TAG v3.11.3 +) +FetchContent_MakeAvailable(json) + +# Output directory for the executable +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# Add subdirectory for the websocket-client +add_subdirectory(connector/websocket-client) \ No newline at end of file diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index fd9e641..f5f9d02 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -1 +1,77 @@ -tbd \ No newline at end of file +# Knowledge Layer - WebSocket Client + +This project contains a WebSocket client built in C++17, which communicates with a WebSocket server. The client can send and receive JSON messages using Boost libraries. + +## Prerequisites + +Before setting up the project, make sure you have the following installed: + +- **CMake** (version 3.10 or higher) +- **Boost** (version 1.86.0 or higher) +- **g++/clang++** with C++17 support +- **Homebrew** (for macOS users) +- A WebSocket server to connect to, see how to start the **information-layer** Websocket server [here](../information-layer/README.md) + +### Installing Dependencies + +1. **Installing Boost (macOS/Linux)**: + If you're on macOS, you can install Boost using Homebrew: + + ```bash + brew install boost + ``` + + For Linux, you can install Boost using your package manager, or build from source: + + ```bash + sudo apt-get install libboost-all-dev + ``` + +2. **Install CMake**: + Ensure you have CMake installed: + + ```bash + brew install cmake # For macOS + sudo apt-get install cmake # For Linux + ``` + +## Project Setup + +**Build the WebSocket Client**: + + The WebSocket client is located in the `connector/websocket-client/` directory. To build it from this directory: + + ```bash + # Create a build directory + mkdir -p build + cd build + + # Run CMake to generate build files + cmake .. + + # Build the project + make + ``` + + If the build is successful, the WebSocket client executable will be generated in the `build/bin/` directory. + +## Running the WebSocket Client + +### Environment Variables + +The project expects two environment variables for the WebSocket server’s host and port. By default, the websocket client uses the `information-layer` (host: localhost, port: 8080). See how to configure them [here](../information-layer/README.md). You can use a custom websocket server configuration adding the following ENV variables in `/docker/.env` file: + +```text +################################## +# WEBSOCKET-SERVER CONFIGURATION # +################################## +HOST_WEBSOCKET_SERVER="your_custom_host" +PORT_WEBSOCKET_SERVER="your_custom_port" +``` + +### Start the Websocket Client +After successfully building the client, you can run it with the following command: + +```bash +./build/bin/websocket_client +``` diff --git a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt new file mode 100644 index 0000000..0737b5d --- /dev/null +++ b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt @@ -0,0 +1,11 @@ +# Define the WebSocket client target +add_executable(websocket_client main.cpp websocket_client.cpp) + +# Link Boost libraries +target_link_libraries(websocket_client Boost::system Boost::filesystem Boost::thread) + +# Link nlohmann/json +target_link_libraries(websocket_client nlohmann_json::nlohmann_json) + +# Use defined output directory for the executable +set_target_properties(websocket_client PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/README.md b/cdsp/knowledge-layer/connector/websocket-client/README.md index fd9e641..17efc5b 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/README.md +++ b/cdsp/knowledge-layer/connector/websocket-client/README.md @@ -1 +1,3 @@ -tbd \ No newline at end of file +# Websocket-Client + +This project starts a [WebSocket client](main.cpp) that connects to a WebSocket server, sends JSON messages, and handles incoming responses. The client dynamically reads the server’s host and port from the environment variables or falls back to default values if none are provided. diff --git a/cdsp/knowledge-layer/connector/websocket-client/main.cpp b/cdsp/knowledge-layer/connector/websocket-client/main.cpp new file mode 100644 index 0000000..134c25e --- /dev/null +++ b/cdsp/knowledge-layer/connector/websocket-client/main.cpp @@ -0,0 +1,25 @@ +#include +#include +#include + +#include "websocket_client.hpp" + +using json = nlohmann::json; + +std::string DefaultHostWebsocketServer{"127.0.0.1"}; +std::string DefaultPortWebSocketServer{"8080"}; + +int main() { + // Read the Websocket-Server HOST and PORT from the environment variables + const char* hostEnv = std::getenv("HOST_WEBSOCKET_SERVER"); + const char* portEnv = std::getenv("PORT_WEBSOCKET_SERVER"); + + std::string HostWebsocketServer = hostEnv ? hostEnv : DefaultHostWebsocketServer; + std::string PortWebSocketServer = portEnv ? portEnv : DefaultPortWebSocketServer; + + std::cout << "** Starting client! **" << std::endl; + auto client = std::make_shared(HostWebsocketServer, PortWebSocketServer); + client->run(); + + return 0; +} \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp new file mode 100644 index 0000000..fdb1b2c --- /dev/null +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp @@ -0,0 +1,90 @@ +#include "websocket_client.hpp" + +#include + +namespace { +void Fail(beast::error_code error_code, const std::string& what) { + std::cerr << what << ": " << error_code.message() << "\n"; +} + +// [WIP]: createTestMessage is used to test the first knowledge layer implementation. The +// subscription messaging should manage dynamically. +json createTestMessage() { + nlohmann::json message; + message["type"] = "subscribe"; + message["tree"] = "VSS"; + message["id"] = "WBY11CF080CH470711"; + message["uuid"] = "Some_UUID"; + return message; +} +} // namespace + +WebSocketClient::WebSocketClient(const std::string& host, const std::string& port) + : resolver_(io_context_), ws_(io_context_), server_uri_(host), server_port_(port) {} + +void WebSocketClient::run() { + resolver_.async_resolve( + server_uri_, server_port_, + beast::bind_front_handler(&WebSocketClient::onResolve, shared_from_this())); + + // Run the io_context to process asynchronous events + io_context_.run(); +} + +void WebSocketClient::onResolve(beast::error_code ec, tcp::resolver::results_type results) { + if (ec) { + return Fail(ec, "Resolve failed:"); + } + net::async_connect(ws_.next_layer(), results.begin(), results.end(), + beast::bind_front_handler(&WebSocketClient::onConnect, shared_from_this())); +} + +void WebSocketClient::onConnect(boost::system::error_code ec, + tcp::resolver::iterator /*end_point*/) { + if (ec) { + return Fail(ec, "Connection failed:"); + } + + ws_.async_handshake(server_uri_, "/", + beast::bind_front_handler(&WebSocketClient::handshake, shared_from_this())); +} + +void WebSocketClient::handshake(beast::error_code ec) { + if (ec) { + return Fail(ec, "Handshake failed:"); + } + std::cout << "Connected to WebSocket server: " << server_uri_ << std::endl; + json message = createTestMessage(); + sendMessage(message); +} + +void WebSocketClient::receiveMessage() { + ws_.async_read( + buffer_, beast::bind_front_handler(&WebSocketClient::onReceiveMessage, shared_from_this())); +} + +void WebSocketClient::onReceiveMessage(beast::error_code ec, std::size_t bytes_transferred) { + if (ec) { + return Fail(ec, "read"); + } + + std::string received_message = boost::beast::buffers_to_string(buffer_.data()); + json response = json::parse(received_message); + std::cout << "Received message: " << response.dump(4) << std::endl; + buffer_.consume(bytes_transferred); // Clear the buffer for the next message + receiveMessage(); // Continue receiving +} + +void WebSocketClient::sendMessage(const json& message) { + std::cout << "Sending message send:" << message.dump() << std::endl; + ws_.async_write(net::buffer(message.dump()), + beast::bind_front_handler(&WebSocketClient::onSendMessage, shared_from_this())); +} + +void WebSocketClient::onSendMessage(boost::system::error_code ec, std::size_t bytes_transferred) { + if (ec) { + return Fail(ec, "write"); + } + std::cout << "Message send! " << bytes_transferred << " bytes transferred" << std::endl; + receiveMessage(); +} \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp new file mode 100644 index 0000000..9eea1bd --- /dev/null +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include + +namespace beast = boost::beast; +namespace websocket = beast::websocket; +namespace net = boost::asio; +using tcp = net::ip::tcp; +using json = nlohmann::json; + +class WebSocketClient : public std::enable_shared_from_this { + public: + WebSocketClient(const std::string& host, const std::string& port); + void run(); + void sendMessage(const json& message); + + private: + void onResolve(beast::error_code error_code, tcp::resolver::results_type results); + void onConnect(boost::system::error_code error_code, tcp::resolver::iterator end_point); + void handshake(beast::error_code error_code); + void receiveMessage(); + void onReceiveMessage(beast::error_code error_code, std::size_t bytes_transferred); + void onSendMessage(boost::system::error_code ec, std::size_t bytes_transferred); + + private: + net::io_context io_context_; + websocket::stream ws_; + tcp::resolver resolver_; + beast::flat_buffer buffer_; + + std::string server_uri_; + std::string server_port_; +}; \ No newline at end of file From 28ec28b7216f02c4acfffca487392624be93beb5 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Mon, 16 Sep 2024 14:23:36 +0200 Subject: [PATCH 29/39] Documentation for new data source within information layer - Add README to add new data source in the information layer Signed-off-by: Andre Wendel --- cdsp/information-layer/handlers/README.md | 2 +- cdsp/information-layer/handlers/src/README.md | 108 ++++++++++++++++++ .../handlers/src/iotdb/README.md | 3 +- .../handlers/src/realmdb/README.md | 3 +- 4 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 cdsp/information-layer/handlers/src/README.md diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md index a2eb5f4..a2a20a0 100644 --- a/cdsp/information-layer/handlers/README.md +++ b/cdsp/information-layer/handlers/README.md @@ -1,6 +1,6 @@ # Handlers -We support two different databases. For each of them is required to configurate the corresponding ENV variables in `/docker/.env` file. +We support two different databases. For each of them is required to configure the corresponding ENV variables in `/docker/.env` file. - [IotDB](./src/iotdb/README.md) - [RealmDB](./src/realmdb/README.md) diff --git a/cdsp/information-layer/handlers/src/README.md b/cdsp/information-layer/handlers/src/README.md new file mode 100644 index 0000000..5a06db3 --- /dev/null +++ b/cdsp/information-layer/handlers/src/README.md @@ -0,0 +1,108 @@ +# Database handlers + +This project already contains handlers configured to be use with RealmDB and IoTDB. + +## Adding a New Database Handler + +This project uses a handler interface to dynamically integrate new database backends such as RealmDB or IoTDB. Each handler must implement the core functionality to handle WebSocket messages (read, write, subscribe, unsubscribe). + +### How to Add a New Database Handler + +1. **Create a new handler class**: + Create a new file for your database handler (e.g., `mydb-handler.js`) in the `./mydb/src` directory. This handler should extend the base `Handler` class from [handler.js](./handler.js). + +2. **Implement the handler methods**: + You must implement the following methods in your new handler: + - `authenticateAndConnect(sendMessageToClients)`: Establish a connection with the database and authenticate. + - `read(message, ws)`: Retrieve data from the database based on the incoming WebSocket message. + - `write(message, ws)`: Write data to the database. + - `subscribe(message, ws)`: Subscribe to changes in the database, and automatically send updates over WebSocket. + - `unsubscribe(message, ws)`: Unsubscribe from database updates. + +3. **Example Handler Implementation**: + Here’s a basic template you can follow: +```js +const Handler = require('../../handler'); + +class MyDBHandler extends Handler { +async authenticateAndConnect(sendMessageToClients) { + // Connect to your database here +} + +async read(message, ws) { + // Implement the logic to read data from the database +} + +async write(message, ws) { + // Implement the logic to write data to the database +} + +async subscribe(message, ws) { + // Implement the logic to subscribe to updates from the database +} + +async unsubscribe(message, ws) { + // Implement the logic to unsubscribe from updates +} +} + +module.exports = MyDBHandler; +``` + +4. **Create configuration files**: + Create the the configuration files into `./mydb/config` to include parameters for your new database (e.g., database names, data schemas, etc.). +> [!IMPORTANT] +> Ensure to create the necessary files to support the necessary data points that will be store in the DB and required for your clients. See [how](../config/README.md). + +5. **Work with the Handler**: + + Create (if it does not exist) `/docker/.env` and add the following environment variables, replacing the values with yours: + +```sh +######################### +# GENERAL CONFIGURATION # +######################### + +# HANDLER_TYPE define the database to initialize +HANDLER_TYPE=mydb +# DATA_POINTS_SCHEMA_FILE is the YAML or JSON file containing all data points supported. See the ../../config/README.md for more information. +DATA_POINTS_SCHEMA_FILE=vss_data_points.yaml +######################### +# MYDB CONFIGURATION # +######################### + +# Other variables are optional, they will not be committed. You can define custom variables like API Keys or secrets. +OPTIONAL_CUSTOM_VARIABLES="value" +``` + +> [!WARNING] +> Do not commit this file to GitHub! + +In order to work with your custom database handler, it is required to initialize it in the [websocket-server.js](../../router/src/websocket-server.js). + +```js +switch (handlerType) { + case "realmdb": + handler = new RealmDBHandler(); + break; + case "iotdb": + handler = new IoTDBHandler(); + break; + // define the new MyDBhandler object. + case "mydb": + handler = new MyDBHandler(); + break; + default: + throw new Error("Unsupported handler type"); +} +``` + +Run the WebSocket server, and connect with your handler by sending WebSocket messages to test reading, writing, and subscribing functionalities. The handler should be started by the DB-Router like described [here](../../README.md). + +### Existing Handlers + +You can check the following examples to understand how to structure your new handler: +- **RealmDB Handler**: [RealmHandler](./realmdb/src/realmdb-handler.js) provides an example of how to interact with RealmDB. +- **IoTDB Handler**: A similar implementation can be followed for [IoTDBHandler](./iotdb/src/iotdb-handler.js) . + +For additional logging, you can utilize the `logMessage` function from [logger.js](../../utils/logger.js). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/src/iotdb/README.md b/cdsp/information-layer/handlers/src/iotdb/README.md index 097c1b8..88dc13f 100644 --- a/cdsp/information-layer/handlers/src/iotdb/README.md +++ b/cdsp/information-layer/handlers/src/iotdb/README.md @@ -40,7 +40,8 @@ Create (if it does not exist) `/docker/.env` and add the following environment v FETCH_SIZE=10000 #number of rows that will be fetched from the database at a time when executing a query, default 10000 ``` -> **_IMPORTANT:_** Do not commit this file to GitHub! +> [!WARNING] +> Do not commit this file to GitHub! ## Starting the IoTDB handler diff --git a/cdsp/information-layer/handlers/src/realmdb/README.md b/cdsp/information-layer/handlers/src/realmdb/README.md index 013dee7..8eefddb 100644 --- a/cdsp/information-layer/handlers/src/realmdb/README.md +++ b/cdsp/information-layer/handlers/src/realmdb/README.md @@ -45,7 +45,8 @@ Create (if it does not exist) `/docker/.env` and add the following environment v REALMDB_API_KEY="your-api-key" ``` -> **_IMPORTANT:_** Do not commit this file to GitHub! +> [!WARNING] +> Do not commit this file to GitHub! ## Starting the RealmDB handler From b84a37e28c948df5faa3230ac8553c78d7c47985 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Mon, 16 Sep 2024 15:12:47 +0200 Subject: [PATCH 30/39] Handle and send error message within information layer for websocket connection. Signed-off-by: Andre Wendel --- cdsp/information-layer/README.md | 42 ++- .../information-layer/handlers/src/handler.js | 54 ++- .../handlers/src/iotdb/src/iotdb-handler.js | 182 ++++++---- .../src/realmdb/src/realmdb-handler.js | 326 +++++++++++------- .../router/src/websocket-server.js | 12 +- .../router/utils/message-validator.js | 96 +++++- .../utils/error-message-helper.js | 12 + 7 files changed, 506 insertions(+), 218 deletions(-) create mode 100644 cdsp/information-layer/utils/error-message-helper.js diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index ab73937..bbeab11 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -133,7 +133,7 @@ $ HANDLER_TYPE=iotdb IOTDB_HOST=localhost [ENV_VARIABLE_NAME required_env_variab ## Look out for the Websocket Server message in the console -If the handler is running and you are [subscribed](#subscribing-to-changes) to an element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: +If the handler is running, and you are [subscribed](#subscribing-to-changes) to an element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: ```json { @@ -146,6 +146,16 @@ If the handler is running and you are [subscribed](#subscribing-to-changes) to a } ``` +If the handler response with some error during any request, the client may get error response similar to this (with the same format): + +```json +{ + "type": ":status", + "errorCode": 404, + "error": "" +} +``` + # Connect your own Websocket Client Connect your own websocket client by connecting to `ws://localhost:8080` @@ -232,11 +242,23 @@ To subscribe to changes in a specific object, send a message with the type of re "type": "subscribe", "tree": "VSS", "id": "", - "uuid": "SOME_UUID" + "uuid": "" } ``` -### Subscribing to changes +If the subscription succeed, the server will respond with the following message: + +```json +{ + "type": "subscribe:status", + "tree": "VSS", + "id": "", + "dateTime": "2024-09-12T15:50:17.232Z", + "uuid": "", + "status": "succeed" +} +``` +### Unsubscribing to changes To unsubscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): @@ -245,6 +267,18 @@ To unsubscribe to changes in a specific object, send a message with the type of "type": "unsubscribe", "tree": "VSS", "id": "", - "uuid": "SOME_UUID" + "uuid": "" +} +``` +If the unsubscription succeed, the server will respond with the following message: +```json +{ + "type": "unsubscribe:status", + "tree": "VSS", + "id": "WBY11CF080CH470711", + "dateTime": "2024-09-12T17:40:00.754Z", + "uuid": "CLIENT_1_SUBS", + "status": "succeed" } ``` + diff --git a/cdsp/information-layer/handlers/src/handler.js b/cdsp/information-layer/handlers/src/handler.js index 155af45..303c044 100644 --- a/cdsp/information-layer/handlers/src/handler.js +++ b/cdsp/information-layer/handlers/src/handler.js @@ -130,13 +130,32 @@ class Handler { return newMessage; } + /** + * Generic function to create or remove a subscription message. + * @param {{"subscribe", "unsubscribe"}} type - Type of subscription message. + * @param {Object} message - The original message from client. + * @param {String} status - The status of the subscription. + * @returns {Object} - The transformed message. + */ + _createSubscribeMessage(type, message, status) { + const { id, tree, uuid } = message; + return { + type: `${type}:status`, + tree, + id, + dateTime: new Date().toISOString(), + uuid, + status: status, + }; + } + /** * Transforms a message node by replacing all dots with underscores. * * @param {string} node - The message node to transform. * @returns {string} - The transformed message node with dots replaced by underscores. */ - _transformDatapointsWithUnderscores(node) { + _transformDataPointsWithUnderscores(node) { return `${node}`.replace(/\./g, "_"); } @@ -165,13 +184,44 @@ class Handler { const supportedDataPoints = extractDataTypes(dataPointObj); let result = {}; Object.entries(supportedDataPoints).forEach(([node, value]) => { - const underscored_node = this._transformDatapointsWithUnderscores(node); + const underscored_node = this._transformDataPointsWithUnderscores(node); if (value !== null) { result[underscored_node] = value; } }); return result; } + + /** + * Validates nodes against a given schema. + * + * @param {Object} message - The message containing nodes to be validated. + * @param {Object} dataPointsSchema - The schema against which nodes are validated. + * @returns {Object|null} An object containing error details if validation fails, otherwise null. + */ + _validateNodesAgainstSchema(message, dataPointsSchema) { + const { type } = message; + let nodes = message.node ? [message.node] : message.nodes; + + // Check if all nodes are valid based on the schema + const unknownFields = nodes.filter(({ name }) => { + const transformedName = this._transformDataPointsWithUnderscores(name); + return !dataPointsSchema.hasOwnProperty(transformedName); + }); + + if (unknownFields.length > 0) { + let errors = unknownFields.map(({ name }) => ({ + name: name, + status: "Parent object or node not found.", + })); + + const errorData = + errors.length === 1 ? { node: errors.at(0) } : { nodes: errors }; + + return errorData; + } + return null; + } } module.exports = Handler; diff --git a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js index 4f5a8d2..b7aa035 100644 --- a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js +++ b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js @@ -18,6 +18,9 @@ const { MessageType, COLORS, } = require("../../../../utils/logger"); +const { + createErrorMessage, +} = require("../../../../utils/error-message-helper"); class IoTDBHandler extends Handler { constructor() { @@ -68,81 +71,95 @@ class IoTDBHandler extends Handler { } async read(message, ws) { - try { - await this.#openSessionIfNeeded(); - const responseNodes = await this.#queryLastFields(message, ws); - if (responseNodes.length > 0) { - const responseMessage = this._createUpdateMessage( - message, - responseNodes, + if (this.#areNodesValid(message, ws)) { + try { + await this.#openSessionIfNeeded(); + const responseNodes = await this.#queryLastFields(message, ws); + if (responseNodes.length > 0) { + const responseMessage = this._createUpdateMessage( + message, + responseNodes, + ); + this._sendMessageToClient(ws, responseMessage); + } else { + this._sendMessageToClient( + ws, + createErrorMessage( + "read", + 404, + `No data found with the Id: ${message.id}`, + ), + ); + } + } catch (error) { + this._sendMessageToClient( + ws, + createErrorMessage("read", 404, error.message), ); - this._sendMessageToClient(ws, responseMessage); - } else { - this._sendMessageToClient(ws, { error: "Object not found." }); + } finally { + await this.#closeSessionIfNeeded(); } - } catch (error) { - this._sendMessageToClient(ws, { error: "Error reading object" }); - } finally { - await this.#closeSessionIfNeeded(); } } async write(message, ws) { - try { - await this.#openSessionIfNeeded(); - const data = this.#createObjectToInsert(message); - const errorUndefinedTypes = []; - let measurements = []; - let dataTypes = []; - let values = []; - - for (const [key, value] of Object.entries(data)) { - if (this.dataPointsSchema.hasOwnProperty(key)) { + if (this.#areNodesValid(message, ws)) { + try { + await this.#openSessionIfNeeded(); + const data = this.#createObjectToInsert(message); + let measurements = []; + let dataTypes = []; + let values = []; + + for (const [key, value] of Object.entries(data)) { measurements.push(key); dataTypes.push(this.dataPointsSchema[key]); values.push(value); - } else { - errorUndefinedTypes.push(`The data point "${key}" is not supported`); } - } - - if (errorUndefinedTypes.length) { - errorUndefinedTypes.forEach((error) => console.error(error)); - throw new Error("One or more data points are not supported."); - } - const timestamp = new Date().getTime(); - const deviceId = databaseParams[message.tree].databaseName; - const status = await this.#insertRecord( - deviceId, - timestamp, - measurements, - dataTypes, - values, - ); + const timestamp = new Date().getTime(); + const deviceId = databaseParams[message.tree].databaseName; + const status = await this.#insertRecord( + deviceId, + timestamp, + measurements, + dataTypes, + values, + ); - logWithColor( - `Record inserted to device ${deviceId}, status code: `.concat( - JSON.stringify(status), - ), - COLORS.GREY, - ); + logWithColor( + `Record inserted to device ${deviceId}, status code: `.concat( + JSON.stringify(status), + ), + COLORS.GREY, + ); - const responseNodes = await this.#queryLastFields(message, ws); + const responseNodes = await this.#queryLastFields(message, ws); - if (responseNodes.length) { - const responseMessage = this._createUpdateMessage( - message, - responseNodes, + if (responseNodes.length) { + const responseMessage = this._createUpdateMessage( + message, + responseNodes, + ); + this._sendMessageToClient(ws, responseMessage); + } else { + this._sendMessageToClient( + ws, + createErrorMessage( + "write", + 404, + `No data found with the Id: ${message.id}`, + ), + ); + } + } catch (error) { + this._sendMessageToClient( + ws, + createErrorMessage("write", 503, `Failed writing data. ${error}`), ); - this._sendMessageToClient(ws, responseMessage); - } else { - this._sendMessageToClient(ws, { error: "Object not found." }); + } finally { + await this.#closeSessionIfNeeded(); } - } catch (error) { - this._sendMessageToClient(ws, { error: `Failed writing data. ${error}` }); - } finally { - await this.#closeSessionIfNeeded(); } } @@ -231,6 +248,36 @@ class IoTDBHandler extends Handler { } } + /** + * Validates the nodes in a message against the schema of a media element. + * + * @param {Object} message - The message object containing details for the request. + * @param {WebSocket} ws - The WebSocket object for communication. + * @returns {boolean} - Returns true if all nodes are valid against the schema, otherwise false. + */ + #areNodesValid(message, ws) { + const { type } = message; + + const errorData = this._validateNodesAgainstSchema( + message, + this.dataPointsSchema, + ); + + if (errorData) { + logMessage( + `Error validating message nodes against schema: ${JSON.stringify(errorData)}`, + MessageType.ERROR, + ); + this._sendMessageToClient( + ws, + createErrorMessage(`${type}`, 404, errorData), + ); + + return false; + } + return true; + } + /** * Executes a SQL query statement asynchronously. * @@ -360,7 +407,7 @@ class IoTDBHandler extends Handler { ); Object.entries(transformedObject).forEach(([key, value]) => { - if (value !== null) { + if (value !== null && !isNaN(value)) { latestValues[key] = value; } }); @@ -371,9 +418,10 @@ class IoTDBHandler extends Handler { value, })); } catch (error) { - this._sendMessageToClient(ws, { - error: "internal error constructing read object", - }); + this._sendMessageToClient( + ws, + createErrorMessage("read", 503, error.message), + ); } } @@ -391,11 +439,11 @@ class IoTDBHandler extends Handler { if (message.node) { dataPoints.push( - this._transformDatapointsWithUnderscores(message.node.name), + this._transformDataPointsWithUnderscores(message.node.name), ); } else if (message.nodes) { dataPoints = message.nodes.map((node) => - this._transformDatapointsWithUnderscores(node.name), + this._transformDataPointsWithUnderscores(node.name), ); } return dataPoints; @@ -411,11 +459,11 @@ class IoTDBHandler extends Handler { const { id, tree } = message; const data = { [databaseParams[tree].dataPointId]: id }; if (message.node) { - data[this._transformDatapointsWithUnderscores(message.node.name)] = + data[this._transformDataPointsWithUnderscores(message.node.name)] = message.node.value; } else if (message.nodes) { message.nodes.forEach((node) => { - data[this._transformDatapointsWithUnderscores(node.name)] = node.value; + data[this._transformDataPointsWithUnderscores(node.name)] = node.value; }); } return data; diff --git a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js index 17c3c7e..0ff5e83 100644 --- a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js +++ b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js @@ -12,6 +12,9 @@ const { MessageType, COLORS, } = require("../../../../utils/logger"); +const { + createErrorMessage, +} = require("../../../../utils/error-message-helper"); /** * Parses the response from a media element change event. @@ -70,62 +73,67 @@ class RealmDBHandler extends Handler { } async read(message, ws) { - try { - const updateMessage = await this.#getMessageData(message, ws); - this._sendMessageToClient(ws, updateMessage); - } catch (error) { - logMessage( - "Error reading object from Realm: ".concat(error), - MessageType.ERROR, - ); - this._sendMessageToClient(ws, { error: "Error reading object" }); + if (this.#areNodesValid(message, ws)) { + try { + const updateMessage = await this.#getMessageData(message); + this._sendMessageToClient(ws, updateMessage); + } catch (error) { + logMessage( + `Error reading object from Realm: ${error.message}`, + MessageType.ERROR, + ); + this._sendMessageToClient( + ws, + createErrorMessage("read", 404, JSON.parse(error.message)), + ); + } } } async write(message, ws) { - try { - const mediaElement = await this.#getMediaElement(message, ws); - let nodes = message.node ? [message.node] : message.nodes; - const dataPoints = []; + if (this.#areNodesValid(message, ws)) { + try { + const mediaElement = await this.#getMediaElement(message); + const nodes = message.node ? [message.node] : message.nodes; - if (mediaElement) { - this.realm.write(() => { + const transformAndAssign = (element, nodes) => { nodes.forEach(({ name, value }) => { - const prop = this._transformDatapointsWithUnderscores(name); - dataPoints.push(name); - mediaElement[prop] = value; + const prop = this._transformDataPointsWithUnderscores(name); + element[prop] = value; }); - }); - } else { - const dataPointId = mediaElementsParams[message.tree].dataPointId; - let document = { _id: uuidv4(), [dataPointId]: message.id }; - - nodes.forEach(({ name, value }) => { - const prop = this._transformDatapointsWithUnderscores(name); - dataPoints.push(name); - document[prop] = value; - }); - const databaseName = mediaElementsParams[message.tree].databaseName; + }; this.realm.write(() => { - this.realm.create(databaseName, document); + if (mediaElement) { + // Write on existing media element + transformAndAssign(mediaElement, nodes); + } else { + // Create a new media element + const dataPointId = mediaElementsParams[message.tree].dataPointId; + const document = { _id: uuidv4(), [dataPointId]: message.id }; + transformAndAssign(document, nodes); + const databaseName = mediaElementsParams[message.tree].databaseName; + this.realm.create(databaseName, document); + } }); - } - const updateMessage = await this.#getMessageData(message, ws); - this._sendMessageToClient(ws, updateMessage); - } catch (error) { - logMessage( - "Error writing object changes in Realm: ".concat(error), - MessageType.ERROR, - ); - this._sendMessageToClient(ws, { error: "Error writing object changes" }); + // Read the updated media element + await this.read(message, ws); + } catch (error) { + const errorMessage = `Schema is not compatible for that media element: ${error.message}`; + logMessage(errorMessage, MessageType.ERROR); + this._sendMessageToClient( + ws, + createErrorMessage("write", 404, errorMessage), + ); + } } } async subscribe(message, ws) { try { - const mediaElement = await this.#getMediaElement(message, ws); + const mediaElement = await this.#getMediaElement(message); + if (mediaElement) { const objectId = mediaElement._id; const { id, tree, uuid } = message; @@ -141,58 +149,61 @@ class RealmDBHandler extends Handler { COLORS.GREY, ); - const mediaElementToSubscribe = await this.realm.objectForPrimaryKey( - databaseName, - objectId, + const listener = (mediaElement, changes) => + this.#onMediaElementChange( + mediaElement, + changes, + { + id: id, + tree: tree, + uuid: uuid, + }, + ws, + ); + + mediaElement.addListener(listener); + + // Store the listener so we can remove it later + this.listeners.get(ws).set(id, { + objectId: objectId, + mediaElement: mediaElement, + listener: listener, + }); + + this._sendMessageToClient( + ws, + this._createSubscribeMessage("subscribe", message, "succeed"), ); - if (mediaElementToSubscribe) { - const listener = (mediaElementToSubscribe, changes) => - this.#onMediaElementChange( - mediaElementToSubscribe, - changes, - { - id: id, - tree: tree, - uuid: uuid, - }, - ws, - ); - - mediaElementToSubscribe.addListener(listener); - - // Store the listener so we can remove it later - this.listeners.get(ws).set(id, { - objectId: objectId, - mediaElement: mediaElementToSubscribe, - listener: listener, - }); - - this._sendMessageToClient(ws, { - success: `Subscribed to ${dataPointId}: '${id}'`, - }); - - logWithColor( - `Subscription added! Amount Clients: ${this.listeners.size}`, - COLORS.GREY, - ); - } else { - this._sendMessageToClient(ws, { - error: "Object could not be subscribed", - }); - } + logWithColor( + `Subscription added! Amount Clients: ${this.listeners.size}`, + COLORS.GREY, + ); } else { - this._sendMessageToClient(ws, { - success: `Subscription was already done to ${dataPointId}: '${id}'`, - }); + this._sendMessageToClient( + ws, + createErrorMessage( + "subscribe", + 400, + `Subscription already done to ${dataPointId}: '${id}'`, + ), + ); } } else { - this._sendMessageToClient(ws, { error: "Object not found" }); + this._sendMessageToClient( + ws, + createErrorMessage("subscribe", 400, "Object not found"), + ); } } catch (error) { - this._sendMessageToClient(ws, { - error: "Error subscribing to object changes", - }); + this._sendMessageToClient( + ws, + createErrorMessage( + "subscribe", + 503, + "Subscription process could not finish, try again", + ), + ); } } @@ -215,18 +226,29 @@ class RealmDBHandler extends Handler { this.listeners.delete(ws); } - this._sendMessageToClient(ws, { - success: `Unsubscribed to ${dataPointId}: '${id}'`, - }); + this._sendMessageToClient( + ws, + this._createSubscribeMessage("unsubscribe", message, "succeed"), + ); } else { - this._sendMessageToClient(ws, { - error: `No subscription found for VIN: ${id}`, - }); + this._sendMessageToClient( + ws, + createErrorMessage( + "unsubscribe", + 400, + `No subscription found for VIN: ${id}`, + ), + ); } } else { - this._sendMessageToClient(ws, { - error: `No subscription found for VIN: ${id}`, - }); + this._sendMessageToClient( + ws, + createErrorMessage( + "unsubscribe", + 400, + `No subscription found for this client`, + ), + ); } logWithColor( `Subscription removed! Amount Clients: ${this.listeners.size}`, @@ -243,35 +265,94 @@ class RealmDBHandler extends Handler { } /** - * Asynchronously retrieves media element, processes it, and creates an updated message. + * Validates the nodes in a message against the schema of a media element. * - * @param {Object} message - The message object containing the data to be processed. - * @param {WebSocket} ws - The WebSocket connection used for communication. - * @returns {Promise} - A promise that resolves to the updated message object. + * @param {Object} message - The message object containing details for the request. + * @param {WebSocket} ws - The WebSocket object for communication. + * @returns {boolean} - Returns true if all nodes are valid against the schema, otherwise false. + */ + #areNodesValid(message, ws) { + const { type, tree } = message; + const { databaseName } = mediaElementsParams[tree]; + + // Get the schema for the mediaElement to check if fields are valid + const mediaElementSchema = this.realm.schema.find( + (schema) => schema.name === databaseName, + ); + + const errorData = this._validateNodesAgainstSchema( + message, + mediaElementSchema.properties, + ); + + if (errorData) { + logMessage( + `Error validating message nodes against schema: ${JSON.stringify(errorData)}`, + MessageType.ERROR, + ); + this._sendMessageToClient( + ws, + createErrorMessage(`${type}`, 404, errorData), + ); + + return false; + } + return true; + } + + /** + * Asynchronously processes a message to fetch and handle media data. + * + * @param {Object} message - The message object containing details for the request. + * @returns {Promise} - Returns a promise that resolves to an updated message object. + * @throws {Error} - Throws an error if no media element for the message ID is found. * @private */ - async #getMessageData(message, ws) { - const mediaElement = await this.#getMediaElement(message, ws); + async #getMessageData(message) { + const mediaElement = await this.#getMediaElement(message); + + if (!mediaElement) { + throw new Error(`\"No data found with the Id: ${message.id}\"`); + } + logWithColor( `Media Element: \n ${JSON.stringify(mediaElement)}`, COLORS.GREY, ); - if (mediaElement) { - const responseNodes = this.#parseReadResponse(message, mediaElement); - return this._createUpdateMessage(message, responseNodes); - } else { - throw new Error(`No data found with the Id: ${message.id}`); - } + + const responseNodes = this.#parseReadResponse(message, mediaElement); + return this._createUpdateMessage(message, responseNodes); + } + + /** + * Parses the response from a read event. + * + * @param {Object} message - The message object containing node or nodes information. + * @param {Object} queryResponseObj - The query response object containing values to be mapped. + * @returns {Object} - A data object with keys from the message nodes and values from the query response. + * @private + */ + #parseReadResponse(message, queryResponseObj) { + const data = []; + const nodes = message.node ? [message.node] : message.nodes; + nodes.forEach((node) => { + const prop = this._transformDataPointsWithUnderscores(node.name); + data.push({ + name: node.name, + value: queryResponseObj[prop], + }); + }); + return data; } /** * Asynchronously retrieves a media element from the database based on the provided message. * * @param {Object} message - The message containing the id and tree information. - * @param {WebSocket} ws - The WebSocket connection to send error messages if needed. * @returns {Promise} - The media element object from the database. + * @private */ - async #getMediaElement(message, ws) { + async #getMediaElement(message) { try { const { id, tree } = message; const { databaseName, dataPointId } = mediaElementsParams[tree]; @@ -279,7 +360,10 @@ class RealmDBHandler extends Handler { .objects(databaseName) .filtered(`${dataPointId} = '${id}'`)[0]; } catch (error) { - this._sendMessageToClient(ws, { error: "Error reading object" }); + logMessage( + `Error trying to get media element from Realm: ${error.message}`, + MessageType.ERROR, + ); } } @@ -287,7 +371,9 @@ class RealmDBHandler extends Handler { * Handles changes to a media element and sends update messages to clients. * @param {mediaElement} mediaElement - The media element that has changed. * @param {object} changes - An object containing information about the changes. - * @param {messageHeader} messageHeader - The header information for the message. + * @param {{tree, id, uuid}} messageHeader - The header information for the message. + * @param {WebSocket} ws - The WebSocket object for communication. + * @private */ #onMediaElementChange(mediaElement, changes, messageHeader, ws) { logMessage( @@ -311,26 +397,6 @@ class RealmDBHandler extends Handler { } } } - - /** - * Parses the response from a read event. - * - * @param {Object} message - The message object containing node or nodes information. - * @param {Object} queryResponseObj - The query response object containing values to be mapped. - * @returns {Object} - A data object with keys from the message nodes and values from the query response. - */ - #parseReadResponse(message, queryResponseObj) { - const data = []; - const nodes = message.node ? [message.node] : message.nodes; - nodes.forEach((node) => { - const prop = this._transformDatapointsWithUnderscores(node.name); - data.push({ - name: node.name, - value: queryResponseObj[prop], - }); - }); - return data; - } } module.exports = RealmDBHandler; diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js index 8bf9c9e..64173b1 100644 --- a/cdsp/information-layer/router/src/websocket-server.js +++ b/cdsp/information-layer/router/src/websocket-server.js @@ -38,16 +38,16 @@ server.on("connection", (ws) => { ws.on("message", (message) => { logMessage(JSON.stringify(message), MessageType.RECEIVED); const validatedMessage = validateMessage(message); + if (validatedMessage instanceof Error) { logMessage( `Invalid message format: ${validatedMessage.message}`, - MessageType.ERROR, - ); - ws.send( - JSON.stringify({ - error: `Invalid message format`, - }), + MessageType.ERROR ); + + JSON.parse(validatedMessage.message).forEach((error) => { + ws.send(JSON.stringify(error)); + }); } else { handler.handleMessage(validatedMessage, ws); } diff --git a/cdsp/information-layer/router/utils/message-validator.js b/cdsp/information-layer/router/utils/message-validator.js index 8948273..ce7ee18 100644 --- a/cdsp/information-layer/router/utils/message-validator.js +++ b/cdsp/information-layer/router/utils/message-validator.js @@ -1,4 +1,6 @@ const Ajv = require("ajv"); +const { createErrorMessage } = require("../../utils/error-message-helper"); + const ajv = new Ajv({ allErrors: true, strict: true, @@ -7,6 +9,12 @@ const ajv = new Ajv({ const itemsHeader = ["type", "tree", "id", "uuid"]; +const standardError = createErrorMessage( + "messageValidation", + 400, + `Received an invalid message.`, +); + const createCommonStructure = (requestType) => ({ type: { type: "string", enum: [requestType] }, tree: { type: "string", enum: ["VSS"] }, @@ -105,9 +113,59 @@ const schemas = { }, }; +const customizeErrorMessage = (errors) => { + return errors.map((err) => { + switch (err.keyword) { + case "required": + return createErrorMessage( + "messageValidation", + 400, + `Missing required field: ${err.params.missingProperty}.`, + ); + case "type": + return createErrorMessage( + "messageValidation", + 400, + `Invalid type for field '${err.instancePath}': expected ${err.params.type}.`, + ); + case "enum": + if (err.instancePath === "/tree") { + return createErrorMessage( + "messageValidation", + 404, + `Unsupported message 'tree': must be one of ${err.params.allowedValues.join(", ")}`, + ); + } else { + return standardError; + } + case "additionalProperties": + return createErrorMessage( + "messageValidation", + 404, + `Unsupported property '${err.params.additionalProperty}' found`, + ); + default: + return createErrorMessage( + "messageValidation", + 400, + `Validation error on field '${err.instancePath}': ${err.message}.`, + ); + } + }); +}; + +/** + * Validates a JSON message against predefined schemas. + * + * @param {string} message - The JSON message to be validated. + * @returns {Object|Error} - Returns the parsed message if valid, otherwise throws an error. + */ const validateMessage = (message) => { try { + // Try to parse the JSON message const parsedMessage = JSON.parse(message); + + // Determine the schema key based on the message type let schemaKey; switch (parsedMessage.type) { case "read": @@ -123,20 +181,40 @@ const validateMessage = (message) => { schemaKey = "unsubscribe"; break; default: - throw new Error(ajv.errorsText(validate.errors)); + const error = JSON.stringify([ + createErrorMessage( + "messageValidation", + 404, + `Unsupported message type (${parsedMessage.type})`, + ), + ]); + throw new Error(error); } - const schema = schemas[schemaKey]; - const validate = ajv.compile(schema); - const valid = validate(parsedMessage); + // Validate the parsed message against the schema + const validate = ajv.compile(schemas[schemaKey]); - if (valid) { - return parsedMessage; - } else { - throw new Error(ajv.errorsText(validate.errors)); + if (!validate(parsedMessage)) { + const customError = customizeErrorMessage(validate.errors); + throw new Error(JSON.stringify(customError)); } + return parsedMessage; } catch (error) { - return new Error(`Invalid JSON message: ${error.message}`); + if (error instanceof SyntaxError) { + // Handle JSON parsing error + + const error = JSON.stringify([ + createErrorMessage( + "messageValidation", + 404, + "The JSON format in the message is not valid.", + ), + ]); + return new Error(error); + } else { + // Handle other errors + return new Error(error.message); + } } }; diff --git a/cdsp/information-layer/utils/error-message-helper.js b/cdsp/information-layer/utils/error-message-helper.js new file mode 100644 index 0000000..9c0252b --- /dev/null +++ b/cdsp/information-layer/utils/error-message-helper.js @@ -0,0 +1,12 @@ +/** + * Creates an error message object. + * @param {string} type - The type of the error. + * @param {number} errorCode - The error code associated with the error. + * @param {string|Object} error - A descriptive error message. + * @returns {Object} An object containing the error details. + */ +function createErrorMessage(type, errorCode, error) { + return { type: `${type}:status`, errorCode, error }; +} + +module.exports = { createErrorMessage }; From 8614c90a812df3b0a8347e0346c7a531e720a288 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Thu, 26 Sep 2024 09:36:28 +0200 Subject: [PATCH 31/39] Vehicle data point knowledge layer configuration Implement functionality to read, validate, and integrate vehicle data points from a configuration file into the knowledge layer, ensuring only supported signals are processed by the system. Signed-off-by: Sebastian Schleemilch --- .../handlers/config/config.js | 4 +- cdsp/knowledge-layer/CMakeLists.txt | 6 + cdsp/knowledge-layer/README.md | 13 +- .../connector/utils/data_types.h | 67 ++++++ .../connector/utils/message_utils.cpp | 193 ++++++++++++++++++ .../connector/utils/message_utils.h | 32 +++ .../connector/websocket-client/CMakeLists.txt | 7 +- .../connector/websocket-client/main.cpp | 85 ++++++-- .../websocket-client/websocket_client.cpp | 106 +++++++--- ...ebsocket_client.hpp => websocket_client.h} | 17 +- .../examples/usecase-model/inputs/README.md | 11 + .../inputs/vss_data_required.txt | 7 + 12 files changed, 495 insertions(+), 53 deletions(-) create mode 100644 cdsp/knowledge-layer/connector/utils/data_types.h create mode 100644 cdsp/knowledge-layer/connector/utils/message_utils.cpp create mode 100644 cdsp/knowledge-layer/connector/utils/message_utils.h rename cdsp/knowledge-layer/connector/websocket-client/{websocket_client.hpp => websocket_client.h} (69%) create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt diff --git a/cdsp/information-layer/handlers/config/config.js b/cdsp/information-layer/handlers/config/config.js index 4313b06..7d942bc 100644 --- a/cdsp/information-layer/handlers/config/config.js +++ b/cdsp/information-layer/handlers/config/config.js @@ -30,8 +30,10 @@ const getEnvValue = (envVar) => { * @returns {string} The full path to the data points file. */ const getDataPointsPath = () => { + const endpoints_file = + getEnvValue("DATA_POINTS_SCHEMA_FILE") || ENDPOINTS_FILE; const rootPath = path.resolve(`${__dirname}/schema-files`); - return path.join(rootPath, ENDPOINTS_FILE); + return path.join(rootPath, endpoints_file); }; module.exports = { getDataPointsPath, getEnvValue }; diff --git a/cdsp/knowledge-layer/CMakeLists.txt b/cdsp/knowledge-layer/CMakeLists.txt index f4e70f8..6a44730 100644 --- a/cdsp/knowledge-layer/CMakeLists.txt +++ b/cdsp/knowledge-layer/CMakeLists.txt @@ -20,5 +20,11 @@ FetchContent_MakeAvailable(json) # Output directory for the executable set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +# Define the project root directory +set(PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}") + +# Pass the root directory to your C++ code +add_compile_definitions(PROJECT_ROOT="${PROJECT_ROOT_DIR}") + # Add subdirectory for the websocket-client add_subdirectory(connector/websocket-client) \ No newline at end of file diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index f5f9d02..36fc14b 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -59,14 +59,25 @@ Before setting up the project, make sure you have the following installed: ### Environment Variables -The project expects two environment variables for the WebSocket server’s host and port. By default, the websocket client uses the `information-layer` (host: localhost, port: 8080). See how to configure them [here](../information-layer/README.md). You can use a custom websocket server configuration adding the following ENV variables in `/docker/.env` file: +The project requires certain environment variables to work with the WebSocket server’s host and port. By default, the WebSocket client connects to the `information-layer`. See how to configure these variables [here](../information-layer/README.md). + + +- **HOST_WEBSOCKET_SERVER:** Specifies the hostname of the WebSocket server. The default is `localhost`. +- **PORT_WEBSOCKET_SERVER:** Specifies the port for connecting to the WebSocket server. The default is `8080`. +- **VIN:** The Vehicle Identification Number (VIN) is required to subscribe and retrieve information for a specific vehicle. Use the VIN configured in the [`information-layer`](../information-layer/README.md). +- **REQUIRED_VSS_DATA_POINTS_FILE:** The name of the TXT file containing all the required data points to start the application. See more details [here](symbolic-reasoner/examples/usecase-model/inputs/README.md). The default value is `vss_data_required.txt`. + +You can customize the WebSocket server configuration by adding the following environment variables in the `/docker/.env` file. Below is an example of what the file could look like: ```text ################################## # WEBSOCKET-SERVER CONFIGURATION # ################################## + HOST_WEBSOCKET_SERVER="your_custom_host" PORT_WEBSOCKET_SERVER="your_custom_port" +VIN="VIN_TO_SUBSCRIBE" +REQUIRED_VSS_DATA_POINTS_FILE=vss_data_required.txt ``` ### Start the Websocket Client diff --git a/cdsp/knowledge-layer/connector/utils/data_types.h b/cdsp/knowledge-layer/connector/utils/data_types.h new file mode 100644 index 0000000..f8baf06 --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/data_types.h @@ -0,0 +1,67 @@ +#ifndef DATA_TYPES_DATA_TYPES_H +#define DATA_TYPES_DATA_TYPES_H + +#include +#include +#include + +struct InitConfig { + std::string uuid; + std::string host_websocket_server; + std::string port_websocket_server; + std::string vin; + std::vector system_vss_data_points; +}; + +struct MessageHeader { + std::string id; + std::string type; + std::string tree; + std::string date_time; + std::string uuid; +}; + +struct Node { + std::string name; + std::string value; +}; + +struct DataMessage { + MessageHeader header; + std::vector nodes; +}; + +struct ErrorNode { + std::string name; + std::string status; +}; + +struct ErrorMessage { + std::string type; + std::variant> error; + int errorCode; +}; + +enum class MessageType { + READ, + WRITE, + SUBSCRIBE, + UNSUBSCRIBE, +}; + +inline std::string messageTypeToString(MessageType type) { + switch (type) { + case MessageType::READ: + return "read"; + case MessageType::WRITE: + return "write"; + case MessageType::SUBSCRIBE: + return "subscribe"; + case MessageType::UNSUBSCRIBE: + return "unsubscribe"; + default: + throw std::runtime_error("Unsupported message type"); + } +} + +#endif // DATA_TYPES_DATA_TYPES_H \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/utils/message_utils.cpp b/cdsp/knowledge-layer/connector/utils/message_utils.cpp new file mode 100644 index 0000000..d754113 --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/message_utils.cpp @@ -0,0 +1,193 @@ +#include "message_utils.h" + +/** + * @brief Creates a JSON message header with the specified parameters. + * + * @param type The type of the message. + * @param tree The tree identifier for the message. + * @param id The unique identifier for the message. + * @param uuid The unique identifier for the client. + * @return A JSON object containing the message header. + */ +json createMessageHeader(const MessageType& type, const std::string& tree, const std::string& id, + const std::string& uuid) { + json message_header; + message_header["type"] = messageTypeToString(type); + message_header["tree"] = tree; + message_header["id"] = id; + message_header["uuid"] = uuid; + return message_header; +} + +/** + * @brief Creates a subscription message and adds it to the reply messages queue. + * + * This function generates a subscription message header using the provided + * uuid and vin, and then appends this message to the reply messages queue. + * + * @param uuid Used as a client identifier. + * @param vin The vehicle identification number. + * @param reply_messages_queue A reference to the queue where the subscription message will be + * added. + */ +void createSubscription(const std::string& uuid, const std::string& vin, + std::vector& reply_messages_queue) { + reply_messages_queue.push_back(createMessageHeader(MessageType::SUBSCRIBE, "VSS", vin, uuid)); +} + +/** + * @brief Creates a read message and appends it to the reply messages queue. + * + * This function constructs a JSON message with a header and a list of data points, + * then appends the message to the provided reply messages queue. + * + * @param uuid The client identifier. + * @param tree The tree identifier for the message. + * @param vin The vehicle identification number. + * @param data_points A vector of data point names to be included in the message. + * @param reply_messages_queue A reference to the queue where the constructed message will be + * appended. + */ +void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& vin, + const std::vector& data_points, + std::vector& reply_messages_queue) { + auto message = createMessageHeader(MessageType::READ, tree, vin, uuid); + + json nodes = json::array(); + for (const auto& data_point : data_points) { + json node; + node["name"] = data_point; + nodes.push_back(node); + } + message["nodes"] = nodes; + reply_messages_queue.push_back(std::move(message)); +} + +/** + * @brief Parses a JSON message to extract error information and constructs an ErrorMessage object. + * + * This function handles the extraction of error details from a JSON message. The "error" field in + * the JSON message can either be a string or an object. If it is an object, it can contain either a + * single "node" or multiple "nodes". The function constructs the appropriate ErrorMessage object + * based on the content of the JSON message. + * + * @param json_message The JSON message containing error information. + * @return ErrorMessage The constructed ErrorMessage object containing the parsed error details. + */ +ErrorMessage parseErrorMessage(const json& json_message) { + ErrorMessage error_message; + + error_message.type = json_message["type"].get(); + error_message.errorCode = json_message["errorCode"].get(); + + // Handle the "error" field which could be either a string or an object + if (json_message["error"].is_string()) { + error_message.error = json_message["error"].get(); + } else if (json_message["error"].is_object()) { + const auto json_error = json_message["error"]; + if (json_error.contains("node")) { + ErrorNode error_node; + error_node.name = json_error["node"]["name"].get(); + error_node.status = json_error["node"]["status"].get(); + std::vector error_nodes = {error_node}; + error_message.error = error_nodes; + + } else if (json_error.contains("nodes")) { + std::vector error_nodes; + for (const auto& node_item : json_error["nodes"]) { + ErrorNode error_node; + error_node.name = node_item["name"].get(); + error_node.status = node_item["status"].get(); + error_nodes.push_back(error_node); + } + error_message.error = error_nodes; + } + } + + return error_message; +} + +/** + * @brief Converts a node value of a JSON object to its string representation. + * + * This function takes a JSON value of a node and converts it to a string based on its type. + * It supports string, floating-point number, integer, and unsigned integer types. + * If the JSON value is of an unsupported type, it throws a runtime error. + * + * @param json_value The JSON node value to be converted to a string. + * @return A string representation of the JSON value. + * @throws std::runtime_error If the JSON value is of an unsupported type. + */ +std::string nodeValueToString(const json& json_value) { + if (json_value.is_string()) { + return json_value.get(); + } else if (json_value.is_number_float()) { + return std::to_string(json_value.get()); + } else if (json_value.is_number_integer()) { + return std::to_string(json_value.get()); + } else if (json_value.is_number_unsigned()) { + return std::to_string(json_value.get()); + } + throw std::runtime_error("The message contains a node with an unsupported value."); +} + +/** + * @brief Parses a JSON message and constructs a DataMessage object. + * + * This function extracts the header information and node(s) from the provided JSON message + * and constructs a DataMessage object. The JSON message is expected to contain specific fields + * such as "id", "type", "tree", "dateTime", and "uuid" for the header. It may also contain either + * a single "node" or multiple "nodes". + * + * @param json_message The JSON message to be parsed. + * @return DataMessage The constructed DataMessage object containing the parsed data. + */ +DataMessage parseSuccessMessage(const json& json_message) { + MessageHeader header; + + header.id = json_message.at("id").get(); + header.type = json_message.at("type").get(); + header.tree = json_message.at("tree").get(); + header.date_time = json_message.at("dateTime").get(); + header.uuid = json_message.at("uuid").get(); + + DataMessage data_message; + + data_message.header = header; + if (json_message.contains("node")) { + Node node; + node.name = json_message["node"].at("name").get(); + node.value = nodeValueToString(json_message["node"].at("value")); + data_message.nodes.push_back(node); + } else if (json_message.contains("nodes")) { + for (const auto& node_item : json_message["nodes"]) { + Node node; + node.name = node_item.at("name").get(); + node.value = nodeValueToString(node_item.at("value")); + data_message.nodes.push_back(node); + } + } + + return data_message; +} + +/** + * @brief Parses and displays a JSON message, returning either a DataMessage or an ErrorMessage. + * + * This function takes a JSON string, parses it, and prints the parsed JSON to the standard output. + * Depending on the content of the JSON, it will return either a DataMessage or an ErrorMessage. + * + * @param message The JSON string to be parsed and displayed. + * @return std::variant The parsed message, which can be either a + * DataMessage or an ErrorMessage. + */ +std::variant displayAndParseMessage(const std::string& message) { + json json_message = json::parse(message); + std::cout << "Received message: " << json_message.dump() << std::endl << std::endl; + + if (json_message.contains("error")) { + return parseErrorMessage(json_message); + } + + return parseSuccessMessage(json_message); +} \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/utils/message_utils.h b/cdsp/knowledge-layer/connector/utils/message_utils.h new file mode 100644 index 0000000..e6a5c3f --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/message_utils.h @@ -0,0 +1,32 @@ +#ifndef MESSAGE_UTILS_H +#define MESSAGE_UTILS_H + +#include +#include +#include +#include +#include + +#include "data_types.h" + +using json = nlohmann::json; + +json createMessageHeader(const std::string& type, const std::string& tree, const std::string& id, + const std::string& uuid); + +void createSubscription(const std::string& uuid, const std::string& vin, + std::vector& reply_messages_queue); + +void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& vin, + const std::vector& data_points, + std::vector& reply_messages_queue); + +ErrorMessage parseErrorMessage(const json& json_message); + +std::string nodeValueToString(const json& json_value); + +DataMessage parseSuccessMessage(const json& json_message); + +std::variant displayAndParseMessage(const std::string& message); + +#endif // MESSAGE_UTILS_H \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt index 0737b5d..f9979ea 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt +++ b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt @@ -1,11 +1,10 @@ # Define the WebSocket client target -add_executable(websocket_client main.cpp websocket_client.cpp) +add_executable(websocket_client main.cpp websocket_client.cpp ../utils/message_utils.cpp) -# Link Boost libraries +# Link libraries target_link_libraries(websocket_client Boost::system Boost::filesystem Boost::thread) - -# Link nlohmann/json target_link_libraries(websocket_client nlohmann_json::nlohmann_json) +target_include_directories(websocket_client PRIVATE ${CMAKE_SOURCE_DIR}/connector/utils) # Use defined output directory for the executable set_target_properties(websocket_client PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/main.cpp b/cdsp/knowledge-layer/connector/websocket-client/main.cpp index 134c25e..a4c64b3 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/main.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/main.cpp @@ -1,25 +1,86 @@ +#include +#include +#include #include +#include #include #include -#include "websocket_client.hpp" +#include "data_types.h" +#include "websocket_client.h" using json = nlohmann::json; +boost::uuids::random_generator uuidGenerator; + std::string DefaultHostWebsocketServer{"127.0.0.1"}; std::string DefaultPortWebSocketServer{"8080"}; +std::string DefaultRequiredVSSDataPointsFile{"vss_data_required.txt"}; -int main() { - // Read the Websocket-Server HOST and PORT from the environment variables - const char* hostEnv = std::getenv("HOST_WEBSOCKET_SERVER"); - const char* portEnv = std::getenv("PORT_WEBSOCKET_SERVER"); +std::string getEnvVariable(const std::string& envVar, const std::string& defaultValue = "") { + const char* valueEnv = std::getenv(envVar.c_str()); + return valueEnv ? std::string(valueEnv) : defaultValue; +} - std::string HostWebsocketServer = hostEnv ? hostEnv : DefaultHostWebsocketServer; - std::string PortWebSocketServer = portEnv ? portEnv : DefaultPortWebSocketServer; +/** + * @brief Reads a file and returns a list of required data points. + * + * This function constructs the full path to the file using the provided file name + * and a predefined project root directory. It then reads the file line by line, + * storing each line as an element in a vector of strings. + * + * @param file_name The name of the file to read. + * @return A vector of strings, each representing a required data point from the file. + * @throws std::runtime_error if the file cannot be opened. + */ +std::vector getClientRequiredDataPoints(std::string file_name) { + std::vector required_data; + std::string root = + std::string(PROJECT_ROOT) + "/symbolic-reasoner/examples/usecase-model/inputs/" + file_name; + std::ifstream file(root); + if (!file) { + throw std::runtime_error("Invalid required Data Points file: " + file_name); + } + std::string line; + while (std::getline(file, line)) { + required_data.push_back(line); + } + return required_data; +} - std::cout << "** Starting client! **" << std::endl; - auto client = std::make_shared(HostWebsocketServer, PortWebSocketServer); - client->run(); +/** + * @brief Initializes and returns an InitConfig object with required configuration variables. + * + * This function creates an InitConfig instance and retrieving values + * from environment variables. If the environment variables are not set, + * default values are used. + * + * @return InitConfig The initialized configuration object. + * @throws std::runtime_error if there is a problem setting a variable. + */ +InitConfig AddInitConfig() { + InitConfig init_config; + init_config.host_websocket_server = + getEnvVariable("HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer); + init_config.port_websocket_server = + getEnvVariable("PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer); + init_config.uuid = boost::uuids::to_string(uuidGenerator()); + init_config.vin = getEnvVariable("VIN"); + init_config.system_vss_data_points = getClientRequiredDataPoints( + getEnvVariable("REQUIRED_VSS_DATA_POINTS_FILE", DefaultRequiredVSSDataPointsFile)); + return init_config; +} + +int main() { + try { + InitConfig init_config = AddInitConfig(); + std ::cout << "** Starting client! **" << std::endl; + auto client = std::make_shared(init_config); + client->run(); - return 0; -} \ No newline at end of file + return EXIT_SUCCESS; + } catch (const std::exception& e) { + std::cout << "Error: " << e.what() << std::endl; + return EXIT_FAILURE; + } +} diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp index fdb1b2c..b095cf0 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp @@ -1,30 +1,35 @@ -#include "websocket_client.hpp" +#include "websocket_client.h" #include +#include namespace { void Fail(beast::error_code error_code, const std::string& what) { std::cerr << what << ": " << error_code.message() << "\n"; } -// [WIP]: createTestMessage is used to test the first knowledge layer implementation. The -// subscription messaging should manage dynamically. -json createTestMessage() { - nlohmann::json message; - message["type"] = "subscribe"; - message["tree"] = "VSS"; - message["id"] = "WBY11CF080CH470711"; - message["uuid"] = "Some_UUID"; - return message; +std::string createLogErrorMessage(ErrorMessage& error) { + std::string errorDetails; + if (std::holds_alternative(error.error)) { + errorDetails = std::get(error.error); + } else { + const std::vector& nodes = std::get>(error.error); + for (const auto& node : nodes) { + errorDetails += "\n - Node: " + node.name + ": " + node.status; + } + } + + return "Received message with error code " + std::to_string(error.errorCode) + " - (" + + error.type + ") " + errorDetails; } } // namespace -WebSocketClient::WebSocketClient(const std::string& host, const std::string& port) - : resolver_(io_context_), ws_(io_context_), server_uri_(host), server_port_(port) {} +WebSocketClient::WebSocketClient(const InitConfig& init_config) + : resolver_(io_context_), ws_(io_context_), init_config_(init_config) {} void WebSocketClient::run() { resolver_.async_resolve( - server_uri_, server_port_, + init_config_.host_websocket_server, init_config_.port_websocket_server, beast::bind_front_handler(&WebSocketClient::onResolve, shared_from_this())); // Run the io_context to process asynchronous events @@ -45,7 +50,7 @@ void WebSocketClient::onConnect(boost::system::error_code ec, return Fail(ec, "Connection failed:"); } - ws_.async_handshake(server_uri_, "/", + ws_.async_handshake(init_config_.host_websocket_server, "/", beast::bind_front_handler(&WebSocketClient::handshake, shared_from_this())); } @@ -53,9 +58,28 @@ void WebSocketClient::handshake(beast::error_code ec) { if (ec) { return Fail(ec, "Handshake failed:"); } - std::cout << "Connected to WebSocket server: " << server_uri_ << std::endl; - json message = createTestMessage(); - sendMessage(message); + std::cout << "Connected to WebSocket server: " << init_config_.host_websocket_server + << std::endl + << std::endl; + + createSubscription(init_config_.uuid, init_config_.vin, reply_messages_queue_); + createReadMessage(init_config_.uuid, "VSS", init_config_.vin, + init_config_.system_vss_data_points, reply_messages_queue_); + writeReplyMessagesOnQueue(); +} + +void WebSocketClient::sendMessage(const json& message) { + ws_.async_write(net::buffer(message.dump()), + beast::bind_front_handler(&WebSocketClient::onSendMessage, shared_from_this())); +} + +void WebSocketClient::onSendMessage(boost::system::error_code ec, std::size_t bytes_transferred) { + if (ec) { + return Fail(ec, "write"); + } + std::cout << "Message send! " << bytes_transferred << " bytes transferred" << std::endl + << std::endl; + receiveMessage(); } void WebSocketClient::receiveMessage() { @@ -68,23 +92,43 @@ void WebSocketClient::onReceiveMessage(beast::error_code ec, std::size_t bytes_t return Fail(ec, "read"); } - std::string received_message = boost::beast::buffers_to_string(buffer_.data()); - json response = json::parse(received_message); - std::cout << "Received message: " << response.dump(4) << std::endl; + const auto received_message = + std::make_shared(boost::beast::buffers_to_string(buffer_.data())); buffer_.consume(bytes_transferred); // Clear the buffer for the next message - receiveMessage(); // Continue receiving + processMessage(received_message); } -void WebSocketClient::sendMessage(const json& message) { - std::cout << "Sending message send:" << message.dump() << std::endl; - ws_.async_write(net::buffer(message.dump()), - beast::bind_front_handler(&WebSocketClient::onSendMessage, shared_from_this())); +void WebSocketClient::processMessage(std::shared_ptr const& message) { + boost::asio::post( + ws_.get_executor(), + beast::bind_front_handler(&WebSocketClient::onProcessMessage, shared_from_this(), message)); } -void WebSocketClient::onSendMessage(boost::system::error_code ec, std::size_t bytes_transferred) { - if (ec) { - return Fail(ec, "write"); +void WebSocketClient::onProcessMessage(std::shared_ptr const& message) { + response_messages_queue_.push_back(message); + + std::string prio_message = *response_messages_queue_.begin()->get(); + response_messages_queue_.erase(response_messages_queue_.begin()); + + const auto parsed_message = displayAndParseMessage(prio_message); + + if (std::holds_alternative(parsed_message)) { + ErrorMessage error = std::get(parsed_message); + throw std::runtime_error(createLogErrorMessage(error)); } - std::cout << "Message send! " << bytes_transferred << " bytes transferred" << std::endl; - receiveMessage(); -} \ No newline at end of file + + DataMessage data_message = std::get(parsed_message); + + if (!reply_messages_queue_.empty()) { + writeReplyMessagesOnQueue(); + } else { + receiveMessage(); + } +} + +void WebSocketClient::writeReplyMessagesOnQueue() { + json reply_message = reply_messages_queue_.front(); + reply_messages_queue_.erase(reply_messages_queue_.begin()); + std::cout << "Sending queue message: " << reply_message.dump() << std::endl; + sendMessage(reply_message); +} diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.h similarity index 69% rename from cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp rename to cdsp/knowledge-layer/connector/websocket-client/websocket_client.h index 9eea1bd..8a8922a 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.hpp +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.h @@ -2,8 +2,13 @@ #include #include #include +#include #include #include +#include + +#include "data_types.h" +#include "message_utils.h" namespace beast = boost::beast; namespace websocket = beast::websocket; @@ -13,7 +18,7 @@ using json = nlohmann::json; class WebSocketClient : public std::enable_shared_from_this { public: - WebSocketClient(const std::string& host, const std::string& port); + WebSocketClient(const InitConfig& init_config); void run(); void sendMessage(const json& message); @@ -24,13 +29,17 @@ class WebSocketClient : public std::enable_shared_from_this { void receiveMessage(); void onReceiveMessage(beast::error_code error_code, std::size_t bytes_transferred); void onSendMessage(boost::system::error_code ec, std::size_t bytes_transferred); + void processMessage(std::shared_ptr const& ss); + void onProcessMessage(std::shared_ptr const& ss); - private: + void writeReplyMessagesOnQueue(); + + std::vector reply_messages_queue_{}; + std::vector> response_messages_queue_{}; net::io_context io_context_; websocket::stream ws_; tcp::resolver resolver_; beast::flat_buffer buffer_; - std::string server_uri_; - std::string server_port_; + InitConfig init_config_; }; \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md b/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md new file mode 100644 index 0000000..78db61a --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md @@ -0,0 +1,11 @@ +# Configuration Websocket-Client supported Data Points + +This module is responsible for handling the configuration of supported data points in the application. It supports a TXT format for defining the data points. + +The `vss_data_required.txt` in this directory contains the data point definitions that websocket-client will use during the initial connection. + +> [!WARNING] +> +> - Before starting the application, ensure that the desired TXT file is correctly placed in this directory. This file should contain the definitions of the supported data points. The name and extension to use can be configured in the `/docker/.env` file, it uses the ENV variable named `REQUIRED_VSS_DATA_POINTS_FILE`. If it is not specified, it uses `vss_data_required.txt` by default, which is one of the files contained in this repository. . +> - Ensure that the used file is correctly formatted and contains valid data points definitions. +> - **The application will not function correctly if the data points file is missing or incorrectly placed.** \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt b/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt new file mode 100644 index 0000000..9fba727 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt @@ -0,0 +1,7 @@ +Vehicle.Chassis.SteeringWheel.Angle +Vehicle.CurrentLocation.Latitude +Vehicle.CurrentLocation.Longitude +Vehicle.Powertrain.TractionBattery.NominalVoltage +Vehicle.Powertrain.TractionBattery.StateOfCharge.CurrentEnergy +Vehicle.Powertrain.Transmission.CurrentGear +Vehicle.Speed \ No newline at end of file From e68d6bbab816412e9906ee475be7f37ce13eef24 Mon Sep 17 00:00:00 2001 From: Sebastian Schleemilch Date: Fri, 27 Sep 2024 13:16:32 +0200 Subject: [PATCH 32/39] CMake windows support Signed-off-by: Sebastian Schleemilch --- cdsp/knowledge-layer/CMakeLists.txt | 4 ++ cdsp/knowledge-layer/README.md | 50 +++++++++++++++++-- .../connector/websocket-client/CMakeLists.txt | 6 +++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/cdsp/knowledge-layer/CMakeLists.txt b/cdsp/knowledge-layer/CMakeLists.txt index 6a44730..65c8b0e 100644 --- a/cdsp/knowledge-layer/CMakeLists.txt +++ b/cdsp/knowledge-layer/CMakeLists.txt @@ -8,6 +8,10 @@ set(CMAKE_CXX_STANDARD 17) # Find Boost libraries find_package(Boost 1.86.0 REQUIRED COMPONENTS system filesystem thread) +if(WIN32) + include_directories(${Boost_INCLUDE_DIRS}) +endif() + # FetchContent to include nlohmann/json include(FetchContent) FetchContent_Declare( diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index 36fc14b..062306e 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -14,7 +14,25 @@ Before setting up the project, make sure you have the following installed: ### Installing Dependencies -1. **Installing Boost (macOS/Linux)**: +1. **Install g++**: + On windows you may use mingw, e.g. you can install mingw64 with msys64 from here: https://www.msys2.org/ + + Open the MSYS2 MinGW64 Shell. Make sure you're using the MSYS2 MinGW64 Shell (not the regular MSYS2 shell), as this is required for using the 64-bit GCC toolchain. You can find this in the Start menu as MSYS2 MinGW 64-bit. Run the following command: + + ```bash + pacman -Syu # Update MSYS2 packages + pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make # Install 64-bit GCC and Make + ``` + After the installation, verify that gcc and g++ are installed and accessible in the MSYS2 MinGW64 shell by running: + + ```bash + gcc --version + g++ --version + ``` + You should see the version information for the installed GCC toolchain. + + +2. **Install Boost**: If you're on macOS, you can install Boost using Homebrew: ```bash @@ -27,7 +45,25 @@ Before setting up the project, make sure you have the following installed: sudo apt-get install libboost-all-dev ``` -2. **Install CMake**: + On Windows you can download a zipfile or take an installer, e.g. from here: https://sourceforge.net/projects/boost/files/boost-binaries/. To use all functionality you have to build the boost library with the gcc compiler. + + Open the MSYS2 MinGW64 Shell from the Start menu (not the standard MSYS2 shell), navigate to your Boost directory and build: + + ```bash + cd /c/path/to/boost_1_86_0 + ./bootstrap.sh gcc + ./b2 --with-system --with-filesystem --with-thread + ``` + + Important Note: When you want to build the projekt with cmake later, cmake often expects specific library names. So if it does not find the libraries, you have to rename them, e.g.: + + + **libboost_system-mgw14-mt-x64-1_86.a** to **libboost_system.a** for the release version and + **libboost_system-mgw14-mt-d-x64-1_86.a** tp **libboost_system-d.a** for the debug version. + + And the same for filesystem, thread, atomic and chrono. + +3. **Install CMake**: Ensure you have CMake installed: ```bash @@ -35,11 +71,16 @@ Before setting up the project, make sure you have the following installed: sudo apt-get install cmake # For Linux ``` + On Windows you can get an installer here: https://cmake.org/download/. + + Make sure you have Windows SDK 10 installed. To check start the Visual Studio Installer (https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/) and look for Visual Studio Build Tools. Here look for the component 'Desktop development with C++' and install it if required. + + ## Project Setup **Build the WebSocket Client**: - The WebSocket client is located in the `connector/websocket-client/` directory. To build it from this directory: + The WebSocket client is located in the `cdsp/knowledge_layer/` directory. To build it from this directory: ```bash # Create a build directory @@ -47,7 +88,10 @@ Before setting up the project, make sure you have the following installed: cd build # Run CMake to generate build files + # For Mac: cmake .. + # For Windows you have to specify the location of the boost libraries: + cmake -DBOOST_ROOT= -DBOOST_LIBRARYDIR=/stage/lib .. # Build the project make diff --git a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt index f9979ea..065597b 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt +++ b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt @@ -6,5 +6,11 @@ target_link_libraries(websocket_client Boost::system Boost::filesystem Boost::th target_link_libraries(websocket_client nlohmann_json::nlohmann_json) target_include_directories(websocket_client PRIVATE ${CMAKE_SOURCE_DIR}/connector/utils) + +# On Windows link winsock, too +if(WIN32) + target_link_libraries(websocket_client ws2_32) +endif() + # Use defined output directory for the executable set_target_properties(websocket_client PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file From bbe803f0890b6ed7dcd0bb064f40e71106e51cd2 Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 9 Oct 2024 15:13:19 +0200 Subject: [PATCH 33/39] Add --help CLI feature to display configured and default parameters Signed-off-by: Christian Muehlbauer --- cdsp/knowledge-layer/README.md | 6 +++ .../connector/websocket-client/main.cpp | 42 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index 062306e..8962b61 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -130,3 +130,9 @@ After successfully building the client, you can run it with the following comman ```bash ./build/bin/websocket_client ``` + +To display a list of available environment variables and their default values, run the application with the `--help` flag: + +```bash +./websocket_client --help +``` \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/main.cpp b/cdsp/knowledge-layer/connector/websocket-client/main.cpp index a4c64b3..6073056 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/main.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/main.cpp @@ -22,6 +22,41 @@ std::string getEnvVariable(const std::string& envVar, const std::string& default return valueEnv ? std::string(valueEnv) : defaultValue; } +void displayHelp() { + std::string bold = "\033[1m"; + std::string lightRed = "\033[91m"; + std::string reset = "\033[0m"; + + std::cout << bold << "Usage: websocket_client [--help]\n\n" << reset; + + std::cout << "This table contains a lists environment variables set for the WebSocket client " + "and their descriptions.\n\n"; + // Table header + std::cout << bold << std::left << std::setw(50) << "Variable" << std::setw(50) << "Description" + << "Value" << reset << "\n"; + std::cout << std::string(140, '-') << "\n"; // Line separator + + std::cout << std::left << std::setw(50) << "HOST_WEBSOCKET_SERVER" << std::setw(50) + << "IP address of the WebSocket server" + << getEnvVariable(" - HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer) << "\n"; + std::cout << std::left << std::setw(50) << "PORT_WEBSOCKET_SERVER" << std::setw(50) + << "Port number of the WebSocket server" + << getEnvVariable(" - PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer) << "\n"; + std::cout << std::left << std::setw(50) << "VIN" << std::setw(50) + << "Object ID to be used in communication" + << getEnvVariable("VIN", lightRed + "`Not Set (Required)`" + reset) << "\n"; + std::cout << std::left << std::setw(50) << "REQUIRED_VSS_DATA_POINTS_FILE" << std::setw(50) + << "Path to the model configuration file" + << getEnvVariable(" - REQUIRED_VSS_DATA_POINTS_FILE", + DefaultRequiredVSSDataPointsFile) + << "\n"; + + std::cout << "\n" << bold << "Description:\n" << reset; + std::cout << "This client connects to a WebSocket server and processes incoming messages based " + "on the defined input.\n"; + std::cout << "The above environment variables are used to configure the application.\n\n"; +} + /** * @brief Reads a file and returns a list of required data points. * @@ -71,7 +106,12 @@ InitConfig AddInitConfig() { return init_config; } -int main() { +int main(int argc, char* argv[]) { + // Check for --help flag + if (argc > 1 && std::string(argv[1]) == "--help") { + displayHelp(); + return EXIT_SUCCESS; + } try { InitConfig init_config = AddInitConfig(); std ::cout << "** Starting client! **" << std::endl; From 9559d7f4c0c272ee1210f7adb2e32d575da675b7 Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 9 Oct 2024 15:28:09 +0200 Subject: [PATCH 34/39] Use configuration file to organize the use case model directory Add helper documentation to system methods and remove outdated README. Fix read message containing data points. Merge remote-tracking branch 'origin/feature/enabling-of-knowledgelay Signed-off-by: Christian Muehlbauer --- cdsp/information-layer/README.md | 12 +- cdsp/knowledge-layer/README.md | 6 +- .../connector/utils/data_types.h | 22 +- .../connector/utils/helper.cpp | 31 ++ cdsp/knowledge-layer/connector/utils/helper.h | 9 + .../connector/utils/message_utils.cpp | 15 +- .../connector/utils/message_utils.h | 4 +- .../connector/utils/model_config.cpp | 193 +++++++++ .../connector/utils/model_config.h | 13 + .../connector/websocket-client/CMakeLists.txt | 2 +- .../connector/websocket-client/main.cpp | 42 +- .../websocket-client/websocket_client.cpp | 13 +- .../examples/use-case/README.md | 106 +++++ .../model}/inputs/vss_data_required.txt | 0 .../examples/use-case/model/model_config.json | 24 ++ .../model/ontologies/example_ontology.ttl | 1 + .../model/output/generated_triples.ttl | 72 ++++ .../query_observation_data_property.rq | 13 + .../query_observation_object_property.rq | 20 + .../vss/query_vss_data_property.rq | 21 + .../vss/query_vss_object_property.rq | 21 + .../model/shacl/observation_shacl.ttl | 24 ++ .../use-case/model/shacl/vss_shacl.ttl | 374 ++++++++++++++++++ .../examples/usecase-model/inputs/README.md | 11 - 24 files changed, 983 insertions(+), 66 deletions(-) create mode 100644 cdsp/knowledge-layer/connector/utils/helper.cpp create mode 100644 cdsp/knowledge-layer/connector/utils/helper.h create mode 100644 cdsp/knowledge-layer/connector/utils/model_config.cpp create mode 100644 cdsp/knowledge-layer/connector/utils/model_config.h create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/README.md rename cdsp/knowledge-layer/symbolic-reasoner/examples/{usecase-model => use-case/model}/inputs/vss_data_required.txt (100%) create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/model_config.json create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/ontologies/example_ontology.ttl create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/output/generated_triples.ttl create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_data_property.rq create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_object_property.rq create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_data_property.rq create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_object_property.rq create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/observation_shacl.ttl create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/vss_shacl.ttl delete mode 100644 cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index bbeab11..4e94209 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -89,7 +89,8 @@ $ docker build -t webserver-service . To run `RealmDB` use: -> [!IMPORTANT] See [here](./handlers/src/realmdb/README.md) all the required ENV variables. +> [!IMPORTANT] +> See [here](./handlers/src/realmdb/README.md) all the required ENV variables. ```shell $ docker run --name websocket-service -e HANDLER_TYPE=realmdb [-e required_env_variables] -p 8080:8080 websocket-service @@ -97,7 +98,8 @@ $ docker run --name websocket-service -e HANDLER_TYPE=realmdb [-e required_env_v To run `IoTDB` use: -> [!IMPORTANT] See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. +> [!IMPORTANT] +> See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. ```shell $ docker run --name websocket-service -e HANDLER_TYPE=iotdb --network cdsp_default [-e required_env_variables] -p 8080:8080 websocket-service @@ -117,7 +119,8 @@ To start the websocket-server using `RealmDB` execute the command: To run `RealmDB` use: -> [!IMPORTANT] See [here](./handlers/src/realmdb/README.md) all the required ENV variables. +> [!IMPORTANT] +> See [here](./handlers/src/realmdb/README.md) all the required ENV variables. ```shell $ HANDLER_TYPE=realm [ENV_VARIABLE_NAME required_env_variables] npm start @@ -125,7 +128,8 @@ $ HANDLER_TYPE=realm [ENV_VARIABLE_NAME required_env_variables] npm start To start the websocket-server using `IoTDB` execute the command: -> [!IMPORTANT] See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. +> [!IMPORTANT] +> See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. ```shell $ HANDLER_TYPE=iotdb IOTDB_HOST=localhost [ENV_VARIABLE_NAME required_env_variables] npm start diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index 8962b61..621ebe5 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -108,8 +108,7 @@ The project requires certain environment variables to work with the WebSocket se - **HOST_WEBSOCKET_SERVER:** Specifies the hostname of the WebSocket server. The default is `localhost`. - **PORT_WEBSOCKET_SERVER:** Specifies the port for connecting to the WebSocket server. The default is `8080`. -- **VIN:** The Vehicle Identification Number (VIN) is required to subscribe and retrieve information for a specific vehicle. Use the VIN configured in the [`information-layer`](../information-layer/README.md). -- **REQUIRED_VSS_DATA_POINTS_FILE:** The name of the TXT file containing all the required data points to start the application. See more details [here](symbolic-reasoner/examples/usecase-model/inputs/README.md). The default value is `vss_data_required.txt`. +- **OBJECT_ID:** The object id is required to subscribe and retrieve information for a specific object (e.g. VIN (Vehicle Identification Number) for VSS (Vehicle Signal Specification) data). Use the object id (in this case VIN) configured in the [`information-layer`](../information-layer/README.md). You can customize the WebSocket server configuration by adding the following environment variables in the `/docker/.env` file. Below is an example of what the file could look like: @@ -120,8 +119,7 @@ You can customize the WebSocket server configuration by adding the following env HOST_WEBSOCKET_SERVER="your_custom_host" PORT_WEBSOCKET_SERVER="your_custom_port" -VIN="VIN_TO_SUBSCRIBE" -REQUIRED_VSS_DATA_POINTS_FILE=vss_data_required.txt +OBJECT_ID="OBJECT_ID_TO_SUBSCRIBE" ``` ### Start the Websocket Client diff --git a/cdsp/knowledge-layer/connector/utils/data_types.h b/cdsp/knowledge-layer/connector/utils/data_types.h index f8baf06..008f984 100644 --- a/cdsp/knowledge-layer/connector/utils/data_types.h +++ b/cdsp/knowledge-layer/connector/utils/data_types.h @@ -2,15 +2,33 @@ #define DATA_TYPES_DATA_TYPES_H #include +#include #include #include +struct ReasonerSettings { + std::string inference_engine; + std::string output_format; + std::vector supported_tree_types; +}; + +struct ModelConfig { + std::map> system_data_points; + std::string output_file_path; + std::vector ontology_files; + std::vector shacl_shapes_files; + std::map> triple_assembler_queries_files; + std::string output_queries_path; + std::vector rules_files; + ReasonerSettings reasoner_settings; +}; + struct InitConfig { std::string uuid; std::string host_websocket_server; std::string port_websocket_server; - std::string vin; - std::vector system_vss_data_points; + std::string oid; + ModelConfig model_config; }; struct MessageHeader { diff --git a/cdsp/knowledge-layer/connector/utils/helper.cpp b/cdsp/knowledge-layer/connector/utils/helper.cpp new file mode 100644 index 0000000..c5561a7 --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/helper.cpp @@ -0,0 +1,31 @@ +#include "helper.h" + +/** + * @brief Converts a given string to lowercase. + * + * This function takes an input string and converts all its characters to lowercase. + * + * @param input The input string to be converted. + * @return A new string with all characters in lowercase. + */ +std::string toLowercase(const std::string& input) { + std::string result = input; + std::transform(result.begin(), result.end(), result.begin(), + [](unsigned char c) { return std::tolower(c); }); + return result; +} + +/** + * @brief Converts a given string to uppercase. + * + * This function takes an input string and converts all its characters to uppercase. + * + * @param input The input string to be converted. + * @return A new string with all characters in uppercase. + */ +std::string toUppercase(const std::string& input) { + std::string result = input; + std::transform(result.begin(), result.end(), result.begin(), + [](unsigned char c) { return std::toupper(c); }); + return result; +} diff --git a/cdsp/knowledge-layer/connector/utils/helper.h b/cdsp/knowledge-layer/connector/utils/helper.h new file mode 100644 index 0000000..91ecaf5 --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/helper.h @@ -0,0 +1,9 @@ +#ifndef HELPER_H +#define HELPER_H + +#include + +std::string toLowercase(const std::string& input); +std::string toUppercase(const std::string& input); + +#endif // HELPER_H \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/utils/message_utils.cpp b/cdsp/knowledge-layer/connector/utils/message_utils.cpp index d754113..76d1f22 100644 --- a/cdsp/knowledge-layer/connector/utils/message_utils.cpp +++ b/cdsp/knowledge-layer/connector/utils/message_utils.cpp @@ -23,16 +23,17 @@ json createMessageHeader(const MessageType& type, const std::string& tree, const * @brief Creates a subscription message and adds it to the reply messages queue. * * This function generates a subscription message header using the provided - * uuid and vin, and then appends this message to the reply messages queue. + * uuid and oid, and then appends this message to the reply messages queue. * * @param uuid Used as a client identifier. - * @param vin The vehicle identification number. + * @param oid The object identification number. + * @param tree The tree identifier for the message. * @param reply_messages_queue A reference to the queue where the subscription message will be * added. */ -void createSubscription(const std::string& uuid, const std::string& vin, +void createSubscription(const std::string& uuid, const std::string& oid, const std::string& tree, std::vector& reply_messages_queue) { - reply_messages_queue.push_back(createMessageHeader(MessageType::SUBSCRIBE, "VSS", vin, uuid)); + reply_messages_queue.push_back(createMessageHeader(MessageType::SUBSCRIBE, tree, oid, uuid)); } /** @@ -43,15 +44,15 @@ void createSubscription(const std::string& uuid, const std::string& vin, * * @param uuid The client identifier. * @param tree The tree identifier for the message. - * @param vin The vehicle identification number. + * @param oid The object identification number. * @param data_points A vector of data point names to be included in the message. * @param reply_messages_queue A reference to the queue where the constructed message will be * appended. */ -void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& vin, +void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& oid, const std::vector& data_points, std::vector& reply_messages_queue) { - auto message = createMessageHeader(MessageType::READ, tree, vin, uuid); + auto message = createMessageHeader(MessageType::READ, tree, oid, uuid); json nodes = json::array(); for (const auto& data_point : data_points) { diff --git a/cdsp/knowledge-layer/connector/utils/message_utils.h b/cdsp/knowledge-layer/connector/utils/message_utils.h index e6a5c3f..268949f 100644 --- a/cdsp/knowledge-layer/connector/utils/message_utils.h +++ b/cdsp/knowledge-layer/connector/utils/message_utils.h @@ -14,10 +14,10 @@ using json = nlohmann::json; json createMessageHeader(const std::string& type, const std::string& tree, const std::string& id, const std::string& uuid); -void createSubscription(const std::string& uuid, const std::string& vin, +void createSubscription(const std::string& uuid, const std::string& oid, const std::string& tree, std::vector& reply_messages_queue); -void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& vin, +void createReadMessage(const std::string& uuid, const std::string& tree, const std::string& oid, const std::vector& data_points, std::vector& reply_messages_queue); diff --git a/cdsp/knowledge-layer/connector/utils/model_config.cpp b/cdsp/knowledge-layer/connector/utils/model_config.cpp new file mode 100644 index 0000000..cb985db --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/model_config.cpp @@ -0,0 +1,193 @@ +#include + +#include +#include + +#include "helper.h" +/** + * @brief Reads a file and returns a list of required data points. + * + * This function constructs the full path to the file using the provided file name + * and a predefined project root directory. It then reads the file line by line, + * storing each line as an element in a vector of strings. + * + * @param file_name The name of the file to read. + * @return A vector of strings, each representing a required data point from the file. + * @throws std::runtime_error if the file cannot be opened. + */ +std::vector getClientRequiredDataPoints(std::string file_name) { + std::vector required_data; + std::string root = + std::string(PROJECT_ROOT) + "/symbolic-reasoner/examples/use-case/model/" + file_name; + std::ifstream file(root); + if (!file) { + throw std::runtime_error("Invalid required Data Points file: " + file_name); + } + std::string line; + while (std::getline(file, line)) { + required_data.push_back(line); + } + return required_data; +} + +/** + * @brief Validates the presence of required fields in a JSON configuration. + * + * This function checks for the existence of specific top-level fields and nested fields + * within the provided JSON object. If any required field is missing, it throws a runtime error + * with a descriptive message indicating which field is missing. + * + * @param config_json The JSON object representing the configuration to be validated. + * + * @throws std::runtime_error If any required field is missing in the JSON configuration. + */ +void validateJsonFields(const json& config_json) { + const std::string generic_error_message = + "Error in the model_config.json file. Missing required field"; + // Required top-level fields + if (!config_json.contains("inputs")) { + throw std::runtime_error(generic_error_message + ": 'inputs'"); + } + if (!config_json.contains("ontologies")) { + throw std::runtime_error(generic_error_message + ": 'ontologies'"); + } + if (!config_json.contains("output")) { + throw std::runtime_error(generic_error_message + ": 'output'"); + } + if (!config_json.contains("queries")) { + throw std::runtime_error(generic_error_message + ": 'queries'"); + } + if (!config_json.contains("rules")) { + throw std::runtime_error(generic_error_message + ": 'rules'"); + } + if (!config_json.contains("shacl")) { + throw std::runtime_error(generic_error_message + ": 'shacl'"); + } + if (!config_json.contains("reasoner_settings")) { + throw std::runtime_error(generic_error_message + " 'reasoner_settings'"); + } + + // Validate structure inside "queries" + const auto& queries = config_json["queries"]; + if (!queries.contains("triple_assembler_helper")) { + throw std::runtime_error(generic_error_message + + " in 'queries': 'triple_assembler_helper'"); + } + if (!queries.contains("output")) { + throw std::runtime_error(generic_error_message + " in 'queries': 'output'"); + } + + // Validate structure inside "reasoner_settings" + const auto& reasoner_settings = config_json["reasoner_settings"]; + if (!reasoner_settings.contains("inference_engine")) { + throw std::runtime_error(generic_error_message + + " in 'reasoner_settings': 'inference_engine'"); + } + if (!reasoner_settings.contains("output_format")) { + throw std::runtime_error(generic_error_message + + " in 'reasoner_settings': 'output_format'"); + } + if (!reasoner_settings.contains("supported_tree_types")) { + throw std::runtime_error(generic_error_message + + " in 'reasoner_settings': 'supported_tree_types'"); + } +} + +/** + * @brief Loads the model configuration from a JSON file. + * + * This function reads the model configuration from the specified JSON file and populates + * the provided ModelConfig object with the configuration data. It validates the structure + * of the JSON file and ensures that all required fields are present. + * + * @param config_file The path to the JSON configuration file. + * @param model_config The ModelConfig object to be populated with the configuration data. + * + * @throws std::runtime_error If the configuration file cannot be opened or if required fields are + * missing. + */ +void loadModelConfig(const std::string& config_file, ModelConfig& model_config) { + std::ifstream file(config_file); + if (!file) { + throw std::runtime_error("Could not open the model config file: " + config_file); + } + + json config_json; + file >> config_json; + + // Validate the structure of the JSON + validateJsonFields(config_json); + + if (config_json["reasoner_settings"]["supported_tree_types"].size() > 0) { + const std::string generic_error_message = + "Error in the model_config.json file. Missing required field"; + + for (const auto& tree_type : config_json["reasoner_settings"]["supported_tree_types"]) { + std::string lc_tree_type = toLowercase(tree_type.get()); + + // Read supported tree types + model_config.reasoner_settings.supported_tree_types.push_back( + toUppercase(tree_type.get())); + + // Read system data points for a tree type + if (!config_json["inputs"].contains(lc_tree_type + "_data")) { + throw std::runtime_error(generic_error_message + " in 'inputs': '" + lc_tree_type + + "_data'"); + } + model_config.system_data_points[lc_tree_type] = getClientRequiredDataPoints( + config_json["inputs"][lc_tree_type + "_data"].get()); + + // Read tree type specific triple assembler helpers + if (config_json["queries"]["triple_assembler_helper"].contains(lc_tree_type)) { + std::vector query_list; + for (const auto& query : + config_json["queries"]["triple_assembler_helper"][lc_tree_type]) { + query_list.push_back(query.get()); + } + model_config.triple_assembler_queries_files[lc_tree_type] = query_list; + } else { + std::cout + << (" ** INFO: There is any triple assembler helper for the tree type: '" + + lc_tree_type + "' configured in the model_config.json") + << std::endl + << std::endl; + } + } + } else { + throw std::runtime_error("You need to add some supported tree types in " + config_file); + } + + // Read output file path + model_config.output_file_path = config_json["output"].get(); + + // Read ontologies files + for (const auto& ontology : config_json["ontologies"]) { + model_config.ontology_files.push_back(ontology.get()); + } + + // Read SHACL shapes files + for (const auto& shacl : config_json["shacl"]) { + model_config.shacl_shapes_files.push_back(shacl.get()); + } + + // Read default triple assembler helpers + std::vector query_list; + for (const auto& query : config_json["queries"]["triple_assembler_helper"]["default"]) { + query_list.push_back(query.get()); + } + model_config.triple_assembler_queries_files["default"] = query_list; + + // Read rules paths + for (const auto& rule : config_json["rules"]) { + model_config.rules_files.push_back(rule.get()); + } + + // Read output queries path + model_config.output_queries_path = config_json["queries"]["output"].get(); + + // Read reasoner settings + model_config.reasoner_settings.inference_engine = + config_json["reasoner_settings"]["inference_engine"].get(); + model_config.reasoner_settings.output_format = + config_json["reasoner_settings"]["output_format"].get(); +} diff --git a/cdsp/knowledge-layer/connector/utils/model_config.h b/cdsp/knowledge-layer/connector/utils/model_config.h new file mode 100644 index 0000000..98f866c --- /dev/null +++ b/cdsp/knowledge-layer/connector/utils/model_config.h @@ -0,0 +1,13 @@ +#ifndef MESSAGE_MODEL_CONFIG_H +#define MESSAGE_MODEL_CONFIG_H + +#include + +#include "data_types.h" + +using json = nlohmann::json; + +void validateJsonFields(const json& config_json); +void loadModelConfig(const std::string& config_file, ModelConfig& model_config); + +#endif // MESSAGE_MODE_CONFIG_H \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt index 065597b..a0b2dc9 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt +++ b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt @@ -1,5 +1,5 @@ # Define the WebSocket client target -add_executable(websocket_client main.cpp websocket_client.cpp ../utils/message_utils.cpp) +add_executable(websocket_client main.cpp websocket_client.cpp ../utils/message_utils.cpp ../utils/helper.cpp ../utils/model_config.cpp) # Link libraries target_link_libraries(websocket_client Boost::system Boost::filesystem Boost::thread) diff --git a/cdsp/knowledge-layer/connector/websocket-client/main.cpp b/cdsp/knowledge-layer/connector/websocket-client/main.cpp index 6073056..0d96b29 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/main.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/main.cpp @@ -1,12 +1,13 @@ +#include +#include + #include #include #include #include -#include #include #include -#include "data_types.h" #include "websocket_client.h" using json = nlohmann::json; @@ -15,7 +16,8 @@ boost::uuids::random_generator uuidGenerator; std::string DefaultHostWebsocketServer{"127.0.0.1"}; std::string DefaultPortWebSocketServer{"8080"}; -std::string DefaultRequiredVSSDataPointsFile{"vss_data_required.txt"}; +std::string ModelConfigurationFile{std::string(PROJECT_ROOT) + + "/symbolic-reasoner/examples/use-case/model/model_config.json"}; std::string getEnvVariable(const std::string& envVar, const std::string& defaultValue = "") { const char* valueEnv = std::getenv(envVar.c_str()); @@ -57,32 +59,6 @@ void displayHelp() { std::cout << "The above environment variables are used to configure the application.\n\n"; } -/** - * @brief Reads a file and returns a list of required data points. - * - * This function constructs the full path to the file using the provided file name - * and a predefined project root directory. It then reads the file line by line, - * storing each line as an element in a vector of strings. - * - * @param file_name The name of the file to read. - * @return A vector of strings, each representing a required data point from the file. - * @throws std::runtime_error if the file cannot be opened. - */ -std::vector getClientRequiredDataPoints(std::string file_name) { - std::vector required_data; - std::string root = - std::string(PROJECT_ROOT) + "/symbolic-reasoner/examples/usecase-model/inputs/" + file_name; - std::ifstream file(root); - if (!file) { - throw std::runtime_error("Invalid required Data Points file: " + file_name); - } - std::string line; - while (std::getline(file, line)) { - required_data.push_back(line); - } - return required_data; -} - /** * @brief Initializes and returns an InitConfig object with required configuration variables. * @@ -94,15 +70,17 @@ std::vector getClientRequiredDataPoints(std::string file_name) { * @throws std::runtime_error if there is a problem setting a variable. */ InitConfig AddInitConfig() { + ModelConfig model_config; + loadModelConfig(ModelConfigurationFile, model_config); + InitConfig init_config; init_config.host_websocket_server = getEnvVariable("HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer); init_config.port_websocket_server = getEnvVariable("PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer); init_config.uuid = boost::uuids::to_string(uuidGenerator()); - init_config.vin = getEnvVariable("VIN"); - init_config.system_vss_data_points = getClientRequiredDataPoints( - getEnvVariable("REQUIRED_VSS_DATA_POINTS_FILE", DefaultRequiredVSSDataPointsFile)); + init_config.oid = getEnvVariable("OBJECT_ID"); + init_config.model_config = model_config; return init_config; } diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp index b095cf0..527a718 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp @@ -3,6 +3,8 @@ #include #include +#include "helper.h" + namespace { void Fail(beast::error_code error_code, const std::string& what) { std::cerr << what << ": " << error_code.message() << "\n"; @@ -62,9 +64,14 @@ void WebSocketClient::handshake(beast::error_code ec) { << std::endl << std::endl; - createSubscription(init_config_.uuid, init_config_.vin, reply_messages_queue_); - createReadMessage(init_config_.uuid, "VSS", init_config_.vin, - init_config_.system_vss_data_points, reply_messages_queue_); + for (const std::string& tree_type : + init_config_.model_config.reasoner_settings.supported_tree_types) { + createSubscription(init_config_.uuid, init_config_.oid, tree_type, reply_messages_queue_); + createReadMessage(init_config_.uuid, tree_type, init_config_.oid, + init_config_.model_config.system_data_points[toLowercase(tree_type)], + reply_messages_queue_); + } + writeReplyMessagesOnQueue(); } diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/README.md b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/README.md new file mode 100644 index 0000000..9aa12bd --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/README.md @@ -0,0 +1,106 @@ +Here is a sample `README.md` that explains the structure and usage of the `model_config.json` configuration file. + +--- + +# Model Configuration for Reasoner Application + +This `model_config.json` file provides the configuration necessary to run the reasoner application. The file defines the required inputs, ontologies, output settings, queries, rules, SHACL validation, and reasoning engine options. This document explains the purpose of each section in the configuration. + +## Configuration Overview + +The `model_config.json` is structured to provide: +- Input data points +- Ontology files for the domain schema +- SHACL shapes for data validation +- SPARQL queries for data manipulation +- Reasoning rules +- Reasoner settings +- Output configurations + +### Configuration Sections + +#### Inputs +```json +"inputs": { + "vss_data": "inputs/vss_data_required.txt" +} +``` +- **vss_data**: The field must be called `_data`, in the example we use the VSS tree type (`vss_data`). This field specifies the path to the input data file that contains vehicle signals or data points. This file lists the signals that the reasoner application will work with. It supports a TXT format for defining the data points. + +#### Ontologies +```json +"ontologies": ["ontologies/example_ontology.ttl"] +``` +- **ontologies**: A list of ontology files in Turtle format (.ttl). These define the concepts, relationships, and structure of the data in a semantic format that the reasoner will use to understand and process the input data. + +#### Output +```json +"output": "output/generated_triples.ttl" +``` +- **output**: Defines the path to the file where the reasoner will store the results of the inference process. The output will be generated in the format defined in the [reasoner settings](#reasoner-settings) (in this case a turtle `.ttl`). + +#### Queries +```json +"queries": { + "triple_assembler_helper": { + "vss": [ + "queries/triple_assembler_helper/vss/data_property.rq", + "queries/triple_assembler_helper/vss/object_property.rq" + ], + "default": [ + "queries/triple_assembler_helper/default/data_property.rq", + "queries/triple_assembler_helper/default/object_property.rq" + ] + }, + "output": ["queries/output/"] +} +``` +- **queries**: This section includes SPARQL queries that will be used during the reasoning process to assemble triples or extract results from the reasoned data. + - **triple_assembler_helper**: + Queries specifically designed to assemble data points related to an specific data tree (in this case Vehicle Signal Specification (VSS)) or other specifications used by default, if the tree is not defined, including queries for data and object properties. + - **output**: Queries to retrieve the final inference results after the reasoning process. The queries in this section will typically extract insights from the generated triples. + +#### Rules +```json +"rules": ["rules/insight_rules.ttl"] +``` +- **rules**: A list of rule files in Turtle format. These rules define additional logic for the reasoner to apply during inference. The rules may include custom inferences or insights that the reasoner should derive based on the input data. + +#### SHACL Validation +```json +"shacl": [ + "shacl/vss_shacl.ttl", + "shacl/observation_shacl.ttl" +] +``` +- **shacl**: A list of SHACL (Shapes Constraint Language) files that define the constraints and validation rules for the data. SHACL shapes ensure that the input data conforms to specific structural and semantic rules before it is processed by the reasoner. + +#### Reasoner Settings +```json +"reasoner_settings": { + "inference_engine": "RDFox", + "output_format": "turtle", + "supported_tree_types": ["VSS"] +} +``` +- **reasoner_settings**: Configuration options for the reasoning engine. + - **inference_engine**: Specifies the reasoner to use (in this case, RDFox). + > [!NOTE] Supported engines in this repository + > - `RDFox` + + - **output_format**: Defines the format in which the output will be serialized. The current setting is `turtle` for Turtle format. + > [!NOTE] Supported formats in this repository + > - `turtle` for .ttl files + + - **supported_tree_types**: This field defines the types of data trees that the reasoner application can handle. For the communication with the WebSocket server and definition of the input data, it is required to specify how the tree type will be represented. This tree type will be sent as part of the message header during data transfer and is crucial for reading, interpreting the [input data](#inputs) for the reasoner model, and if exist, specific [triple assembler helpers](#queries). With this tree type definition, the reasoner can ensure compatibility with the input data and properly interpret the data points being processed. + > [!NOTE] Supported tree types this repository + > - `VSS` (Vehicle Signal Specification) + +### Example Usage + +Once the `model_config.json` is configured, the reasoner application will: +1. Read the **input data** from the specified file. +2. Validate the data using the **ontologies** and **SHACL shapes**. +3. Apply the **rules** during inference. +4. Use the **queries** to assemble triples and extract results. +5. Generate an **output** file containing the reasoned data in Turtle format. diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/inputs/vss_data_required.txt similarity index 100% rename from cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/vss_data_required.txt rename to cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/inputs/vss_data_required.txt diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/model_config.json b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/model_config.json new file mode 100644 index 0000000..7012fd2 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/model_config.json @@ -0,0 +1,24 @@ +{ + "inputs": { + "vss_data": "inputs/vss_data_required.txt" + }, + "ontologies": ["ontologies/example_ontology.ttl"], + "output": "output/", + "queries": { + "triple_assembler_helper": { + "vss": [ + "queries/triple_assembler_helper/vss/data_property.rq", + "queries/triple_assembler_helper/vss/object_property.rq" + ], + "default": [] + }, + "output": "queries/output/" + }, + "rules": ["rules/insight_rules.ttl"], + "shacl": ["shacl/vss_shacl.ttl", "shacl/observation_shacl.ttl"], + "reasoner_settings": { + "inference_engine": "RDFox", + "output_format": "turtle", + "supported_tree_types": ["vss"] + } +} diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/ontologies/example_ontology.ttl b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/ontologies/example_ontology.ttl new file mode 100644 index 0000000..b44f039 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/ontologies/example_ontology.ttl @@ -0,0 +1 @@ +#exmaple \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/output/generated_triples.ttl b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/output/generated_triples.ttl new file mode 100644 index 0000000..3542e5d --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/output/generated_triples.ttl @@ -0,0 +1,72 @@ +bmw:VehicleWBY11CF080CH470711 a bmw:Vehicle. + + +bmw:ChassisWBY11CF080CH470711 a bmw:Chassis. + +bmw:VehicleWBY11CF080CH470711 bmw:hasPart bmw:ChassisWBY11CF080CH470711. + +bmw:SteeringWheelWBY11CF080CH470711 a bmw:SteeringWheel. +bmw:VehicleWBY11CF080CH470711 bmw:hasPart bmw:SteeringWheelWBY11CF080CH470711. + +bmw:CurrentLocationWBY11CF080CH470711 a bmw:CurrentLocation. +bmw:VehicleWBY11CF080CH470711 bmw:hasSignal bmw:CurrentLocationWBY11CF080CH470711. + + +bmw:PowertrainWBY11CF080CH470711 a bmw:Powertrain. + +bmw:VehicleWBY11CF080CH470711 bmw:hasPart bmw:PowertrainWBY11CF080CH470711. + +bmw:TransmissionWBY11CF080CH470711 a bmw:Transmission. + +bmw:PowertrainWBY11CF080CH470711 bmw:hasPart bmw:TransmissionWBY11CF080CH470711. + +bmw:TractionBatteryWBY11CF080CH470711 a bmw:TractionBattery. + +bmw:PowertrainWBY11CF080CH470711 bmw:hasPart bmw:TractionBatteryWBY11CF080CH470711. + +bmw:StateOfChargeWBY11CF080CH470711 a bmw:StateOfCharge. + +bmw:TractionBatteryWBY11CF080CH470711 bmw:hasSignal bmw:StateOfChargeWBY11CF080CH470711. + + +bmw:Observation20181116155027 a sosa:Observation ; # observation_dateTime + sosa:hasFeatureOfInterest bmw:CurrentLocationWBY11CF080CH470711 ; #last second element of the the data point + sosa:hasSimpleResult "30"^^xsd:double ; # value + sosa:observedProperty bmw:latitude ; #last element of the data point + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime .#dateTime + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:CurrentLocationWBY11CF080CH470711 ; + sosa:hasSimpleResult "50"^^xsd:double ; + sosa:observedProperty bmw:longitude ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:VehicleWBY11CF080CH470711 ; + sosa:hasSimpleResult "50"^^xsd:int ; + sosa:observedProperty bmw:speed ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:SteeringWheelWBY11CF080CH470711 ; + sosa:hasSimpleResult "10"^^xsd:int ; + sosa:observedProperty bmw:angle ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:TransmissionWBY11CF080CH470711 ; + sosa:hasSimpleResult "10"^^xsd:int ; + sosa:observedProperty bmw:currentGear ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:StateOfChargeWBY11CF080CH470711 ; + sosa:hasSimpleResult "98.6"^^xsd:float ; + sosa:observedProperty bmw:CurrentEnergy ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . + +bmw:Observation20181116155027 a sosa:Observation ; + sosa:hasFeatureOfInterest bmw:TractionBatteryWBY11CF080CH470711 ; + sosa:hasSimpleResult "55"^^xsd:int ; + sosa:observedProperty bmw:NominalVoltage ; + sosa:phenomenonTime "2018-11-16 15:50:27"^^xsd:dateTime . \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_data_property.rq b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_data_property.rq new file mode 100644 index 0000000..d62a449 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_data_property.rq @@ -0,0 +1,13 @@ +prefix sh: +prefix val: + + SELECT ?class1 ?data_property ?datatype + WHERE { + val:ObservationShape sh:targetClass ?class1; + sh:property [ + sh:path ?data_property; + sh:datatype ?datatype + ]. + } + + diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_object_property.rq b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_object_property.rq new file mode 100644 index 0000000..578d806 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/default/query_observation_object_property.rq @@ -0,0 +1,20 @@ +prefix pdmo: +prefix bmw: +prefix middleware: +prefix sh: +prefix val: +prefix xsd: +prefix ut: + + +SELECT ?class1 ?object_property +WHERE { + val:ObservationShape sh:targetClass ?class1; + sh:property [ + sh:path ?object_property; + sh:nodeKind sh:IRI + ]. + + } + + diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_data_property.rq b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_data_property.rq new file mode 100644 index 0000000..11d85e2 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_data_property.rq @@ -0,0 +1,21 @@ +prefix pdmo: +prefix bmw: +prefix middleware: +prefix sh: +prefix val: +prefix xsd: +prefix ut: + + + SELECT ?class1 ?data_property ?datatype + WHERE { + ?S sh:name "%A%"; + sh:targetClass ?class1; + sh:property [ sh:name ?data_point_name; + sh:path ?data_property; + sh:datatype ?datatype + ]. + FILTER (contains("%B%", ?data_point_name)) #The first value is from the data sigle point + } + + diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_object_property.rq b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_object_property.rq new file mode 100644 index 0000000..4222b3f --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/queries/triple_assembler_helper/vss/query_vss_object_property.rq @@ -0,0 +1,21 @@ +prefix pdmo: +prefix bmw: +prefix middleware: +prefix sh: +prefix val: +prefix xsd: +prefix ut: + + +SELECT ?class1 ?object_property ?class2 +WHERE { + ?S sh:name "%A%"; + sh:targetClass ?class1; + sh:property [ sh:name "%B%"; + sh:path ?object_property; + sh:class ?class2; + sh:nodeKind sh:IRI]. + + } + + diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/observation_shacl.ttl b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/observation_shacl.ttl new file mode 100644 index 0000000..3867fd0 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/observation_shacl.ttl @@ -0,0 +1,24 @@ +@prefix sh: . +@prefix sosa: . +@prefix xsd: . +@prefix val: . + +# Shape to validate an Observation +val:ObservationShape a sh:NodeShape ; + sh:targetClass sosa:Observation ; + sh:property [ + sh:path sosa:hasFeatureOfInterest ; + sh:nodeKind sh:IRI ; + ] ; + sh:property [ + sh:path sosa:observedProperty ; + sh:nodeKind sh:IRI ; + ] ; + sh:property [ + sh:path sosa:hasSimpleResult ; + sh:datatype xsd:string ; + ] ; + sh:property [ + sh:path sosa:phenomenonTime ; + sh:datatype xsd:dateTime ; + ] . diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/vss_shacl.ttl b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/vss_shacl.ttl new file mode 100644 index 0000000..af446be --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/examples/use-case/model/shacl/vss_shacl.ttl @@ -0,0 +1,374 @@ +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . +@prefix bmw: . +@prefix val: . + + +val:VehicleShape a sh:NodeShape ; + sh:name "Vehicle" ; + sh:targetClass bmw:Vehicle ; + sh:property [ + sh:name "VIN" ; + sh:path bmw:vin ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "CurrentLocation" ; + sh:path bmw:hasSignal ; + sh:class bmw:CurrentLocation ; + sh:node val:CurrentLocationShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Speed" ; + sh:path bmw:speed ; + sh:datatype xsd:float ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "PWFStatus" ; + sh:path bmw:PWFStatus ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Cabin" ; + sh:path bmw:hasPart ; + sh:class bmw:Cabin ; + sh:node val:CabinShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Powertrain" ; + sh:path bmw:hasPart ; + sh:class bmw:Powertrain ; + sh:node val:PowertrainShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Chassis" ; + sh:path bmw:hasPart ; + sh:class bmw:Chassis ; + sh:node val:ChassisShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:ChassisShape a sh:NodeShape; + sh:name "Chassis"; + sh:targetClass bmw:Chassis; + sh:property [ + sh:name "SteeringWheel" ; + sh:path bmw:hasPart ; + sh:class bmw:SteeringWheel ; + sh:node val:SteeringWheelShape ; + sh:nodeKind sh:IRI ; + sh:minCount 1 ; + ] . + +val:SteeringWheelShape a sh:NodeShape; + sh:name "SteeringWheel"; + sh:targetClass bmw:SteeringWheel; + sh:property [ + sh:name "Angle" ; + sh:path bmw:angle ; + sh:datatype xsd:int; + sh:minCount 1 ; + ] . + + +val:CurrentLocationShape a sh:NodeShape ; + sh:name "CurrentLocation" ; + sh:targetClass bmw:CurrentLocation ; + sh:property [ + sh:name "Latitude" ; + sh:path bmw:latitude ; + sh:datatype xsd:double ; + sh:minInclusive -90 ; + sh:maxInclusive 90 ; + val:unit "degrees" ; + sh:description "Current latitude of vehicle in WGS 84 geodetic coordinates." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Longitude" ; + sh:path bmw:longitude ; + sh:datatype xsd:double ; + sh:minInclusive -180 ; + sh:maxInclusive 180 ; + val:unit "degrees" ; + sh:description "Current longitude of vehicle in WGS 84 geodetic coordinates." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Timestamp" ; + sh:path bmw:timestamp ; + sh:datatype xsd:long ; + val:unit "iso8601" ; + sh:description "Timestamp from GNSS system for current location, formatted according to ISO 8601 with UTC time zone." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Heading" ; + sh:path bmw:heading ; + sh:datatype xsd:double ; + sh:minInclusive 0 ; + sh:maxInclusive 360 ; + val:unit "degrees" ; + sh:description "Current heading relative to geographic north. 0 = North, 90 = East, 180 = South, 270 = West." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:PowertrainShape a sh:NodeShape; + sh:name "Powertrain"; + sh:targetClass bmw:Powertrain; + sh:property [ + sh:name "TractionBattery" ; + sh:path bmw:hasPart ; + sh:class bmw:TractionBattery ; + sh:node val:TractionBatteryShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Transmission" ; + sh:path bmw:hasPart ; + sh:class bmw:Transmission ; + sh:node val:TransmissionShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:TractionBatteryShape a sh:NodeShape; + sh:name "TractionBattery"; + sh:targetClass bmw:TractionBattery ; + sh:property [ + sh:name "NominalVoltage" ; + sh:path bmw:nominalVoltage ; + sh:datatype xsd:int ; + sh:description "Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "StateOfCharge" ; + sh:path bmw:hasSignal ; + sh:class bmw:StateOfCharge; + sh:node val:StateOfChargeNodeShape; + sh:nodeKind sh:IRI ; + sh:description "Information on the state of charge of the vehicle's high voltage battery." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:StateOfChargeNodeShape a sh:NodeShape ; + sh:name "StateOfCharge" ; + sh:targetClass bmw:StateOfCharge ; + sh:property [ + sh:name "CurrentEnergy" ; + sh:path bmw:currentEnergy ; + sh:datatype xsd:float ; + sh:description "Physical state of charge of high voltage battery expressed in kWh." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + + +val:TransmissionShape a sh:NodeShape ; + sh:name "Transmission" ; + sh:targetClass bmw:Transmission ; + sh:property [ + sh:name "CurrentGear" ; + sh:path bmw:currentGear ; + sh:datatype xsd:int ; + sh:description "Is item open or closed? True = Fully or partially open. False = Fully closed." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + + +val:CabinShape a sh:NodeShape ; + sh:name "Cabin" ; + sh:targetClass bmw:Cabin ; + sh:property [ + sh:name "Light" ; + sh:path bmw:hasPart ; + sh:class bmw:CabinLight ; + sh:node val:CabinLightShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Door" ; + sh:path bmw:hasPart ; + sh:class bmw:CabinDoor ; + sh:node val:CabinDoorShape ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:CabinDoorShape a sh:NodeShape ; + sh:name "Door" ; + sh:targetClass bmw:CabinDoor ; + sh:property [ + sh:path bmw:position ; + sh:name "Row" ; + sh:in ("Row1" "Row2") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:path bmw:position ; + sh:name "Driver" ; + sh:in ("Driver") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Passenger" ; + sh:path bmw:position ; + sh:in ("Passenger") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Window" ; + sh:path bmw:hasPart ; + sh:class bmw:Window ; + sh:node val:WindowShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:WindowShape a sh:NodeShape ; + sh:name "Window" ; + sh:targetClass bmw:Window ; + sh:property [ + sh:name "IsOpen" ; + sh:path bmw:isOpen ; + sh:datatype xsd:boolean ; + sh:description "Is item open or closed? True = Fully or partially open. False = Fully closed." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Position" ; + sh:path bmw:windowPosition ; + sh:datatype xsd:int ; + sh:minInclusive 0 ; + sh:maxInclusive 100 ; + val:unit "percent" ; + sh:description "Item position. 0 = Start position 100 = End position." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Switch" ; + sh:path bmw:switch ; + sh:datatype xsd:string ; + sh:in ("INACTIVE" "CLOSE" "OPEN" "ONE_SHOT_CLOSE" "ONE_SHOT_OPEN") ; + sh:description "Switch controlling sliding action such as window, sunroof, or blind." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:CabinLightShape a sh:NodeShape ; + sh:name "Light" ; + sh:targetClass bmw:CabinLight ; + sh:property [ + sh:name "AmbientLight" ; + sh:path bmw:hasPart ; + sh:class bmw:AmbientLight ; + sh:node val:AmbientLightShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "SpotLight" ; + sh:path bmw:hasPart ; + sh:class bmw:SpotLight ; + sh:node val:SpotLightShape ; + sh:nodeKind sh:IRI ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] . + +val:AmbientLightShape a sh:NodeShape ; + sh:name "AmbientLight" ; + sh:targetClass bmw:AmbientLight ; + sh:property [ + sh:path bmw:position ; + sh:name "Row" ; + sh:in ("Row1" "Row2") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:path bmw:position ; + sh:name "Driver" ; + sh:in ("Driver") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:path bmw:position ; + sh:name "Passenger" ; + sh:in ("Passenger") ; + sh:datatype xsd:string ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Colour" ; + sh:path bmw:lightColor ; + sh:datatype xsd:string ; + sh:description "Hexadecimal color code represented as a 3-byte RGB (i.e. Red, Green, and Blue) value preceded by a hash symbol '#'."; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "Intensity" ; + sh:path bmw:lightIntensity ; + sh:datatype xsd:integer ; + sh:minInclusive 1 ; + sh:maxInclusive 100 ; + val:unit "percent" ; + sh:description "How much of the maximum possible brightness of the light is used. 1 = Maximum attenuation, 100 = No attenuation (i.e. full brightness)." ; + sh:minCount 0 ; + sh:maxCount 1 ; + ] ; + sh:property [ + sh:name "IsLightOn" ; + sh:path bmw:lightIsLightOn ; + sh:datatype xsd:boolean ; + sh:description "Indicates whether the light is turned on. True = On, False = Off." ; + sh:minCount 0 ; + sh:maxCount 1 ; +] . \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md b/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md deleted file mode 100644 index 78db61a..0000000 --- a/cdsp/knowledge-layer/symbolic-reasoner/examples/usecase-model/inputs/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Configuration Websocket-Client supported Data Points - -This module is responsible for handling the configuration of supported data points in the application. It supports a TXT format for defining the data points. - -The `vss_data_required.txt` in this directory contains the data point definitions that websocket-client will use during the initial connection. - -> [!WARNING] -> -> - Before starting the application, ensure that the desired TXT file is correctly placed in this directory. This file should contain the definitions of the supported data points. The name and extension to use can be configured in the `/docker/.env` file, it uses the ENV variable named `REQUIRED_VSS_DATA_POINTS_FILE`. If it is not specified, it uses `vss_data_required.txt` by default, which is one of the files contained in this repository. . -> - Ensure that the used file is correctly formatted and contains valid data points definitions. -> - **The application will not function correctly if the data points file is missing or incorrectly placed.** \ No newline at end of file From ffce704511a960e9b2a206cdcee549aec31441fd Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Wed, 9 Oct 2024 15:40:19 +0200 Subject: [PATCH 35/39] =?UTF-8?q?Configure=20RDFox=20environment=20Remove?= =?UTF-8?q?=20unused=20code=20Merge=20remote-tracking=20branch=20'origin/f?= =?UTF-8?q?eature/enabling-of-knowledgelay=E2=80=A6=20Add=20missing=20incl?= =?UTF-8?q?ude=20to=20data=5Ftypes=20header=20Update=20readmes=20Update=20?= =?UTF-8?q?readme=20Fix=20typo=20with=20correct=20RDFox=20licence=20file.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Christian Muehlbauer --- cdsp/knowledge-layer/CMakeLists.txt | 3 +- cdsp/knowledge-layer/README.md | 4 +- .../connector/utils/data_types.h | 1 + .../symbolic-reasoner/rdfox/README.md | 34 +++- .../rdfox/rdfox-install-test/CMakeLists.txt | 8 + .../rdfox-install-test/rdfox_test_main.cpp | 174 ++++++++++++++++++ docker/.gitignore | 2 + docker/README.md | 53 +++++- docker/docker-compose-cdsp.yml | 35 ++++ 9 files changed, 306 insertions(+), 8 deletions(-) create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp diff --git a/cdsp/knowledge-layer/CMakeLists.txt b/cdsp/knowledge-layer/CMakeLists.txt index 65c8b0e..790867c 100644 --- a/cdsp/knowledge-layer/CMakeLists.txt +++ b/cdsp/knowledge-layer/CMakeLists.txt @@ -31,4 +31,5 @@ set(PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}") add_compile_definitions(PROJECT_ROOT="${PROJECT_ROOT_DIR}") # Add subdirectory for the websocket-client -add_subdirectory(connector/websocket-client) \ No newline at end of file +add_subdirectory(connector/websocket-client) +add_subdirectory(symbolic-reasoner/rdfox/rdfox-install-test) \ No newline at end of file diff --git a/cdsp/knowledge-layer/README.md b/cdsp/knowledge-layer/README.md index 621ebe5..f06c6e0 100644 --- a/cdsp/knowledge-layer/README.md +++ b/cdsp/knowledge-layer/README.md @@ -123,10 +123,10 @@ OBJECT_ID="OBJECT_ID_TO_SUBSCRIBE" ``` ### Start the Websocket Client -After successfully building the client, you can run it with the following command: +After successfully building the client, you can run it with the following command (VIN is required, if any docker for the knowledge layer is running): ```bash -./build/bin/websocket_client +VIN= ./build/bin/websocket_client ``` To display a list of available environment variables and their default values, run the application with the `--help` flag: diff --git a/cdsp/knowledge-layer/connector/utils/data_types.h b/cdsp/knowledge-layer/connector/utils/data_types.h index 008f984..69a124f 100644 --- a/cdsp/knowledge-layer/connector/utils/data_types.h +++ b/cdsp/knowledge-layer/connector/utils/data_types.h @@ -4,6 +4,7 @@ #include #include #include +#include #include struct ReasonerSettings { diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md index fd9e641..350b7b5 100644 --- a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md @@ -1 +1,33 @@ -tbd \ No newline at end of file + +# RDFox Integration + +This folder contains the necessary files to interact with RDFox, a high-performance knowledge graph and reasoning engine used in this project. + +## How to Use RDFox + +For instructions on how to start the RDFox service required for this project, see [this guide](../../../../docker/README.md#rdfox-restful-api). + +### Getting Started + +This project includes a small C++ application to verify that the RDFox service has been configured and started correctly. After compiling the project, you should be able to run the application from [`./rdfox-install-test/rdfox_test_main.cpp`](./rdfox-install-test/rdfox_test_main.cpp). The RDFox Test executable will be generated in the `/cdsp/knowledge-layer/build/bin/` directory. You can run it with the following command: + +```bash +$ ./websocket_client + +# Data store list: +# ?Name ?UniqueID ?Persistent ?Online ?Parameters + +# Data store 'family' does not exist. +# Creating a new data store 'family'. +# Data store created. +# Facts added. +# SPARQL query result: +# ?p ?n +# "Peter" +# "Stewie" +# "Chris" +# "Meg" +# "Lois" + +# Data store 'family' deleted successfully. +``` \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt new file mode 100644 index 0000000..46c588d --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt @@ -0,0 +1,8 @@ +# Define the RDFox test target +add_executable(rdfox_test rdfox_test_main.cpp) + +# Link Boost libraries +target_link_libraries(rdfox_test Boost::system Boost::filesystem Boost::thread) + +# Use defined output directory for the executable +set_target_properties(rdfox_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp new file mode 100644 index 0000000..d452743 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp @@ -0,0 +1,174 @@ +#include +#include +#include +#include +#include +#include +#include + +namespace beast = boost::beast; +namespace http = beast::http; +namespace net = boost::asio; +using tcp = net::ip::tcp; + +const std::string RDFOX_SERVER = "localhost"; +const std::string PORT = "12110"; +const std::string AUTH_HEADER = + "Basic cm9vdDphZG1pbg=="; // Example for 'root:admin' encoded in base64 + +// Helper function to handle response status codes +void assert_response_ok(const http::response& res, const std::string& message) { + if (res.result() != http::status::ok && res.result() != http::status::created && + res.result() != http::status::no_content) { + std::cerr << message << "\nStatus: " << res.result_int() << "\n" << res.body() << std::endl; + throw std::runtime_error("Request failed."); + } +} + +// Function to perform a POST request +http::response post_request(tcp::socket& socket, beast::flat_buffer& buffer, + const std::string& target, const std::string& body, + const std::string& content_type) { + try { + http::request req{http::verb::post, target, 11}; + req.set(http::field::host, RDFOX_SERVER); + req.set(http::field::authorization, AUTH_HEADER); + req.set(http::field::content_type, content_type); + req.set(http::field::connection, "keep-alive"); // Keep connection alive + req.body() = body; + req.prepare_payload(); + + http::write(socket, req); + http::response res; + http::read(socket, buffer, res); + + return res; + } catch (const std::exception& e) { + std::cerr << "Error in POST request: " << e.what() << std::endl; + throw; + } +} + +// Function to perform a GET request +http::response get_request(tcp::socket& socket, beast::flat_buffer& buffer, + const std::string& target, + const std::string& accept_type) { + try { + http::request req{http::verb::get, target, 11}; + req.set(http::field::host, RDFOX_SERVER); + req.set(http::field::authorization, AUTH_HEADER); + req.set(http::field::accept, accept_type); + req.set(http::field::connection, "keep-alive"); // Keep connection alive + + http::write(socket, req); + http::response res; + http::read(socket, buffer, res); + + return res; + } catch (const std::exception& e) { + std::cerr << "Error in GET request: " << e.what() << std::endl; + throw; + } +} + +// Function to perform a DELETE request +http::response delete_request(tcp::socket& socket, beast::flat_buffer& buffer, + const std::string& target) { + try { + http::request req{http::verb::delete_, target, 11}; + req.set(http::field::host, RDFOX_SERVER); + req.set(http::field::authorization, AUTH_HEADER); + req.set(http::field::connection, "keep-alive"); // Keep connection alive + + http::write(socket, req); + http::response res; + http::read(socket, buffer, res); + + return res; + } catch (const std::exception& e) { + std::cerr << "Error in DELETE request: " << e.what() << std::endl; + throw; + } +} + +// Main function to use persistent connections +int main() { + try { + net::io_context ioc; + tcp::resolver resolver(ioc); + tcp::socket socket(ioc); + auto const results = resolver.resolve(RDFOX_SERVER, PORT); + net::connect(socket, results.begin(), results.end()); + beast::flat_buffer buffer; + + std::string store_name = "family"; + + // Step 1: Check if the 'family' data store exists and delete it if necessary + auto res = get_request(socket, buffer, "/datastores", "application/json"); + assert_response_ok(res, "Failed to obtain list of datastores."); + std::cout << "Data store list:\n" << res.body() << std::endl; + + if (res.body().find(store_name) != std::string::npos) { + std::cout << "Data store '" << store_name << "' exists. Deleting..." << std::endl; + res = delete_request(socket, buffer, "/datastores/" + store_name); + assert_response_ok(res, "Failed to delete data store."); + std::cout << "Data store '" << store_name << "' deleted successfully." << std::endl; + } else { + std::cout << "Data store '" << store_name << "' does not exist." << std::endl; + } + + // Step 2: Create a new data store + std::cout << "Creating a new data store '" << store_name << "'." << std::endl; + res = post_request(socket, buffer, "/datastores/family?type=parallel-ww", "", + "application/json"); + assert_response_ok(res, "Failed to create datastore."); + std::cout << "Data store created." << std::endl; + + // Step 3: Add facts in Turtle format + std::string turtle_data = R"( + @prefix : . + :peter :forename "Peter" ; + a :Person ; + :marriedTo :lois ; + :gender "male" . + :lois :forename "Lois" ; + a :Person ; + :gender "female" . + :meg :forename "Meg" ; + a :Person ; + :hasParent :lois, :peter ; + :gender "female" . + :chris :forename "Chris" ; + a :Person ; + :hasParent :peter ; + :gender "male" . + :stewie :forename "Stewie" ; + a :Person ; + :hasParent :lois ; + :gender "male" . + :brian :forename "Brian" . + )"; + res = + post_request(socket, buffer, "/datastores/family/content", turtle_data, "text/turtle"); + assert_response_ok(res, "Failed to add facts to data store."); + std::cout << "Facts added." << std::endl; + + // Step 4: Run a SPARQL query + std::string sparql_query = R"( + PREFIX : + SELECT ?p ?n WHERE { ?p a :Person . ?p :forename ?n } + )"; + res = post_request(socket, buffer, "/datastores/family/sparql", sparql_query, + "application/sparql-query"); + assert_response_ok(res, "Failed to run SPARQL query."); + std::cout << "SPARQL query result:\n" << res.body() << std::endl; + + res = delete_request(socket, buffer, "/datastores/" + store_name); + assert_response_ok(res, "Failed to delete data store."); + std::cout << "Data store '" << store_name << "' deleted successfully." << std::endl; + + } catch (const std::exception& e) { + std::cerr << "Exception: " << e.what() << std::endl; + } + return 0; +} \ No newline at end of file diff --git a/docker/.gitignore b/docker/.gitignore index 1881067..ed6d4c4 100644 --- a/docker/.gitignore +++ b/docker/.gitignore @@ -1,6 +1,8 @@ # Docker generated files data/ logs/ +test-model/ +rdfox/ # Enviroment variables containing secrets .env \ No newline at end of file diff --git a/docker/README.md b/docker/README.md index 297d06e..ee1d23c 100644 --- a/docker/README.md +++ b/docker/README.md @@ -6,7 +6,8 @@ The compose file `docker-compose-cdsp.yml` provides a containerized deployment o ## Table of contents - [Docker installation](#docker-installation) - [VISSR docker image build setup](#vissr-docker-image-build-setup) -- [Websocket-Server docker image build setup](#websocket-server-docker-image-build-setup) +- [Websocket-Server (CDSP - information layer) docker image build setup](#websocket-server-cdsp---information-layer-docker-image-build-setup) +- [Websocket-Client (CDSP - knowledge layer) docker image build setup](#websocket-client-cdsp---knowledge-layer-docker-image-build-setup) - [Deploy with Docker Compose](#deploy-with-docker-compose) ## Docker installation @@ -109,8 +110,7 @@ $ sudo docker compose -f docker-compose-cdsp.yml up -d iotdb-service # ✔ Container iotdb-service Running 0.0s ``` -## Websocket-Server docker image build setup - +## Websocket-Server (CDSP - information layer) docker image build setup This guide provides instructions for deploying the Websocket-Server using Docker Compose. You can choose to deploy the server with either RealmDB or IoTDB as the backend service. ### Prerequisites @@ -137,7 +137,8 @@ $ sudo docker compose -f docker-compose-cdsp.yml up -d websocket-service When deploying with IoTDB, ensure that the iotdb-service is up and running before starting the Websocket-Server. -> [!IMPORTANT] If required, ensure that the iotdb-service container is started before running the Websocket-Server. You can also configure your own IoTDB connection. +> [!IMPORTANT] +> If required, ensure that the iotdb-service container is started before running the Websocket-Server. You can also configure your own IoTDB connection. #### Start IoTDB and Websocket-Server @@ -166,6 +167,50 @@ CONTAINER ID IMAGE COMMAND CREATED e16c8ed4ed42 apache/iotdb:1.2.2-standalone "/usr/bin/dumb-init …" 23 minutes ago Up 19 minutes 0.0.0.0:6667->6667/tcp, :::6667->6667/tcp iotdb-service ``` +## Websocket client (CDSP - knowledge layer) docker image build setup + +### RDFox RESTful API + +In order to get access to `RDFox RESTfull API` it is required to build two Docker images (`rdfox-init` and `rdfox-service`). + +### Prerequisites + +- **Running Websocket-Server:** See how to start the information layer [here](#websocket-server-cdsp---information-layer-docker-image-build-setup). +- **RDFox.lic:** this is the license file required by RDFox, containing information that authorizes the use of RDFox, expiry time and usage. **The license file must be provided when running RDFox images to activate the software.**. The path of the file should be provided using the environment variable `RDFOX_LIC_PATH="/RDFox.lic"` in the `.env` file in this folder. The file is generally provided when you acquire a license from [Oxford Semantic Technologies](https://www.oxfordsemantic.tech/). + +#### 1. **Initialization (`rdfox-init` Image)**: +- The `rdfox-init` image is used to set up the RDFox server directory, define roles, and configure persistence. +- It only needs to be run **once** for a fresh setup or if you need to reset the server's configuration (e.g., to initialize roles, passwords, and persistence settings). +- Running this command creates a persistent volume (`rdfox-server-directory`) that stores RDFox's state, including the role configuration, data stores, and settings. + +> [!IMPORTANT] +> The image `rdfox-init` need to run only ones to initialize the RDFox server directory. + +#### 2. **Daemon (`rdfox-service` Image)**: +- The `rdfox-service` image runs the **RDFox server (daemon)**, which continuously serves requests on port 12110. +- Once initialized, you can start this container (as a daemon) and it will use the `rdfox-server-directory` volume created by the `rdfox-init` command. +- You can restart the daemon multiple times using the same persistent volume, and it will retain all previously initialized settings and data. +- The daemon is initialized with a default role `root` and password `admin`. + +> [!WARNING] +> Before build the `rdfox-service`, ensure that the `rdfox-init` were compiled correctly. Only if the logs show successful completion, you can then proceed to start the RDFox daemon. + +Use the following commands to start both images: + +```shell +$ docker compose -f docker-compose-cdsp.yml up -d rdfox-init +# ... +# [+] Running 2/2 +# ✔ Volume "cdsp_rdfox-server-directory" created 0.0s +# ✔ Container rdfox-init Started 0.4s + +$ docker compose -f docker-compose-cdsp.yml up -d rdfox-service +# ... +# [+] Running 2/2 +# ✔ Container rdfox-init Started 0.4s +# ✔ Container rdfox-service Started 0.9s +``` + ## Deploy with Docker Compose ### Start/stop containers Start the containers: diff --git a/docker/docker-compose-cdsp.yml b/docker/docker-compose-cdsp.yml index 5976d11..ef45dfe 100644 --- a/docker/docker-compose-cdsp.yml +++ b/docker/docker-compose-cdsp.yml @@ -42,6 +42,38 @@ services: env_file: - .env + # RDFox Initialization (run once) + rdfox-init: + image: oxfordsemantic/rdfox-init:latest + container_name: rdfox-init + platform: linux/amd64 + volumes: + - ${RDFOX_LIC_PATH}:/opt/RDFox/RDFox.lic # License file on host + - rdfox-server-directory:/home/rdfox/.RDFox + environment: + - RDFOX_ROLE=root + - RDFOX_PASSWORD=admin + command: | + -persistence file + restart: "no" + + # RDFox Daemon (persistent service) + rdfox-service: + image: oxfordsemantic/rdfox:latest + container_name: rdfox-service + platform: linux/amd64 + depends_on: + - rdfox-init + ports: + - "12110:12110" + volumes: + - ${RDFOX_LIC_PATH}:/opt/RDFox/RDFox.lic # License file on host + - rdfox-server-directory:/home/rdfox/.RDFox + environment: + - RDFOX_ROLE=root + - RDFOX_PASSWORD=admin + command: daemon + # VISSR acting as VISS Data Server tmp: @@ -85,3 +117,6 @@ services: - ./logs/vssr:/app/logs volumes_from: - tmp + +volumes: + rdfox-server-directory: From 24b871e4ea683506233ba12b757f78fa0966bf72 Mon Sep 17 00:00:00 2001 From: q632394 Date: Thu, 17 Oct 2024 11:32:28 +0200 Subject: [PATCH 36/39] Develop RDFox adapter for rest api integration Establish Connection to RDFox REST API Data Store Management Data Loading in Turtle Format SPARQL Query Execution Error Handling Unit and Integration Tests Documentation Updates Signed-off-by: Haonan Qiu --- cdsp/knowledge-layer/CMakeLists.txt | 5 +- .../connector/utils/data_types.h | 10 +- .../connector/utils/helper.cpp | 2 + .../connector/websocket-client/CMakeLists.txt | 8 +- .../connector/websocket-client/main.cpp | 38 ++-- .../websocket-client/websocket_client.cpp | 6 +- .../symbolic-reasoner/rdfox/README.md | 6 +- .../rdfox/rdfox-adapter/README.md | 1 - .../CMakeLists.txt | 4 +- .../rdfox_test_main.cpp | 0 .../symbolic-reasoner/rdfox/src/README.md | 25 +++ .../rdfox/src/rdfox-adapter.cpp | 179 ++++++++++++++++ .../rdfox/src/rdfox-adapter.h | 42 ++++ .../rdfox/tests/CMakeLists.txt | 38 ++++ .../tests/test_rdfox_adapter_integration.cpp | 78 +++++++ .../rdfox/tests/test_rdfox_adapter_unit.cpp | 193 ++++++++++++++++++ docker/docker-compose-cdsp.yml | 6 + 17 files changed, 617 insertions(+), 24 deletions(-) delete mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md rename cdsp/knowledge-layer/symbolic-reasoner/rdfox/{rdfox-install-test => rdfox-service-test}/CMakeLists.txt (84%) rename cdsp/knowledge-layer/symbolic-reasoner/rdfox/{rdfox-install-test => rdfox-service-test}/rdfox_test_main.cpp (100%) create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/README.md create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.cpp create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.h create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/CMakeLists.txt create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_integration.cpp create mode 100644 cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_unit.cpp diff --git a/cdsp/knowledge-layer/CMakeLists.txt b/cdsp/knowledge-layer/CMakeLists.txt index 790867c..e7e16b9 100644 --- a/cdsp/knowledge-layer/CMakeLists.txt +++ b/cdsp/knowledge-layer/CMakeLists.txt @@ -30,6 +30,9 @@ set(PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}") # Pass the root directory to your C++ code add_compile_definitions(PROJECT_ROOT="${PROJECT_ROOT_DIR}") +enable_testing() + # Add subdirectory for the websocket-client add_subdirectory(connector/websocket-client) -add_subdirectory(symbolic-reasoner/rdfox/rdfox-install-test) \ No newline at end of file +add_subdirectory(symbolic-reasoner/rdfox/rdfox-service-test) +add_subdirectory(symbolic-reasoner/rdfox/tests) \ No newline at end of file diff --git a/cdsp/knowledge-layer/connector/utils/data_types.h b/cdsp/knowledge-layer/connector/utils/data_types.h index 69a124f..2b4950d 100644 --- a/cdsp/knowledge-layer/connector/utils/data_types.h +++ b/cdsp/knowledge-layer/connector/utils/data_types.h @@ -24,10 +24,16 @@ struct ModelConfig { ReasonerSettings reasoner_settings; }; +struct ServerData { + std::string host; + std::string port; + std::string auth_base64; +}; + struct InitConfig { std::string uuid; - std::string host_websocket_server; - std::string port_websocket_server; + ServerData websocket_server; + ServerData rdfox_server; std::string oid; ModelConfig model_config; }; diff --git a/cdsp/knowledge-layer/connector/utils/helper.cpp b/cdsp/knowledge-layer/connector/utils/helper.cpp index c5561a7..6df262b 100644 --- a/cdsp/knowledge-layer/connector/utils/helper.cpp +++ b/cdsp/knowledge-layer/connector/utils/helper.cpp @@ -1,5 +1,7 @@ #include "helper.h" +#include + /** * @brief Converts a given string to lowercase. * diff --git a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt index a0b2dc9..ab27158 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt +++ b/cdsp/knowledge-layer/connector/websocket-client/CMakeLists.txt @@ -1,5 +1,11 @@ # Define the WebSocket client target -add_executable(websocket_client main.cpp websocket_client.cpp ../utils/message_utils.cpp ../utils/helper.cpp ../utils/model_config.cpp) +add_executable( + websocket_client main.cpp + websocket_client.cpp + ../utils/message_utils.cpp + ../utils/helper.cpp + ../utils/model_config.cpp +) # Link libraries target_link_libraries(websocket_client Boost::system Boost::filesystem Boost::thread) diff --git a/cdsp/knowledge-layer/connector/websocket-client/main.cpp b/cdsp/knowledge-layer/connector/websocket-client/main.cpp index 0d96b29..ed0cbeb 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/main.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/main.cpp @@ -18,6 +18,9 @@ std::string DefaultHostWebsocketServer{"127.0.0.1"}; std::string DefaultPortWebSocketServer{"8080"}; std::string ModelConfigurationFile{std::string(PROJECT_ROOT) + "/symbolic-reasoner/examples/use-case/model/model_config.json"}; +std::string DefaultRDFoxServer{"127.0.0.1"}; +std::string DefaultPortRDFoxServer{"12110"}; +std::string DefaultAuthRDFoxServerBase64{"cm9vdDphZG1pbg=="}; // For 'root:admin' encoded in base64 std::string getEnvVariable(const std::string& envVar, const std::string& defaultValue = "") { const char* valueEnv = std::getenv(envVar.c_str()); @@ -34,24 +37,28 @@ void displayHelp() { std::cout << "This table contains a lists environment variables set for the WebSocket client " "and their descriptions.\n\n"; // Table header - std::cout << bold << std::left << std::setw(50) << "Variable" << std::setw(50) << "Description" + std::cout << bold << std::left << std::setw(35) << "Variable" << std::setw(65) << "Description" << "Value" << reset << "\n"; std::cout << std::string(140, '-') << "\n"; // Line separator - std::cout << std::left << std::setw(50) << "HOST_WEBSOCKET_SERVER" << std::setw(50) + std::cout << std::left << std::setw(35) << "HOST_WEBSOCKET_SERVER" << std::setw(65) << "IP address of the WebSocket server" - << getEnvVariable(" - HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer) << "\n"; - std::cout << std::left << std::setw(50) << "PORT_WEBSOCKET_SERVER" << std::setw(50) + << getEnvVariable("HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer) << "\n"; + std::cout << std::left << std::setw(35) << "PORT_WEBSOCKET_SERVER" << std::setw(65) << "Port number of the WebSocket server" - << getEnvVariable(" - PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer) << "\n"; - std::cout << std::left << std::setw(50) << "VIN" << std::setw(50) + << getEnvVariable("PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer) << "\n"; + std::cout << std::left << std::setw(35) << "OBJECT_ID" << std::setw(65) << "Object ID to be used in communication" - << getEnvVariable("VIN", lightRed + "`Not Set (Required)`" + reset) << "\n"; - std::cout << std::left << std::setw(50) << "REQUIRED_VSS_DATA_POINTS_FILE" << std::setw(50) - << "Path to the model configuration file" - << getEnvVariable(" - REQUIRED_VSS_DATA_POINTS_FILE", - DefaultRequiredVSSDataPointsFile) - << "\n"; + << getEnvVariable("OBJECT_ID", lightRed + "`Not Set (Required)`" + reset) << "\n"; + std::cout << std::left << std::setw(35) << "HOST_RDFOX_SERVER" << std::setw(65) + << "IP address of the RDFox server" + << getEnvVariable("HOST_RDFOX_SERVER", DefaultRDFoxServer) << "\n"; + std::cout << std::left << std::setw(35) << "PORT_RDFOX_SERVER" << std::setw(65) + << "Port number of the RDFox server" + << getEnvVariable("PORT_RDFOX_SERVER", DefaultPortRDFoxServer) << "\n"; + std::cout << std::left << std::setw(35) << "AUTH_RDFOX_SERVER_BASE64" << std::setw(65) + << "Authentication credentials for RDFox Server encoded in base64" + << getEnvVariable("AUTH_RDFOX_SERVER_BASE64", DefaultAuthRDFoxServerBase64) << "\n"; std::cout << "\n" << bold << "Description:\n" << reset; std::cout << "This client connects to a WebSocket server and processes incoming messages based " @@ -74,13 +81,16 @@ InitConfig AddInitConfig() { loadModelConfig(ModelConfigurationFile, model_config); InitConfig init_config; - init_config.host_websocket_server = + init_config.websocket_server.host = getEnvVariable("HOST_WEBSOCKET_SERVER", DefaultHostWebsocketServer); - init_config.port_websocket_server = + init_config.websocket_server.port = getEnvVariable("PORT_WEBSOCKET_SERVER", DefaultPortWebSocketServer); init_config.uuid = boost::uuids::to_string(uuidGenerator()); init_config.oid = getEnvVariable("OBJECT_ID"); init_config.model_config = model_config; + init_config.rdfox_server.host = getEnvVariable("HOST_RDFOX_SERVER"); + init_config.rdfox_server.port = getEnvVariable("PORT_RDFOX_SERVER"); + init_config.rdfox_server.auth_base64 = getEnvVariable("AUTH_RDFOX_SERVER_BASE64"); return init_config; } diff --git a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp index 527a718..af9f2ad 100644 --- a/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp +++ b/cdsp/knowledge-layer/connector/websocket-client/websocket_client.cpp @@ -31,7 +31,7 @@ WebSocketClient::WebSocketClient(const InitConfig& init_config) void WebSocketClient::run() { resolver_.async_resolve( - init_config_.host_websocket_server, init_config_.port_websocket_server, + init_config_.websocket_server.host, init_config_.websocket_server.port, beast::bind_front_handler(&WebSocketClient::onResolve, shared_from_this())); // Run the io_context to process asynchronous events @@ -52,7 +52,7 @@ void WebSocketClient::onConnect(boost::system::error_code ec, return Fail(ec, "Connection failed:"); } - ws_.async_handshake(init_config_.host_websocket_server, "/", + ws_.async_handshake(init_config_.websocket_server.host, "/", beast::bind_front_handler(&WebSocketClient::handshake, shared_from_this())); } @@ -60,7 +60,7 @@ void WebSocketClient::handshake(beast::error_code ec) { if (ec) { return Fail(ec, "Handshake failed:"); } - std::cout << "Connected to WebSocket server: " << init_config_.host_websocket_server + std::cout << "Connected to WebSocket server: " << init_config_.websocket_server.host << std::endl << std::endl; diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md index 350b7b5..5d8d99d 100644 --- a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/README.md @@ -7,9 +7,13 @@ This folder contains the necessary files to interact with RDFox, a high-performa For instructions on how to start the RDFox service required for this project, see [this guide](../../../../docker/README.md#rdfox-restful-api). +### RDFox Adapter + +See how to interact with the RDFox server using the [RDFox adapter](./src/README.md#rdfoxadapter). + ### Getting Started -This project includes a small C++ application to verify that the RDFox service has been configured and started correctly. After compiling the project, you should be able to run the application from [`./rdfox-install-test/rdfox_test_main.cpp`](./rdfox-install-test/rdfox_test_main.cpp). The RDFox Test executable will be generated in the `/cdsp/knowledge-layer/build/bin/` directory. You can run it with the following command: +This project includes a small C++ application to verify that the RDFox service has been configured and started correctly. After compiling the project, you should be able to run the application from [`./rdfox-service-test/rdfox_test_main.cpp`](./rdfox-service-test/rdfox_test_main.cpp). The RDFox Test executable will be generated in the `/cdsp/knowledge-layer/build/bin/` directory. You can run it with the following command: ```bash $ ./websocket_client diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md deleted file mode 100644 index fd9e641..0000000 --- a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-adapter/README.md +++ /dev/null @@ -1 +0,0 @@ -tbd \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-service-test/CMakeLists.txt similarity index 84% rename from cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt rename to cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-service-test/CMakeLists.txt index 46c588d..2f60cab 100644 --- a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/CMakeLists.txt +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-service-test/CMakeLists.txt @@ -1,5 +1,7 @@ # Define the RDFox test target -add_executable(rdfox_test rdfox_test_main.cpp) +add_executable( + rdfox_test rdfox_test_main.cpp +) # Link Boost libraries target_link_libraries(rdfox_test Boost::system Boost::filesystem Boost::thread) diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-service-test/rdfox_test_main.cpp similarity index 100% rename from cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-install-test/rdfox_test_main.cpp rename to cdsp/knowledge-layer/symbolic-reasoner/rdfox/rdfox-service-test/rdfox_test_main.cpp diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/README.md b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/README.md new file mode 100644 index 0000000..099f931 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/README.md @@ -0,0 +1,25 @@ +# RDFoxAdapter + +The RDFoxAdapter class provides an interface for interacting with an RDFox server over HTTP. It enables operations like checking the existence of a datastore, creating a datastore, loading data in Turtle format, querying using SPARQL, and deleting a datastore. + +> [!NOTE] Data store +> When the RDFoxAdapter initializes creates (if is does not exists) a datastore called `vehicle_ds` in the RDFox server. + +## Features + +- **Initialize a Datastore:** Checks if a specified datastore exists on the RDFox server. If not, it creates the datastore. +- **Load Data:** Loads Turtle data into a specified datastore. +- **Query Data:** Executes SPARQL queries against the RDFox datastore and retrieves results. +- **Delete Datastore:** Removes a specified datastore from the RDFox server. +- **Send HTTP Requests:** Supports sending GET and POST HTTP requests to interact with RDFox. + +## Methods + +- **initialize():** Ensures the datastore is present; creates it if missing. +- **loadData(const std::string& ttl_data):** Loads Turtle data into the datastore. +- **queryData(const std::string& sparql_query):** Executes a SPARQL query and returns the result. +- **deleteDataStore():** Deletes the datastore if it exists. + +> [!NOTE] See test +> - [../tests/test_rdfox_adapter_integration.cpp](../tests/test_rdfox_adapter_integration.cpp) +> - [../tests/test_rdfox_adapter_unit.cpp](../tests/test_rdfox_adapter_unit.cpp) \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.cpp b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.cpp new file mode 100644 index 0000000..cdf2622 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.cpp @@ -0,0 +1,179 @@ +#include "rdfox-adapter.h" + +#include + +RDFoxAdapter::RDFoxAdapter(const std::string& host, const std::string& port, + const std::string& auth_base64, + const std::string& data_store = "vehicle_ds") + : host_(host), + port_(port), + auth_header_base64_("Basic " + auth_base64), + data_store_(data_store) { + std::cout << "Initializing RDFox adapter..." << std::endl; +} + +/** + * @brief Initializes the RDFoxAdapter by ensuring the data store is created. + * + * This method checks if the data store specified by `data_store_` exists. + * If the data store exists, it logs a message indicating its existence. + * If the data store does not exist, it attempts to create it by sending + * a POST request to the appropriate endpoint. If the creation is successful, + * a success message is logged. Otherwise, an exception is thrown. + * + * @throws std::runtime_error if the data store creation fails. + */ +void RDFoxAdapter::initialize() { + // checks if the data store exists, create it if not + if (checkDataStore()) { + std::cout << "Data store '" + data_store_ + "' is already created." << std::endl; + } else { + std::cout << "Data store '" << data_store_ << "' does not exist. Creating it..." + << std::endl; + // Creates a data store + std::string target = "/datastores/" + data_store_; + if (sendPostRequest(target, "", "application/json")) { + std::cout << "Data store '" << data_store_ << "' created successfully." << std::endl; + } else { + throw std::runtime_error("Failed to create datastore '" + data_store_ + "'"); + } + } +} + +/** + * Loads Turtle data into the RDFox datastore. + * + * @param ttl_data A string containing the Turtle data to be loaded into the datastore. + * @return A boolean value indicating whether the data was successfully loaded. + */ +bool RDFoxAdapter::loadData(const std::string& ttl_data) { + std::string target = "/datastores/" + data_store_ + "/content"; + return sendPostRequest(target, ttl_data, "text/turtle") ? true : false; +}; + +/** + * Executes a SPARQL query against the RDFox datastore. + * + * @param sparql_query The SPARQL query string to be executed. + * @return The response from the datastore as a string if the query is successful, + * otherwise an empty string. + */ +std::string RDFoxAdapter::queryData(const std::string& sparql_query) { + std::string target = "/datastores/" + data_store_ + "/sparql"; + auto response = sendPostRequest(target, sparql_query, "application/sparql-query"); + return response.has_value() ? response.value() : ""; +} + +bool RDFoxAdapter::deleteDataStore() { + if (checkDataStore()) { + std::string target = "/datastores/" + data_store_; + std::string responseBody; + if (sendRequest(http::verb::delete_, target, "", "", "", responseBody)) { + std::cout << "Data store '" + data_store_ + "' have been removed successfully." + << std::endl; + } else { + std::cout << "Data store '" + data_store_ + "' could not be removed." << std::endl; + return false; + } + } else { + std::cout << "Data store '" + data_store_ + "' does not exists anymore." << std::endl; + } + return true; +} + +/** + * @brief Checks if the data store exists on the server. + * + * @return true if the data store is found in the server's response; false otherwise. + */ +bool RDFoxAdapter::checkDataStore() { + std::string target = "/datastores"; + std::string response = sendGetRequest(target, "text/csv; charset=UTF-8"); + if (response.find(data_store_) != std::string::npos) { + return true; + } else { + return false; + } +} + +std::optional RDFoxAdapter::sendPostRequest(const std::string& target, + const std::string& body, + const std::string& contentType) { + std::string responseBody; + if (sendRequest(http::verb::post, target, body, contentType, "", responseBody)) { + return responseBody; + } + return std::nullopt; +} + +std::string RDFoxAdapter::sendGetRequest(const std::string& target, const std::string& acceptType) { + std::string responseBody; + if (sendRequest(http::verb::get, target, "", "", acceptType, responseBody)) { + return responseBody; + } + return ""; +} + +/** + * Sends an HTTP request to a specified target and retrieves the response. + * + * @param method The HTTP method to use for the request (e.g., GET, POST). + * @param target The target URI for the request. + * @param body The body content to send with the request. + * @param contentType The MIME type of the body content. + * @param acceptType The MIME type that the client is willing to accept in the response. + * @param responseBody A reference to a string where the response body will be stored. + * @return True if the request was successful and the response status is OK, Created, or No Content; + * false otherwise. + */ +bool RDFoxAdapter::sendRequest(http::verb method, const std::string& target, + const std::string& body, const std::string& contentType, + const std::string& acceptType, std::string& responseBody) { + net::io_context ioc; + tcp::resolver resolver(ioc); + tcp::socket socket(ioc); + + try { + // Resolve and connect to the host + auto const results = resolver.resolve(host_, port_); + net::connect(socket, results.begin(), results.end()); + + // Set up the HTTP request + http::request req{method, target, 11}; + req.set(http::field::host, host_); + req.set(http::field::authorization, auth_header_base64_); + if (!contentType.empty()) { + req.set(http::field::content_type, contentType); + } + if (!acceptType.empty()) { + req.set(http::field::accept, acceptType); + } + req.body() = body; + req.prepare_payload(); + + // Send the request and receive the response + http::write(socket, req); + beast::flat_buffer buffer; + http::response res; + http::read(socket, buffer, res); + + responseBody = res.body(); + + if (res.result() != http::status::ok && res.result() != http::status::created && + res.result() != http::status::no_content) { + std::cerr << createErrorMessage(res.body(), res.result_int()) << std::endl; + return false; + } + return true; + } catch (const beast::system_error& e) { + std::cerr << "Network error: " << e.what() << std::endl; + return false; + } catch (const std::exception& e) { + std::cerr << "Error in request: " << e.what() << std::endl; + return false; + } +} + +std::string RDFoxAdapter::createErrorMessage(const std::string& error_msg, int error_code) { + return error_msg + " (Code: " + std::to_string(error_code) + ")"; +} diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.h b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.h new file mode 100644 index 0000000..66bcfb1 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/src/rdfox-adapter.h @@ -0,0 +1,42 @@ +#ifndef RDFOX_ADAPTER_H +#define RDFOX_ADAPTER_H + +#include +#include +#include +#include + +namespace beast = boost::beast; +namespace http = beast::http; +namespace net = boost::asio; +using tcp = net::ip::tcp; + +class RDFoxAdapter { + public: + RDFoxAdapter(const std::string& host, const std::string& port, const std::string& auth_base64, + const std::string& data_store); + + void initialize(); + bool loadData(const std::string& ttl_data); + std::string queryData(const std::string& sparql_query); + bool checkDataStore(); + bool deleteDataStore(); + + protected: + virtual bool sendRequest(http::verb method, const std::string& target, const std::string& body, + const std::string& contentType, const std::string& acceptType, + std::string& responseBody); + + private: + std::string sendGetRequest(const std::string& target, const std::string& accept_type); + std::optional sendPostRequest(const std::string& target, const std::string& body, + const std::string& content_type); + + std::string createErrorMessage(const std::string& error_msg, int error_code); + std::string host_; + std::string port_; + std::string auth_header_base64_; + std::string data_store_; +}; + +#endif // RDFOX_ADAPTER_H \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/CMakeLists.txt b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/CMakeLists.txt new file mode 100644 index 0000000..f52b87c --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/CMakeLists.txt @@ -0,0 +1,38 @@ +# GoogleTest integration +include(FetchContent) +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG v1.15.2 +) +# Disable installing gtest (we don't need to install it) +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +# Add the RDFox adapter source files +add_library(rdfox_adapter STATIC ../src/rdfox-adapter.cpp) +target_include_directories(rdfox_adapter PUBLIC ../src) +target_link_libraries(rdfox_adapter Boost::system Boost::filesystem Boost::thread nlohmann_json) + +# Add the unit test executable +add_executable(rdfox_unit_tests test_rdfox_adapter_unit.cpp) +target_include_directories(rdfox_unit_tests PUBLIC ../src) +target_link_libraries(rdfox_unit_tests GTest::gtest GTest::gtest_main GTest::gmock rdfox_adapter) + +# Add the integration test executable +add_executable(rdfox_integration_tests test_rdfox_adapter_integration.cpp) +target_include_directories(rdfox_integration_tests PUBLIC ../src) +target_link_libraries(rdfox_integration_tests GTest::gtest GTest::gtest_main rdfox_adapter) + +# Add unit and integration tests to CTest +add_test(NAME RDFoxAdapterUnitTests COMMAND rdfox_unit_tests) +add_test(NAME RDFoxAdapterIntegrationTests COMMAND rdfox_integration_tests) + +# Define custom output directory for test binaries +set_target_properties(rdfox_unit_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +set_target_properties(rdfox_integration_tests PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + +# Ensure tests are built with the all target +add_custom_target(tests ALL + DEPENDS rdfox_unit_tests rdfox_integration_tests +) \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_integration.cpp b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_integration.cpp new file mode 100644 index 0000000..8cb8a74 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_integration.cpp @@ -0,0 +1,78 @@ +#include + +#include + +#include "../src/rdfox-adapter.h" + +class RDFoxAdapterIntegrationTest : public ::testing::Test { + protected: + RDFoxAdapter* adapter; + + std::string host = "localhost"; + std::string port = "12110"; + std::string auth_base64 = "cm9vdDphZG1pbg=="; // Base64 encoded authorization string + std::string data_store = "test_ds"; + + void SetUp() override { + adapter = new RDFoxAdapter(host, port, auth_base64, data_store); + adapter->initialize(); + + // Initial load to ensure datastore is accessible + if (!adapter->checkDataStore()) { + FAIL() << "Failed to ensure the data store is set up."; + } + } + + void TearDown() override { + // Delete the test data store after all tests have completed + // ASSERT_TRUE(adapter->deleteDataStore()) << "Failed to clean up the test data store."; + adapter->deleteDataStore(); + + // Clean up the adapter instance + delete adapter; + } +}; + +// Integration Test: Ensure RDFoxAdapter can create a data store and retrieve it +TEST_F(RDFoxAdapterIntegrationTest, DataStoreInitializationTest) { + // This test is implicitly done during the setup phase of RDFoxAdapter + // If the data store exists or is created, no error will be thrown + // You can further assert behavior here if needed + SUCCEED(); +} + +TEST_F(RDFoxAdapterIntegrationTest, LoadDataTest) { + std::string ttlData = R"( + @prefix bmw: . + bmw:Vehicle1 a bmw:Vehicle . + )"; + + // Try loading data into the data store + ASSERT_TRUE(adapter->loadData(ttlData)) << "Failed to load Turtle data into the store"; +} + +TEST_F(RDFoxAdapterIntegrationTest, QueryDataTest) { + std::string ttlData = R"( + @prefix bmw: . + bmw:Vehicle1 a bmw:Vehicle . + )"; + ASSERT_TRUE(adapter->loadData(ttlData)) << "Failed to load Turtle data into the store"; + + std::string sparqlQuery = "SELECT ?s ?p ?o WHERE { ?s ?p ?o }"; + std::string result = adapter->queryData(sparqlQuery); + + ASSERT_FALSE(result.empty()) << "SPARQL query returned no results"; + EXPECT_TRUE(result.find("") != std::string::npos) + << "Result does not contain the expected subject."; + EXPECT_TRUE(result.find("") != + std::string::npos) + << "Result does not contain the expected predicate."; + EXPECT_TRUE(result.find("") != std::string::npos) + << "Result does not contain the expected object."; +} + +TEST_F(RDFoxAdapterIntegrationTest, DeleteDataStoreTest) { + ASSERT_TRUE(adapter->checkDataStore()) << "Any data store has been created."; + ASSERT_TRUE(adapter->deleteDataStore()) << "Failed to delete the data store."; + ASSERT_FALSE(adapter->checkDataStore()) << "The datastore might still exist or be recreated."; +} \ No newline at end of file diff --git a/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_unit.cpp b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_unit.cpp new file mode 100644 index 0000000..7834418 --- /dev/null +++ b/cdsp/knowledge-layer/symbolic-reasoner/rdfox/tests/test_rdfox_adapter_unit.cpp @@ -0,0 +1,193 @@ +#include +#include + +#include "../src/rdfox-adapter.h" + +class MockRDFoxAdapter : public RDFoxAdapter { + public: + MockRDFoxAdapter() : RDFoxAdapter("localhost", "8080", "test_auth", "test_ds") {} + + MOCK_METHOD6(sendRequest, bool(http::verb, const std::string&, const std::string&, + const std::string&, const std::string&, std::string&)); +}; + +// Test checking nonexistent RDFox datastore. +TEST(RDFoxAdapterTest, CheckNonexistentDatastore) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking nonexistent datastore. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>(""), testing::Return(false))); + + EXPECT_FALSE(mock_adapter.checkDataStore()); +} + +// Test checking existent RDFox datastore. +TEST(RDFoxAdapterTest, CheckExistentDatastore) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking existent datastore. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>("test_ds"), testing::Return(true))); + + EXPECT_TRUE(mock_adapter.checkDataStore()); +} + +// Test the initialization of the RDFoxAdapter and creation of the datastore. +TEST(RDFoxAdapterTest, InitializationCreatesDatastore) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking datastore does not exists. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>(""), testing::Return(false))); + + // Mock the sendRequest for creating the datastore. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds", "", + "application/json", "", testing::_)) + .WillOnce(testing::Return(true)); + + EXPECT_NO_THROW(mock_adapter.initialize()); +} + +// Test the initialization of the RDFoxAdapter when datastore already exists. +TEST(RDFoxAdapterTest, InitializationWithExistingDatastore) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking datastore exists. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>("test_ds"), testing::Return(true))); + + // Ensure that the second call for creating the datastore is not made. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds", "", + "application/json", "", testing::_)) + .Times(0); + + EXPECT_NO_THROW(mock_adapter.initialize()); +} + +// Test loading data into the RDFox datastore. +TEST(RDFoxAdapterTest, LoadDataSuccess) { + MockRDFoxAdapter mock_adapter; + std::string ttl_data = "@prefix : . :test a :Entity ."; + + // Mock the sendRequest for loading data. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds/content", ttl_data, + "text/turtle", "", testing::_)) + .WillOnce(testing::Return(true)); + + EXPECT_TRUE(mock_adapter.loadData(ttl_data)); +} + +// Test querying data from the RDFox datastore. +TEST(RDFoxAdapterTest, QueryDataSuccess) { + MockRDFoxAdapter mock_adapter; + std::string sparql_query = "SELECT ?s WHERE { ?s ?p ?o . }"; + std::string mock_response = ""; + + // Mock the sendRequest for querying data. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds/sparql", + sparql_query, "application/sparql-query", "", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>(mock_response), testing::Return(true))); + + EXPECT_EQ(mock_adapter.queryData(sparql_query), mock_response); +} + +// Test deleting the RDFox datastore. +TEST(RDFoxAdapterTest, DeleteDataStoreSuccess) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking the datastore existence. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>("test_ds"), testing::Return(true))); + + // Mock the sendRequest for deleting the datastore. + EXPECT_CALL(mock_adapter, + sendRequest(http::verb::delete_, "/datastores/test_ds", "", "", "", testing::_)) + .WillOnce(testing::Return(true)); + + EXPECT_TRUE(mock_adapter.deleteDataStore()); +} + +// Test any error deleting the RDFox datastore that does not exists. +TEST(RDFoxAdapterTest, DeleteNonexistentDataStoreSuccess) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking the datastore existence. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>(""), testing::Return(false))); + + // Ensure that the second call for deleting the datastore is not made. + EXPECT_CALL(mock_adapter, + sendRequest(http::verb::delete_, "/datastores/test_ds", "", "", "", testing::_)) + .Times(0); + + EXPECT_TRUE(mock_adapter.deleteDataStore()); +} + +// Test handling a failed request during datastore creation. +TEST(RDFoxAdapterTest, FailedToCreateDataStore) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking the datastore existence. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>(""), testing::Return(true))); + + // Mock the sendRequest for creating the datastore failure. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds", "", + "application/json", "", testing::_)) + .WillOnce(testing::Return(false)); + + // Expect a runtime error when the adapter tries to create the datastore. + EXPECT_THROW(mock_adapter.initialize(), std::runtime_error); +} + +// Test loading data when the request fails. +TEST(RDFoxAdapterTest, LoadDataFailure) { + MockRDFoxAdapter mock_adapter; + std::string ttl_data = "@prefix : . :test a :Entity ."; + + // Mock the sendRequest for loading data failure. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds/content", ttl_data, + "text/turtle", "", testing::_)) + .WillOnce(testing::Return(false)); + + EXPECT_FALSE(mock_adapter.loadData(ttl_data)); +} + +// Test querying data when the request fails. +TEST(RDFoxAdapterTest, QueryDataFailure) { + MockRDFoxAdapter mock_adapter; + std::string sparql_query = "SELECT ?s WHERE { ?s ?p ?o . }"; + + // Mock the sendRequest for querying data failure. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::post, "/datastores/test_ds/sparql", + sparql_query, "application/sparql-query", "", testing::_)) + .WillOnce(testing::Return(false)); + + // Call queryData and expect it to return an empty string. + EXPECT_EQ(mock_adapter.queryData(sparql_query), ""); +} + +// Test deleting the RDFox datastore when delete request fails. +TEST(RDFoxAdapterTest, DeleteDataStoreFailure) { + MockRDFoxAdapter mock_adapter; + + // Mock the sendRequest for checking the datastore existence. + EXPECT_CALL(mock_adapter, sendRequest(http::verb::get, "/datastores", "", "", + "text/csv; charset=UTF-8", testing::_)) + .WillOnce(testing::DoAll(testing::SetArgReferee<5>("test_ds"), testing::Return(true))); + + // Mock the sendRequest for deleting the datastore failure. + EXPECT_CALL(mock_adapter, + sendRequest(http::verb::delete_, "/datastores/test_ds", "", "", "", testing::_)) + .WillOnce(testing::Return(false)); + + EXPECT_FALSE(mock_adapter.deleteDataStore()); +} \ No newline at end of file diff --git a/docker/docker-compose-cdsp.yml b/docker/docker-compose-cdsp.yml index ef45dfe..3796868 100644 --- a/docker/docker-compose-cdsp.yml +++ b/docker/docker-compose-cdsp.yml @@ -73,6 +73,12 @@ services: - RDFOX_ROLE=root - RDFOX_PASSWORD=admin command: daemon + deploy: + resources: + limits: + memory: 8g + cpus: "2.0" + restart: "always" # VISSR acting as VISS Data Server From 1bcadd73c979723478f76a5925ab39205a62e306 Mon Sep 17 00:00:00 2001 From: "Sebastian Schleemilch (ZI-20)" Date: Mon, 21 Oct 2024 09:01:16 +0200 Subject: [PATCH 37/39] Refactored information-layer Docs (#36) Signed-off-by: Sebastian Schleemilch --- cdsp/information-layer/Dockerfile | 38 +- cdsp/information-layer/README.md | 352 +++++++----------- cdsp/information-layer/handlers/README.md | 11 - .../config/schema-files/vss_data_points.json | 108 ------ cdsp/information-layer/router/README.md | 4 - 5 files changed, 144 insertions(+), 369 deletions(-) delete mode 100644 cdsp/information-layer/handlers/README.md delete mode 100644 cdsp/information-layer/handlers/config/schema-files/vss_data_points.json delete mode 100644 cdsp/information-layer/router/README.md diff --git a/cdsp/information-layer/Dockerfile b/cdsp/information-layer/Dockerfile index e0336a0..349690d 100644 --- a/cdsp/information-layer/Dockerfile +++ b/cdsp/information-layer/Dockerfile @@ -1,39 +1,11 @@ -# Base image for Node.js FROM node:22.5.1 -######################### -# GENERAL CONFIGURATION # -######################### - -# HANDLER_TYPE can be initialized with two different values: `realmdb` or `iotdb` -ENV HANDLER_TYPE=${HANDLER_TYPE} - -######################### -# REALMDB CONFIGURATION # -######################### - -# VERSION must be 0 or a positive integer. This is used for versioning the RealmDB configuration schema. -ENV VERSION_REALMDB_SCHEMA=${VERSION_REALMDB_SCHEMA} - -# Access to ATLAS Cloud instance -ENV REALMDB_APP_ID=${REALMDB_APP_ID} -ENV REALMDB_API_KEY=${REALMDB_API_KEY} - -####################### -# IOTDB CONFIGURATION # -####################### - -# Access to iotdb-service -ENV IOTDB_HOST: ${IOTDB_HOST} -ENV IOTDB_PORT: ${IOTDB_PORT} -ENV IOTDB_USER: ${IOTDB_USER} -ENV IOTDB_PASSWORD: ${IOTDB_PASSWORD} -ENV IOTDB_FETCH_SIZE: ${IOTDB_FETCH_SIZE} - -# Set working directory inside the container WORKDIR /app -COPY . ./ +COPY package.json . +COPY handlers ./handlers +COPY utils ./utils +COPY router ./router # Install dependencies, including workspaces RUN npm install --production @@ -42,4 +14,4 @@ RUN npm install --production EXPOSE 8080 # Command to run the WebSocket server -CMD ["node", "router/src/websocket-server.js"] \ No newline at end of file +CMD ["node", "router/src/websocket-server.js"] diff --git a/cdsp/information-layer/README.md b/cdsp/information-layer/README.md index 4e94209..b117028 100644 --- a/cdsp/information-layer/README.md +++ b/cdsp/information-layer/README.md @@ -1,287 +1,213 @@ -# Information Layer Playground components +# Information Layer -This directory contains files related to the [Information Layer](https://en.wikipedia.org/wiki/DIKW_pyramid) of the Central Data Service Playground. +The information layer is responsible for providing a raw data access [API](#api) (read, write, subscribe). +Its intention is to abstract the underlying data storage database technology. -- [Database-Handlers](./handlers/README.md) -- [Database-Router](./router/README.md) +Clients can interact with it using websockets and JSON payload. -# Setting up a CDSP Information Layer -Setting up an information layer in the CDSP involves running a [Database-Router](./router/README.md), which is technically a configurable Websocket server that enables northbound connections for WebSocket clients, such as a [Knowledge Layer Connector](../knowledge-layer/README.md), to read, subscribe, and write data. The WebSocket server is connected to a database, which can be selected before starting the web server. Southbound feeders write data to the database in a predefined semantic format, such as [VSS](https://github.com/COVESA/vehicle_signal_specification). - -## Installation of Database-Handler - -Please follow installation instructions of the chosen [handler](./handlers/README.md). - -# Running "Hello World" example (WIP) - -The Hello World example in our case is quite simple. We feed an updated value for the `CurrentLocation_Longitude` into the database and we check afterwards in the logs if the DB-router creates a Websocket update message for it. +The information-layer consists of two logical components: +- database handler: Interaction with the chosen database, configurable +- router: API provider that connects to the database handler +``` + | CLOUD + +---------+ | +---------+ + | realm_h | <-> | realmDB | ++--------+ +--------+ +----------+ <-> +---------+ | +---------+ +| client | <-> | router | <-> | handlers | ++--------+ +--------+ +----------+ <-> +---------+ +-------+ + | iotdb_h | <-> | iotdb | + +---------+ +-------+ +``` -## Choose and prepare your Database +# Hello World Setup -> [!WARNING] -> Before start the application, ensure that the supported data points are correctly defined and configured. See [how](./handlers/config/README.md). +## Backend Option 1: IoTDB -### Realm +### Start the database -- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle _document_ with an `Vehicle_VehicleIdentification_VIN` in a collection named _`Vehicles`_. -- Ensure that this document as well contains VSS data. Here you can see the data supported in this repository for a vehicle document within _Vehicles_ that should be reflected in ATLAS: - - ```text - _id: "" (String) - Vehicle_Chassis_SteeringWheel_Angle: (Int32) - Vehicle_CurrentLocation_Latitude: (Double) - Vehicle_CurrentLocation_Longitude: (Double) - Vehicle_Powertrain_TractionBattery_NominalVoltage: (Int32) - Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy: (Double) - Vehicle_Powertrain_Transmission_CurrentGear: (Int32) - Vehicle_Speed: (Double) - Vehicle_VehicleIdentification_VIN: "" (String) - ``` - -### IoTDB - -- Ensure to start and run Docker containers defined in a [Docker Compose file](/docker/README.md). -- Ensure that in the IoTDB CLI there is a `root.Vehicles` _database_ like this: - - ```text - IoTDB> show databases; - +-------------+----+-----------------------+---------------------+---------------------+ - | Database| TTL|SchemaReplicationFactor|DataReplicationFactor|TimePartitionInterval| - +-------------+----+-----------------------+---------------------+---------------------+ - |root.Vehicles|null| 1| 1| 604800000| - +-------------+----+-----------------------+---------------------+---------------------+ - Total line number = 1 - It costs 0.004s - ``` - -- Create two _timeseries_ with the `root.Vehicles.Vehicle_VehicleIdentification_VIN` and some VSS data. Here you can see an example how the vehicle document within the _Vehicles_ should look like in IoTDB CLI: - - ```text - IoTDB> show timeseries; - +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - | Timeseries|Alias| Database|DataType|Encoding|Compression|Tags|Attributes|Deadband|DeadbandParameters|ViewType| - +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - | root.Vehicles.Vehicle_VehicleIdentification_VIN| null|root.Vehicles| TEXT| PLAIN| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_CurrentLocation_Latitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_CurrentLocation_Longitude| null|root.Vehicles| DOUBLE| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_Speed| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_Chassis_SteeringWheel_Angle| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_Powertrain_Transmission_CurrentGear| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| - |root.Vehicles.Vehicle_Powertrain_TractionBattery_StateOfCharge_CurrentEnergy| null|root.Vehicles| FLOAT| RLE| LZ4|null| null| null| null| BASE| - | root.Vehicles.Vehicle_Powertrain_TractionBattery_NominalVoltage| null|root.Vehicles| INT32| RLE| LZ4|null| null| null| null| BASE| - +----------------------------------------------------------------------------+-----+-------------+--------+--------+-----------+----+----------+--------+------------------+--------+ - ``` - -## Start the Database Router - -### Using Docker Compose - -See [here](/docker/README.md) how to start the services using Docker. - -### Using Docker directly from Dockerfile in information-layer - -Go to `covesa.cdsp/cdsp/information-layer` and run in CLI: - -```shell -$ docker build -t webserver-service . +Start the db: +```bash +docker run -d --rm --name iotdb -p 6667:6667 -p 9003:9003 apache/iotdb:latest +``` +Connect to it via cli: +```bash +docker exec -it iotdb ./start-cli.sh -h 127.0.0.1 -p 6667 -u root -pw root ``` +Create a database +```bash +create database root.Vehicles +``` +Create desired timeseries -To run `RealmDB` use: +```bash +create timeseries root.Vehicles.Vehicle_TraveledDistance WITH DATATYPE=FLOAT, ENCODING=RLE +create timeseries root.Vehicles.Vehicle_Speed WITH DATATYPE=FLOAT, ENCODING=RLE +``` -> [!IMPORTANT] -> See [here](./handlers/src/realmdb/README.md) all the required ENV variables. +### Start router -```shell -$ docker run --name websocket-service -e HANDLER_TYPE=realmdb [-e required_env_variables] -p 8080:8080 websocket-service +Build the router image +```bash +docker build -t router . +``` +Run the router +```bash +# Docker +docker run --rm --name router -p 8080:8080 -e HANDLER_TYPE=iotdb -e IOTDB_HOST=host.docker.internal router +# OR natively +npm install +HANDLER_TYPE=iotdb IOTDB_HOST=localhost npm start ``` -To run `IoTDB` use: +## Backend Option 2: RealmDB -> [!IMPORTANT] -> See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. -```shell -$ docker run --name websocket-service -e HANDLER_TYPE=iotdb --network cdsp_default [-e required_env_variables] -p 8080:8080 websocket-service -``` +### Prepare cloud -### Using Node.js +- Ensure that in your [ATLAS cloud](https://cloud.mongodb.com/) app there is a vehicle _document_ with an `Vehicle_VehicleIdentification_VIN` in a collection named _`Vehicles`_. +- Ensure that this document as well contains VSS data. Here you can see the data supported in this repository for a vehicle document within _Vehicles_ that should be reflected in ATLAS: -#### Install +``` +_id: "" (String) +Vehicle_Speed: (Double) +Vehicle_TraveledDistance: "" (Double) +``` -Execute in this directory: +### Start router -```shell +Build the router image +```bash +docker build -t router . +``` +Run the router +```bash +# Docker +docker run --rm --name router -p 8080:8080 -e HANDLER_TYPE=realmdb -e VERSION_REALMDB_SCHEMA=0 -e REALM_APP_ID= -e REALM_API_KEY= router +# OR natively npm install +HANDLER_TYPE=realmdb VERSION_REALMDB_SCHEMA=0 REALM_APP_ID= REALM_API_KEY= npm start ``` -To start the websocket-server using `RealmDB` execute the command: +## Usage -To run `RealmDB` use: +See [api](#api) how to interact with the router. -> [!IMPORTANT] -> See [here](./handlers/src/realmdb/README.md) all the required ENV variables. - -```shell -$ HANDLER_TYPE=realm [ENV_VARIABLE_NAME required_env_variables] npm start -``` - -To start the websocket-server using `IoTDB` execute the command: +# API -> [!IMPORTANT] -> See [here](./handlers/src/iotdb/README.md) all the required ENV variables. These are optional, because by default it uses the local configuration to connect to the `iotdb-service` container. +Connect your own websocket client by connecting to `ws://localhost:8080`. -```shell -$ HANDLER_TYPE=iotdb IOTDB_HOST=localhost [ENV_VARIABLE_NAME required_env_variables] npm start -``` +The examples use [websocat](https://github.com/vi/websocat) and [jq](https://github.com/jqlang/jq) -## Look out for the Websocket Server message in the console +## Read -If the handler is running, and you are [subscribed](#subscribing-to-changes) to an element, when you change the value of `CurrentLocation_Longitude` in ATLAS cloud (let's say `-157845.68200000003`), you should immediately see this line in console: +Schema: +```jsonc +{ + "type": "read", + "tree": "VSS", + "id": "123", // The VIN + "uuid": "testClient", // The unique client ID + // For reading one + "node": { "name": "Vehicle_Speed" }, + // For reading N + "nodes": [{ "name": "Vehicle_Speed" },{ "name": "Vehicle_TraveledDistance" }] +} +``` +Example: +```bash +echo '{ "type": "read", "tree": "VSS", "id": "123", "uuid": "testClient", "node": { "name": "Vehicle.Speed" } }' | websocat ws://localhost:8080 | jq +``` ```json { "type": "update", "tree": "VSS", - "id": "", - "dateTime": "", - "uuid": "", - "node": { "name": "CurrentLocation_Longitude", "value": "-157845.68200000003" } + "id": "123", + "dateTime": "2024-10-16T12:09:13.084Z", + "uuid": "test", + "node": { + "name": "Vehicle.Speed", + "value": 300 + } } ``` -If the handler response with some error during any request, the client may get error response similar to this (with the same format): +## Write -```json +Schema: +```jsonc { - "type": ":status", - "errorCode": 404, - "error": "" + "type": "write", + "tree": "VSS", + "id": "123", // The VIN + "uuid": "testClient", // The unique client ID + // For writing one + "node": { "name": "Vehicle_Speed", "value": 300 }, + // For writing N + "nodes": [{ "name": "Vehicle_Speed", "value": 300 },{ "name": "Vehicle_TraveledDistance", "value": 100000 }] } ``` - -# Connect your own Websocket Client - -Connect your own websocket client by connecting to `ws://localhost:8080` - -The examples use the VIN (Vehicle Identification Number) as object identifier. - -### Reading data - -To read data, send a message with the type of request and VIN as object ID: - -- Example for one Node: - ```json - { - "type": "read", - "tree": "VSS", - "id": "", - "uuid": "", - "node": { - "name": "" - } - } - ``` -- Example for multiple Nodes: - ```json - { - "type": "read", - "tree": "VSS", - "id": "", - "uuid": "", - "nodes": [ - { - "name": "" - }, - { - "name": "" - } - ] - } - ``` - -### Writing data - -To write data, send a message with the type of request and VIN as object ID (at this moment only with IoTDB available): - -- Example for one Node: - ```json - { - "type": "write", - "tree": "VSS", - "id": "", - "uuid": "", - "node": { - "name": "", - "value": "" - } - } - ``` -- Example for multiple Nodes: - ```json - { - "type": "write", - "tree": "VSS", - "id": "", - "uuid": "", - "nodes": [ - { - "name": "", - "value": "" - }, - { - "name": "", - "value": "" - } - ] +Example: +```bash +echo '{ "type": "write", "tree": "VSS", "id": "123", "uuid": "testClient", "node": { "name": "Vehicle.Speed", "value": 300 } }' | websocat ws://localhost:8080 | jq +``` +```json +{ + "type": "update", + "tree": "VSS", + "id": "123", + "dateTime": "2024-10-16T12:09:13.084Z", + "uuid": "test", + "node": { + "name": "Vehicle.Speed", + "value": 300 } - ``` - -### Subscribing to changes +} +``` -To subscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): +## Subscribe (Realm Only) +Schema: ```json { "type": "subscribe", "tree": "VSS", - "id": "", - "uuid": "" + "id": "123", + "uuid": "testClient" } ``` -If the subscription succeed, the server will respond with the following message: - +On success: ```json { "type": "subscribe:status", "tree": "VSS", - "id": "", + "id": "123", "dateTime": "2024-09-12T15:50:17.232Z", - "uuid": "", + "uuid": "testClient", "status": "succeed" } ``` -### Unsubscribing to changes - -To unsubscribe to changes in a specific object, send a message with the type of request and VIN as object ID (at this moment only with RealmDB available): +## Unsubscribe ```json { "type": "unsubscribe", "tree": "VSS", - "id": "", - "uuid": "" + "id": "123", + "uuid": "testClient" } ``` -If the unsubscription succeed, the server will respond with the following message: + +On success: ```json { "type": "unsubscribe:status", "tree": "VSS", - "id": "WBY11CF080CH470711", + "id": "123", "dateTime": "2024-09-12T17:40:00.754Z", - "uuid": "CLIENT_1_SUBS", + "uuid": "testClient", "status": "succeed" } ``` diff --git a/cdsp/information-layer/handlers/README.md b/cdsp/information-layer/handlers/README.md deleted file mode 100644 index a2a20a0..0000000 --- a/cdsp/information-layer/handlers/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Handlers - -We support two different databases. For each of them is required to configure the corresponding ENV variables in `/docker/.env` file. - -- [IotDB](./src/iotdb/README.md) -- [RealmDB](./src/realmdb/README.md) - -> [!WARNING] -> Before start working with any of them, ensure that the supported data points are correctly defined and configured. See [how](./handlers/config/README.md). - -See [here](../../information-layer/README.md) how to install and start the Websocket-Server. diff --git a/cdsp/information-layer/handlers/config/schema-files/vss_data_points.json b/cdsp/information-layer/handlers/config/schema-files/vss_data_points.json deleted file mode 100644 index 5792bca..0000000 --- a/cdsp/information-layer/handlers/config/schema-files/vss_data_points.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "Vehicle": { - "children": { - "Chassis": { - "children": { - "SteeringWheel": { - "children": { - "Angle": { - "datatype": "int16", - "description": "Steering wheel angle. Positive = degrees to the left. Negative = degrees to the right.", - "type": "sensor", - "unit": "degrees" - } - }, - "description": "Steering wheel signals", - "type": "branch" - } - }, - "description": "All data concerning steering, suspension, wheels, and brakes.", - "type": "branch" - }, - "CurrentLocation": { - "children": { - "Latitude": { - "datatype": "double", - "description": "Current latitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", - "max": 90, - "min": -90, - "type": "sensor", - "unit": "degrees" - }, - "Longitude": { - "datatype": "double", - "description": "Current longitude of vehicle in WGS 84 geodetic coordinates, as measured at the position of GNSS receiver antenna.", - "max": 180, - "min": -180, - "type": "sensor", - "unit": "degrees" - } - }, - "description": "The current latitude and longitude of the vehicle.", - "type": "branch" - }, - "Powertrain": { - "children": { - "TractionBattery": { - "children": { - "NominalVoltage": { - "comment": "Nominal voltage typically refers to voltage of fully charged battery when delivering rated capacity.", - "datatype": "uint16", - "description": "Nominal Voltage of the battery.", - "type": "attribute", - "unit": "V" - }, - "StateOfCharge": { - "children": { - "CurrentEnergy": { - "comment": "Current energy could be calculated as .StateOfCharge.Current * .NetCapacity.", - "datatype": "float", - "description": "Physical state of charge of high voltage battery expressed in kWh.", - "type": "sensor", - "unit": "kWh" - } - }, - "description": "Information on the state of charge of the vehicle's high voltage battery.", - "type": "branch" - } - }, - "description": "Battery Management data.", - "type": "branch" - }, - "Transmission": { - "children": { - "CurrentGear": { - "datatype": "int8", - "description": "The current gear. 0=Neutral, 1/2/..=Forward, -1/-2/..=Reverse.", - "type": "sensor" - } - }, - "description": "Transmission-specific data, stopping at the drive shafts.", - "type": "branch" - } - }, - "description": "Powertrain data for battery management, etc.", - "type": "branch" - }, - "Speed": { - "datatype": "float", - "description": "Vehicle speed.", - "type": "sensor", - "unit": "km/h" - }, - "VehicleIdentification": { - "children": { - "VIN": { - "datatype": "string", - "description": "17-character Vehicle Identification Number (VIN) as defined by ISO 3779.", - "type": "attribute" - } - }, - "description": "Attributes that identify a vehicle.", - "type": "branch" - } - }, - "description": "High-level vehicle data.", - "type": "branch" - } -} diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md deleted file mode 100644 index 38ff920..0000000 --- a/cdsp/information-layer/router/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Websocket-Server - -This project is a [WebSocket server](src/websocket-server.js) that dynamically integrates different database handlers (e.g., RealmDB, IoTDB) based on the [configuration](../handlers/README.md). It listens for incoming WebSocket connections, processes messages according to the specified handler, and broadcasts messages to connected clients. - From 7ae2fb46d6f00542e229966093e6c832d8f4d2e1 Mon Sep 17 00:00:00 2001 From: "Andre Wendel (Q290938)" Date: Mon, 21 Oct 2024 11:25:52 +0200 Subject: [PATCH 38/39] - Migrate JS to TypeScript Signed-off-by: Andre Wendel --- cdsp/information-layer/.gitignore | 4 +- cdsp/information-layer/eslint.config.mjs | 38 + .../handlers/config/config.js | 39 - .../handlers/config/config.ts | 39 + .../information-layer/handlers/src/.gitignore | 3 - .../handlers/src/HandlerBase.ts | 235 + cdsp/information-layer/handlers/src/README.md | 10 +- .../information-layer/handlers/src/handler.js | 227 - .../handlers/src/iotdb/.gitignore | 4 - .../src/iotdb/config/data-points-type.js | 46 - .../src/iotdb/config/database-params.js | 51 - .../src/iotdb/config/database-params.ts | 54 + .../handlers/src/iotdb/config/iotdb-config.ts | 62 + .../iotdb/gen-nodejs/IClientRPCService.d.ts | 33 + .../src/iotdb/gen-nodejs/IClientRPCService.js | 12900 +--------------- .../iotdb/gen-nodejs/IClientRPCService.thrift | 65 + .../gen-nodejs/IClientRPCService_types.d.ts | 110 + .../gen-nodejs/IClientRPCService_types.js | 829 + .../src/iotdb/gen-nodejs/client_types.js | 7961 ---------- .../src/iotdb/gen-nodejs/common_types.js | 2627 ---- .../handlers/src/iotdb/package.json | 10 - .../handlers/src/iotdb/src/IoTDBHandler.ts | 553 + .../handlers/src/iotdb/src/iotdb-handler.js | 473 - .../handlers/src/iotdb/utils/Int64.ts | 44 + ...interpreter.js => IoTDBDataInterpreter.ts} | 74 +- .../src/iotdb/utils/IoTDBRpcDataSet.ts | 223 + .../src/iotdb/utils/SessionDataSet.ts | 111 + .../src/iotdb/utils/iotdb-constants.js | 21 - .../src/iotdb/utils/iotdb-constants.ts | 21 + .../src/iotdb/utils/iotdb-rpc-data-sets.js | 271 - .../src/iotdb/utils/session-data-set.js | 135 - .../handlers/src/package.json | 8 - .../handlers/src/realmdb/.gitignore | 3 - .../src/realmdb/config/database-params.js | 46 - .../src/realmdb/config/database-params.ts | 51 + .../src/realmdb/config/realm-config.ts | 113 + .../src/realmdb/config/realm-configuration.js | 78 - .../handlers/src/realmdb/package.json | 10 - .../src/realmdb/src/RealmDbHandler.ts | 463 + .../src/realmdb/src/realmdb-handler.js | 402 - .../handlers/utils/data_types.ts | 52 + cdsp/information-layer/package-lock.json | 6741 ++++++++ cdsp/information-layer/package.json | 40 +- cdsp/information-layer/router/.gitignore | 7 - cdsp/information-layer/router/README.md | 4 + .../information-layer/router/config/config.js | 14 - .../information-layer/router/config/config.ts | 13 + cdsp/information-layer/router/package.json | 13 - .../router/src/websocket-server.js | 74 - .../router/src/websocket-server.ts | 96 + ...sage-validator.js => message-validator.ts} | 101 +- cdsp/information-layer/tsconfig.json | 115 + .../utils/error-message-helper.js | 12 - .../utils/error-message-helper.ts | 19 + cdsp/information-layer/utils/logger.js | 51 - cdsp/information-layer/utils/logger.ts | 104 + package-lock.json | 6 + 57 files changed, 10759 insertions(+), 25150 deletions(-) create mode 100644 cdsp/information-layer/eslint.config.mjs delete mode 100644 cdsp/information-layer/handlers/config/config.js create mode 100644 cdsp/information-layer/handlers/config/config.ts delete mode 100644 cdsp/information-layer/handlers/src/.gitignore create mode 100644 cdsp/information-layer/handlers/src/HandlerBase.ts delete mode 100644 cdsp/information-layer/handlers/src/handler.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/config/database-params.js create mode 100644 cdsp/information-layer/handlers/src/iotdb/config/database-params.ts create mode 100644 cdsp/information-layer/handlers/src/iotdb/config/iotdb-config.ts create mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.d.ts create mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.thrift create mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.d.ts create mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/package.json create mode 100644 cdsp/information-layer/handlers/src/iotdb/src/IoTDBHandler.ts delete mode 100644 cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js create mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/Int64.ts rename cdsp/information-layer/handlers/src/iotdb/utils/{iotdb-data-interpreter.js => IoTDBDataInterpreter.ts} (58%) create mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSet.ts create mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.ts delete mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js create mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.ts delete mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js delete mode 100644 cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js delete mode 100644 cdsp/information-layer/handlers/src/package.json delete mode 100644 cdsp/information-layer/handlers/src/realmdb/.gitignore delete mode 100644 cdsp/information-layer/handlers/src/realmdb/config/database-params.js create mode 100644 cdsp/information-layer/handlers/src/realmdb/config/database-params.ts create mode 100644 cdsp/information-layer/handlers/src/realmdb/config/realm-config.ts delete mode 100644 cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js delete mode 100644 cdsp/information-layer/handlers/src/realmdb/package.json create mode 100644 cdsp/information-layer/handlers/src/realmdb/src/RealmDbHandler.ts delete mode 100644 cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js create mode 100644 cdsp/information-layer/handlers/utils/data_types.ts create mode 100644 cdsp/information-layer/package-lock.json create mode 100644 cdsp/information-layer/router/README.md delete mode 100644 cdsp/information-layer/router/config/config.js create mode 100644 cdsp/information-layer/router/config/config.ts delete mode 100644 cdsp/information-layer/router/package.json delete mode 100644 cdsp/information-layer/router/src/websocket-server.js create mode 100644 cdsp/information-layer/router/src/websocket-server.ts rename cdsp/information-layer/router/utils/{message-validator.js => message-validator.ts} (64%) create mode 100644 cdsp/information-layer/tsconfig.json delete mode 100644 cdsp/information-layer/utils/error-message-helper.js create mode 100644 cdsp/information-layer/utils/error-message-helper.ts delete mode 100644 cdsp/information-layer/utils/logger.js create mode 100644 cdsp/information-layer/utils/logger.ts create mode 100644 package-lock.json diff --git a/cdsp/information-layer/.gitignore b/cdsp/information-layer/.gitignore index 79ef773..060b123 100644 --- a/cdsp/information-layer/.gitignore +++ b/cdsp/information-layer/.gitignore @@ -3,4 +3,6 @@ mongodb-realm/ # Node.js node_modules/ -package-lock.json + +# typescript migration +dist \ No newline at end of file diff --git a/cdsp/information-layer/eslint.config.mjs b/cdsp/information-layer/eslint.config.mjs new file mode 100644 index 0000000..0ee2f92 --- /dev/null +++ b/cdsp/information-layer/eslint.config.mjs @@ -0,0 +1,38 @@ +// @ts-check + +import eslint from "@eslint/js"; +import pluginPrettier from "eslint-plugin-prettier"; +import prettierConfig from "eslint-config-prettier"; +import tseslint, { parser } from "typescript-eslint"; + +export default tseslint.config( + { + ignores: ["coverage/**", "**/dist/**", "node_modules/**"], + }, + { + files: ["./**/*.{ts,tsx}"], + extends: [eslint.configs.recommended, ...tseslint.configs.strict], + plugins: { + prettier: pluginPrettier, + //"@typescript-eslint": ESLintPlugin, + }, + languageOptions: { + parser: parser, + parserOptions: { + project: "./tsconfig.json", // Ensure it points to your tsconfig + }, + }, + rules: { + "max-depth": ["error", 3], + "@/no-console": "error", + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-floating-promises": "error", + "no-shadow": "off", + "@typescript-eslint/no-shadow": "error", + "@typescript-eslint/naming-convention": "error", + "@no-nested-ternary": "warn", + "prettier/prettier": "error", + ...prettierConfig.rules, + }, + } +); diff --git a/cdsp/information-layer/handlers/config/config.js b/cdsp/information-layer/handlers/config/config.js deleted file mode 100644 index 7d942bc..0000000 --- a/cdsp/information-layer/handlers/config/config.js +++ /dev/null @@ -1,39 +0,0 @@ -const path = require("path"); -const dotenv = require("dotenv"); -dotenv.config(); -/** - * This file contains the description of the supported data points. - * It supports JSON, YAML or YML format. - */ -const ENDPOINTS_FILE = "vss_data_points.yaml"; - -/** - * Retrieves the value of an environment variable. - * - * @param {string} envVar - The environment variable to retrieve. - * @returns {string|null} - The value of the environment variable. - */ -const getEnvValue = (envVar) => { - if (!process.env[envVar]) { - console.info(`${envVar} environment variable is not set in .env file.`); - return null; - } - return process.env[envVar]; -}; - -/** - * Retrieves the full path to the data points file. - * - * This function resolves the schema-files directory path of the current module - * and joins it with the ENDPOINTS_FILE constant to form the full path. - * - * @returns {string} The full path to the data points file. - */ -const getDataPointsPath = () => { - const endpoints_file = - getEnvValue("DATA_POINTS_SCHEMA_FILE") || ENDPOINTS_FILE; - const rootPath = path.resolve(`${__dirname}/schema-files`); - return path.join(rootPath, endpoints_file); -}; - -module.exports = { getDataPointsPath, getEnvValue }; diff --git a/cdsp/information-layer/handlers/config/config.ts b/cdsp/information-layer/handlers/config/config.ts new file mode 100644 index 0000000..6cd2c9d --- /dev/null +++ b/cdsp/information-layer/handlers/config/config.ts @@ -0,0 +1,39 @@ +import path from "path"; +import dotenv from "dotenv"; +import { logMessage } from "../../utils/logger"; + +// Load environment variables from the .env file +dotenv.config(); + +/** + * This file contains the description of the supported data points. + * It supports JSON, YAML or YML format. + */ +const ENDPOINTS_FILE: string = "vss_data_points.yaml"; + +/** + * Retrieves the value of an environment variable. + * + * @param envVar - The environment variable to retrieve. + * @returns The value of the environment variable or null if not set. + */ +export const getEnvValue = (envVar: string): string | null => { + if (!process.env[envVar]) { + logMessage(`${envVar} environment variable is not set in .env file.`); + return null; + } + return process.env[envVar]!; +}; + +/** + * Retrieves the full path to the data points file. + * + * This function resolves the schema-files directory path of the current module + * and joins it with the ENDPOINTS_FILE constant to form the full path. + * + * @returns The full path to the data points file. + */ +export const getDataPointsPath = (): string => { + const rootPath = path.resolve(`${__dirname}/schema-files`); + return path.join(rootPath, ENDPOINTS_FILE); +}; diff --git a/cdsp/information-layer/handlers/src/.gitignore b/cdsp/information-layer/handlers/src/.gitignore deleted file mode 100644 index 645f5bd..0000000 --- a/cdsp/information-layer/handlers/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Node.js -node_modules/ -package-lock.json \ No newline at end of file diff --git a/cdsp/information-layer/handlers/src/HandlerBase.ts b/cdsp/information-layer/handlers/src/HandlerBase.ts new file mode 100644 index 0000000..4b7b00b --- /dev/null +++ b/cdsp/information-layer/handlers/src/HandlerBase.ts @@ -0,0 +1,235 @@ +import fs from "fs"; +import yaml from "js-yaml"; +import { + Message, + WebSocket, + DataPointSchema, + MessageBase, + ErrorMessage, +} from "../utils/data_types"; +import { getDataPointsPath } from "../config/config"; +import { logMessage, MessageType } from "../../utils/logger"; + +export abstract class HandlerBase { + // Default implementations of required functions + authenticateAndConnect(sendMessageToClients: (message: any) => void): void { + logMessage( + "authenticateAndConnect() is not implemented", + MessageType.WARNING + ); + } + + protected read(message: Message, ws: WebSocket): void { + logMessage("read() is not implemented", MessageType.WARNING); + } + + protected write(message: Message, ws: WebSocket): void { + logMessage("write() is not implemented", MessageType.WARNING); + } + + protected subscribe(message: Message, ws: WebSocket): void { + logMessage("subscribe() is not implemented", MessageType.WARNING); + } + + protected unsubscribe(message: Message, ws: WebSocket): void { + logMessage("unsubscribe() is not implemented", MessageType.WARNING); + } + + unsubscribe_client(ws: WebSocket): void { + logMessage("unsubscribe_client() is not implemented", MessageType.WARNING); + } + + handleMessage(message: Message, ws: WebSocket): void { + try { + switch (message.type) { + case "read": + this.read(message, ws); + break; + case "write": + this.write(message, ws); + break; + case "subscribe": + this.subscribe(message, ws); + break; + case "unsubscribe": + this.unsubscribe(message, ws); + break; + default: + ws.send(JSON.stringify({ error: "Unknown message type" })); + } + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + ws.send(errMsg); + } + } + + /** + * Sends a message to the client. + */ + protected sendMessageToClient( + ws: WebSocket, + message: Message | MessageBase | ErrorMessage + ): void { + logMessage(JSON.stringify(message), MessageType.SENT); + ws.send(JSON.stringify(message)); + } + + /** + * Generic function to create an update message. + * @param message - The original message from client. + * @param nodes - The nodes to be included in the message. + * @returns - The transformed message. + */ + protected createUpdateMessage( + message: Pick, + nodes: Array<{ name: string; value: any }> + ): Message { + const { id, tree, uuid } = message; + return { + type: "update", + tree, + id, + dateTime: new Date().toISOString(), + uuid, + ...(nodes.length === 1 + ? { node: nodes[0] } // Return single node as 'node' + : { nodes }), // Return array as 'nodes' } as Message; + }; + } + + /** + * Generic function to create or remove a subscription message. + * @param type - Type of subscription message. + * @param message - The original message from client. + * @param status - The status of the subscription. + * @returns - The transformed message. + */ + protected createSubscribeMessage( + type: "subscribe" | "unsubscribe", + message: Pick, + status: string + ): MessageBase { + const { id, tree, uuid } = message; + return { + type: `${type}:status` as MessageBase["type"], + tree, + id, + dateTime: new Date().toISOString(), + uuid, + status: status, + }; + } + + /** + * Transforms a message node by replacing dots with underscores. + * @param node - The message node to transform. + * @returns - The transformed message node with dots replaced by underscores. + */ + protected transformDataPointsWithUnderscores(node: string): string { + return node.replace(/\./g, "_"); + } + + /** + * Transforms a database field name by replacing underscores with dots. + * @param field - The database filed to transform. + * @returns - The transformed to message node replacing underscores by dots. + */ + protected transformDataPointsWithDots(field: string): string { + return field.replace(/\_/g, "."); + } + + /** + * Reads and parses a data points file in either JSON, YML, or YAML format. + */ + private readDataPointsFile(filePath: string): object { + const fileContent = fs.readFileSync(filePath, "utf8"); + const filePathLower = filePath.toLowerCase(); + if (filePathLower.endsWith(".json")) { + return JSON.parse(fileContent); + } else if ( + filePathLower.endsWith(".yaml") || + filePathLower.endsWith(".yml") + ) { + const result = yaml.load(fileContent); + if (typeof result === "object" && result !== null) { + return result; + } else { + throw new Error("YAML content is not a valid object"); + } + } else { + throw new Error("Unsupported data points file format"); + } + } + + /** + * Extracts data types from a data point object. + */ + private extractDataTypes( + dataPointsObj: any, + parentKey = "", + result: { [key: string]: any } = {} + ): { [key: string]: any } { + for (const key in dataPointsObj) { + if (dataPointsObj.hasOwnProperty(key)) { + const value = dataPointsObj[key]; + const newKey = parentKey ? `${parentKey}.${key}` : key; + const isObject = value && typeof value === "object"; + if (isObject && value.datatype) { + result[newKey] = value.datatype; + } else if (isObject) { + this.extractDataTypes(value.children || value, newKey, result); + } + } + } + return result; + } + + /** + * Retrieves and processes supported data points. + * This method reads the data points configuration file, extracts the data types, + * and transforms the data point names to use underscores. It returns an object + * with the transformed data point names as keys and their corresponding data types. + * @returns An object containing the supported data points with transformed names and data types. + */ + protected getSupportedDataPoints(): object { + const dataPointPath = getDataPointsPath(); + const dataPointObj = this.readDataPointsFile(dataPointPath); + const supportedDataPoints = this.extractDataTypes(dataPointObj); + const result: { [key: string]: any } = {}; + Object.entries(supportedDataPoints).forEach(([node, value]) => { + const underscored_node = this.transformDataPointsWithUnderscores(node); + if (value !== null) { + result[underscored_node] = value; + } + }); + return result; + } + + /** + * Validates nodes against a given schema. + * + * @param message - The message containing nodes to be validated. + * @param dataPointsSchema - The schema against which nodes are validated. + * @returns An object containing error details if validation fails, otherwise null. + */ + protected validateNodesAgainstSchema( + message: Message, + dataPointsSchema: DataPointSchema + ): object | null { + const nodes = message.node ? [message.node] : message.nodes || []; + + const unknownFields = nodes.filter(({ name }) => { + const transformedName = this.transformDataPointsWithUnderscores(name); + return !dataPointsSchema.hasOwnProperty(transformedName); + }); + + if (unknownFields.length > 0) { + const errors = unknownFields.map(({ name }) => ({ + name, + status: "Parent object or node not found.", + })); + return errors.length === 1 ? { node: errors[0] } : { nodes: errors }; + } + return null; + } +} diff --git a/cdsp/information-layer/handlers/src/README.md b/cdsp/information-layer/handlers/src/README.md index 5a06db3..56ad64a 100644 --- a/cdsp/information-layer/handlers/src/README.md +++ b/cdsp/information-layer/handlers/src/README.md @@ -78,9 +78,9 @@ OPTIONAL_CUSTOM_VARIABLES="value" > [!WARNING] > Do not commit this file to GitHub! -In order to work with your custom database handler, it is required to initialize it in the [websocket-server.js](../../router/src/websocket-server.js). +In order to work with your custom database handler, it is required to initialize it in the [websocket-server.ts](../../router/src/websocket-server.ts). -```js +```ts switch (handlerType) { case "realmdb": handler = new RealmDBHandler(); @@ -102,7 +102,7 @@ Run the WebSocket server, and connect with your handler by sending WebSocket mes ### Existing Handlers You can check the following examples to understand how to structure your new handler: -- **RealmDB Handler**: [RealmHandler](./realmdb/src/realmdb-handler.js) provides an example of how to interact with RealmDB. -- **IoTDB Handler**: A similar implementation can be followed for [IoTDBHandler](./iotdb/src/iotdb-handler.js) . +- **RealmDB Handler**: [RealmHandler](./realmdb/src/realmdb-handler.ts) provides an example of how to interact with RealmDB. +- **IoTDB Handler**: A similar implementation can be followed for [IoTDBHandler](./iotdb/src/iotdb-handler.ts). -For additional logging, you can utilize the `logMessage` function from [logger.js](../../utils/logger.js). \ No newline at end of file +For additional logging, you can utilize the `logMessage` function from [logger.ts](../../utils/logger.ts). \ No newline at end of file diff --git a/cdsp/information-layer/handlers/src/handler.js b/cdsp/information-layer/handlers/src/handler.js deleted file mode 100644 index 303c044..0000000 --- a/cdsp/information-layer/handlers/src/handler.js +++ /dev/null @@ -1,227 +0,0 @@ -const config = require("../config/config"); -const fs = require("fs"); -const yaml = require("js-yaml"); -const { logMessage, MessageType } = require("../../utils/logger"); -/** - * Reads and parses a data points file in either JSON, YML or YAML format. - * - * @param {string} filePath - The path to the data points file. - * @returns {Object} The parsed content of the data points file. - * @throws {Error} If the file format is unsupported. - */ -function readDataPointsFile(filePath) { - const fileContent = fs.readFileSync(filePath, "utf8"); - if (filePath.endsWith(".json")) { - return JSON.parse(fileContent); - } else if (filePath.endsWith(".yaml") || filePath.endsWith(".yml")) { - return yaml.load(fileContent); - } else { - throw new Error("Unsupported data points file format"); - } -} - -/** - * Recursively extracts data types from a data point object. - * - * @param {Object} dataPointsObj - The object containing data point definitions. - * @param {string} [parentKey=""] - The parent key used to build the nested key path. - * @param {Object} [result={}] - The object to store the extracted data types. - * @returns {Object} An object mapping data point keys to their data types. - */ -function extractDataTypes(dataPointsObj, parentKey = "", result = {}) { - for (const key in dataPointsObj) { - if (dataPointsObj.hasOwnProperty(key)) { - const value = dataPointsObj[key]; - const newKey = parentKey ? `${parentKey}.${key}` : key; - if (value && typeof value === "object") { - if (value.datatype) { - result[newKey] = value.datatype; - } else { - extractDataTypes(value.children || value, newKey, result); - } - } - } - } - return result; -} - -class Handler { - handleMessage(message, ws) { - try { - switch (message.type) { - case "read": - this.read(message, ws); - break; - case "write": - this.write(message, ws); - break; - case "subscribe": - this.subscribe(message, ws); - break; - case "unsubscribe": - this.unsubscribe(message, ws); - break; - default: - ws.send(JSON.stringify({ error: "Unknown message type" })); - } - } catch (error) { - ws.send(JSON.stringify({ error: error.message })); - } - } - - authenticateAndConnect(sendMessageToClients) { - throw new Error("Method 'authenticateAndConnect' must be implemented."); - } - - read(message, ws) { - throw new Error("Read method not implemented yet!"); - } - - write(message, ws) { - throw new Error("Write method not implemented yet!"); - } - - subscribe(message, ws) { - throw new Error("Subscribe method not implemented yet!"); - } - - unsubscribe(message, ws) { - throw new Error("Unsubscribe method not implemented yet!"); - } - - unsubscribe_client(uuid) { - throw new Error("Unsubscribe client method not implemented yet!"); - } - - /** - * Utility functions for handling messages and data structures common to IoTDB and RealmDB. - */ - - /** - * Sends a message to the client - * @param {WebSocket} ws - The WebSocket connection to send the response to. - * @param {Object} message - The message to be sent to the client. - */ - _sendMessageToClient = (ws, message) => { - logMessage(JSON.stringify(message), MessageType.SENT); - ws.send(JSON.stringify(message)); - }; - - /** - * Generic function to create an update message. - * @param {Object} message - The original message from client. - * @param {Array} nodes - The nodes to be included in the message. - * @returns {Object} - The transformed message. - */ - _createUpdateMessage(message, nodes) { - const { id, tree, uuid } = message; - let newMessage = { - type: "update", - tree, - id, - dateTime: new Date().toISOString(), - uuid, - }; - if (nodes.length === 1) { - newMessage["node"] = nodes[0]; - } else { - newMessage["nodes"] = nodes; - } - return newMessage; - } - - /** - * Generic function to create or remove a subscription message. - * @param {{"subscribe", "unsubscribe"}} type - Type of subscription message. - * @param {Object} message - The original message from client. - * @param {String} status - The status of the subscription. - * @returns {Object} - The transformed message. - */ - _createSubscribeMessage(type, message, status) { - const { id, tree, uuid } = message; - return { - type: `${type}:status`, - tree, - id, - dateTime: new Date().toISOString(), - uuid, - status: status, - }; - } - - /** - * Transforms a message node by replacing all dots with underscores. - * - * @param {string} node - The message node to transform. - * @returns {string} - The transformed message node with dots replaced by underscores. - */ - _transformDataPointsWithUnderscores(node) { - return `${node}`.replace(/\./g, "_"); - } - - /** - * Transforms a database field name by replacing underscores with all dots. - * - * @param {string} field - The database filed to transform. - * @returns {string} - The transformed to message node replacing underscores by dots. - */ - _transformDataPointsWithDots(field) { - return `${field}`.replace(/\_/g, "."); - } - - /** - * Retrieves and processes supported data points. - * - * This method reads the data points configuration file, extracts the data types, - * and transforms the data point names to use underscores. It returns an object - * with the transformed data point names as keys and their corresponding data types. - * - * @returns {Object} An object containing the supported data points with transformed names and data types. - */ - _getSupportedDataPoints() { - const datapointPath = config.getDataPointsPath(); - const dataPointObj = readDataPointsFile(datapointPath); - const supportedDataPoints = extractDataTypes(dataPointObj); - let result = {}; - Object.entries(supportedDataPoints).forEach(([node, value]) => { - const underscored_node = this._transformDataPointsWithUnderscores(node); - if (value !== null) { - result[underscored_node] = value; - } - }); - return result; - } - - /** - * Validates nodes against a given schema. - * - * @param {Object} message - The message containing nodes to be validated. - * @param {Object} dataPointsSchema - The schema against which nodes are validated. - * @returns {Object|null} An object containing error details if validation fails, otherwise null. - */ - _validateNodesAgainstSchema(message, dataPointsSchema) { - const { type } = message; - let nodes = message.node ? [message.node] : message.nodes; - - // Check if all nodes are valid based on the schema - const unknownFields = nodes.filter(({ name }) => { - const transformedName = this._transformDataPointsWithUnderscores(name); - return !dataPointsSchema.hasOwnProperty(transformedName); - }); - - if (unknownFields.length > 0) { - let errors = unknownFields.map(({ name }) => ({ - name: name, - status: "Parent object or node not found.", - })); - - const errorData = - errors.length === 1 ? { node: errors.at(0) } : { nodes: errors }; - - return errorData; - } - return null; - } -} - -module.exports = Handler; diff --git a/cdsp/information-layer/handlers/src/iotdb/.gitignore b/cdsp/information-layer/handlers/src/iotdb/.gitignore index 473d609..71aa67b 100644 --- a/cdsp/information-layer/handlers/src/iotdb/.gitignore +++ b/cdsp/information-layer/handlers/src/iotdb/.gitignore @@ -1,6 +1,2 @@ -# Node.js -node_modules/ -package-lock.json - # MAC **/.DS_Store diff --git a/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js b/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js deleted file mode 100644 index d4de5b3..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/config/data-points-type.js +++ /dev/null @@ -1,46 +0,0 @@ -const { SupportedMessageDataTypes } = require("../utils/iotdb-constants"); - -class DataPointsSchema { - constructor(supportedDataPoints) { - const properties = {}; - - Object.entries(supportedDataPoints).forEach(([key, value]) => { - if (SupportedMessageDataTypes.hasOwnProperty(value)) { - properties[key] = value; - } else { - throw new Error( - `The initialized data points contains an unsupported data type: ${value}`, - ); - } - }); - - this.dataPointsSchema = properties; - Object.freeze(this.dataPointsSchema); - } - - getDataPointsSchema() { - return this.dataPointsSchema; - } -} - -// Singleton instance holder -let dataPointsSchemaInstance = null; - -/** - * Creates and returns a singleton instance of DataPointsSchema. - * If the instance does not already exist, it initializes it with the provided supported data points - * and freezes the instance to prevent further modifications. - * - * @param {Object} supportedEndpoints - An object of supported data points to initialize the schema. - * @returns {Object} The data points schema instance. - */ -function createDataPointsSchema(supportedEndpoints) { - if (!dataPointsSchemaInstance) { - dataPointsSchemaInstance = new DataPointsSchema(supportedEndpoints); - Object.freeze(dataPointsSchemaInstance); - } - - return dataPointsSchemaInstance.getDataPointsSchema(); -} - -module.exports = { createDataPointsSchema }; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/database-params.js b/cdsp/information-layer/handlers/src/iotdb/config/database-params.js deleted file mode 100644 index 3edff12..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/config/database-params.js +++ /dev/null @@ -1,51 +0,0 @@ -const { getEnvValue } = require("../../../config/config"); - -/* - * Contains the definition of the database name and its identifier data point for each catalog. - */ -const databaseParams = Object.freeze({ - VSS: { - databaseName: "root.Vehicles", // name of the configured IoTDB for the VSS database - dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID - }, -}); - -const useDefaultValue = (defaultValue) => { - console.info(`Using default: ${defaultValue}`); - return defaultValue; -}; - -/** - * Retrieves the database configuration for IoTDB. - * - * This function gathers configuration values for connecting to an IoTDB instance. - * It first attempts to get the values from environment variables. If the environment - * variables are not set, it uses default values. - * - * @returns {Object} An object containing the IoTDB configuration. - */ -const getDatabaseConfig = () => { - const iotdb_config = {}; - - let default_timeZoneId = Intl.DateTimeFormat().resolvedOptions().timeZone; - - iotdb_config["iotdbHost"] = - getEnvValue("IOTDB_HOST") || useDefaultValue("iotdb-service"); - iotdb_config["iotdbPort"] = - getEnvValue("IOTDB_PORT") || useDefaultValue(6667); - iotdb_config["iotdbUser"] = - getEnvValue("IOTDB_USER") || useDefaultValue("root"); - iotdb_config["iotdbPassword"] = - getEnvValue("IOTDB_PASSWORD") || useDefaultValue("root"); - iotdb_config["fetchSize"] = - getEnvValue("IOTDB_FETCH_SIZE") || useDefaultValue(10000); - iotdb_config["timeZoneId"] = - getEnvValue("IOTDB_TIME_ZONE_ID") || useDefaultValue(default_timeZoneId); - - return Object.freeze(iotdb_config); -}; - -const databaseConfig = - getEnvValue("HANDLER_TYPE") === "iotdb" ? getDatabaseConfig() : {}; - -module.exports = { databaseParams, databaseConfig }; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/database-params.ts b/cdsp/information-layer/handlers/src/iotdb/config/database-params.ts new file mode 100644 index 0000000..22f8e90 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/config/database-params.ts @@ -0,0 +1,54 @@ +import { getEnvValue } from "../../../config/config"; +import { DatabaseParamsRecord } from "../../../utils/data_types"; + +/** + * Defines the shape of the IoTDB configuration object. + */ +interface IotDBConfig { + iotdbHost: string; + iotdbPort: number; + iotdbUser: string; + iotdbPassword: string; + fetchSize: number; + timeZoneId: string; +} + +/* + * Contains the definition of the database name and its identifier data point for each catalog. + */ +export const databaseParams: Readonly = { + VSS: { + databaseName: "root.Vehicles", // name of the configured IoTDB for the VSS database + dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID + }, +}; + +/** + * Retrieves the database configuration for IoTDB. + * + * This function gathers configuration values for connecting to an IoTDB instance. + * It first attempts to get the values from environment variables. If the environment + * variables are not set, it uses default values. + * + * @returns {IotDBConfig} An object containing the IoTDB configuration. + */ +const getDatabaseConfig = (): Readonly => { + const iotdb_config: IotDBConfig = { + iotdbHost: getEnvValue("IOTDB_HOST") || "iotdb-service", + iotdbPort: Number(getEnvValue("IOTDB_PORT")) || 6667, + iotdbUser: getEnvValue("IOTDB_USER") || "root", + iotdbPassword: getEnvValue("IOTDB_PASSWORD") || "root", + fetchSize: Number(getEnvValue("IOTDB_FETCH_SIZE")) || 10000, + timeZoneId: + getEnvValue("IOTDB_TIME_ZONE_ID") || + Intl.DateTimeFormat().resolvedOptions().timeZone, + }; + + return iotdb_config; +}; + +/** + * If the HANDLER_TYPE is set to 'iotdb', the IoTDB configuration is used. + */ +export const databaseConfig: Readonly | undefined = + getEnvValue("HANDLER_TYPE") === "iotdb" ? getDatabaseConfig() : undefined; diff --git a/cdsp/information-layer/handlers/src/iotdb/config/iotdb-config.ts b/cdsp/information-layer/handlers/src/iotdb/config/iotdb-config.ts new file mode 100644 index 0000000..a52572e --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/config/iotdb-config.ts @@ -0,0 +1,62 @@ +import { SupportedMessageDataTypes } from "../utils/iotdb-constants"; + +export interface SupportedDataPoints { + [key: string]: keyof typeof SupportedMessageDataTypes; +} + +/** + * Validates and creates the data points schema. + * Ensures only supported data types are included. + * + * @param supportedDataPoints - An object containing the supported data points. + * @returns The validated and immutable data points schema. + */ +function buildSchema( + supportedDataPoints: SupportedDataPoints, +): SupportedDataPoints { + const properties: SupportedDataPoints = {}; + + Object.entries(supportedDataPoints).forEach(([key, value]) => { + if (isSupportedDataPoint(value)) { + properties[key] = value; + } else { + throw new Error( + `The initialized data points contains an unsupported data type: ${value}`, + ); + } + }); + + return Object.freeze(properties); +} +/** + * Type guard to check if a data type is supported by SupportedMessageDataTypes. + * + * @param type - The data type to check. + * @returns A boolean indicating whether the type is valid. + */ +export function isSupportedDataPoint( + type: string, +): type is keyof typeof SupportedMessageDataTypes { + return type in SupportedMessageDataTypes; +} + +// Singleton instance holder +let dataPointsSchemaInstance: SupportedDataPoints | null = null; + +/** + * Creates and returns a singleton instance of DataPointsSchema. + * If the instance does not already exist, it initializes it with the provided supported data points + * and freezes the instance to prevent further modifications. + * + * @param supportedEndpoints - An object of supported data points to initialize the schema. + * @returns The data points schema instance. + */ +export function createDataPointsSchema( + supportedEndpoints: SupportedDataPoints, +): SupportedDataPoints { + if (!dataPointsSchemaInstance) { + dataPointsSchemaInstance = buildSchema(supportedEndpoints); + } + + return dataPointsSchemaInstance; +} diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.d.ts b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.d.ts new file mode 100644 index 0000000..d8d786a --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.d.ts @@ -0,0 +1,33 @@ +import * as IClientRPCService from './IClientRPCService_types'; +import { + TSOpenSessionReq, + TSOpenSessionResp, + TSCloseSessionReq, + TSExecuteStatementReq, + TSExecuteStatementResp, + TSInsertRecordReq, +} from './IClientRPCService_types'; +type Callback = (err: E, resp: T) => void; + +interface Int64 { + constructor(o?: number | string): this; + toString(): string; + toJson(): string; +} + +export class Client { + openSession(req: TSOpenSessionReq, callback: Callback): void; + openSession(req: TSOpenSessionReq): Promise; + + closeSession(req: TSCloseSessionReq, callback: Callback): void; + closeSession(req: TSCloseSessionReq): Promise; + + executeQueryStatement(req: TSExecuteStatementReq, callback: Callback): void; + executeQueryStatement(req: TSExecuteStatementReq): Promise; + + requestStatementId(sessionId: Int64, callback: Callback): void; + requestStatementId(sessionId: Int64): Promise; + + insertRecord(req: TSInsertRecordReq, callback: Callback): void; + insertRecord(req: TSInsertRecordReq): Promise; +} diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js index b7deb43..86724e1 100644 --- a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js +++ b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.js @@ -1,5 +1,5 @@ // -// Autogenerated by Thrift Compiler (0.14.1) +// Autogenerated by Thrift Compiler (0.22.0) // // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING // @@ -10,22 +10,20 @@ var Thrift = thrift.Thrift; var Q = thrift.Q; var Int64 = require('node-int64'); -var common_ttypes = require('./common_types'); - -var ttypes = require('./client_types'); +var ttypes = require('./IClientRPCService_types'); //HELPER FUNCTIONS AND STRUCTURES -var IClientRPCService_executeQueryStatementV2_args = function(args) { +var IClientRPCService_openSession_args = function(args) { this.req = null; if (args) { if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteStatementReq(args.req); + this.req = new ttypes.TSOpenSessionReq(args.req); } } }; -IClientRPCService_executeQueryStatementV2_args.prototype = {}; -IClientRPCService_executeQueryStatementV2_args.prototype.read = function(input) { +IClientRPCService_openSession_args.prototype = {}; +IClientRPCService_openSession_args.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -37,8 +35,8 @@ IClientRPCService_executeQueryStatementV2_args.prototype.read = function(input) switch (fid) { case 1: if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); + this.req = new ttypes.TSOpenSessionReq(); + this.req[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -55,11 +53,11 @@ IClientRPCService_executeQueryStatementV2_args.prototype.read = function(input) return; }; -IClientRPCService_executeQueryStatementV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeQueryStatementV2_args'); +IClientRPCService_openSession_args.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_openSession_args'); if (this.req !== null && this.req !== undefined) { output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); + this.req[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -67,16 +65,16 @@ IClientRPCService_executeQueryStatementV2_args.prototype.write = function(output return; }; -var IClientRPCService_executeQueryStatementV2_result = function(args) { +var IClientRPCService_openSession_result = function(args) { this.success = null; if (args) { if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); + this.success = new ttypes.TSOpenSessionResp(args.success); } } }; -IClientRPCService_executeQueryStatementV2_result.prototype = {}; -IClientRPCService_executeQueryStatementV2_result.prototype.read = function(input) { +IClientRPCService_openSession_result.prototype = {}; +IClientRPCService_openSession_result.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -88,8 +86,8 @@ IClientRPCService_executeQueryStatementV2_result.prototype.read = function(input switch (fid) { case 0: if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); + this.success = new ttypes.TSOpenSessionResp(); + this.success[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -106,11 +104,11 @@ IClientRPCService_executeQueryStatementV2_result.prototype.read = function(input return; }; -IClientRPCService_executeQueryStatementV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeQueryStatementV2_result'); +IClientRPCService_openSession_result.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_openSession_result'); if (this.success !== null && this.success !== undefined) { output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); + this.success[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -118,16 +116,16 @@ IClientRPCService_executeQueryStatementV2_result.prototype.write = function(outp return; }; -var IClientRPCService_executeUpdateStatementV2_args = function(args) { +var IClientRPCService_closeSession_args = function(args) { this.req = null; if (args) { if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteStatementReq(args.req); + this.req = new ttypes.TSCloseSessionReq(args.req); } } }; -IClientRPCService_executeUpdateStatementV2_args.prototype = {}; -IClientRPCService_executeUpdateStatementV2_args.prototype.read = function(input) { +IClientRPCService_closeSession_args.prototype = {}; +IClientRPCService_closeSession_args.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -139,8 +137,8 @@ IClientRPCService_executeUpdateStatementV2_args.prototype.read = function(input) switch (fid) { case 1: if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); + this.req = new ttypes.TSCloseSessionReq(); + this.req[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -157,11 +155,11 @@ IClientRPCService_executeUpdateStatementV2_args.prototype.read = function(input) return; }; -IClientRPCService_executeUpdateStatementV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeUpdateStatementV2_args'); +IClientRPCService_closeSession_args.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_closeSession_args'); if (this.req !== null && this.req !== undefined) { output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); + this.req[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -169,58 +167,32 @@ IClientRPCService_executeUpdateStatementV2_args.prototype.write = function(outpu return; }; -var IClientRPCService_executeUpdateStatementV2_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } +var IClientRPCService_closeSession_result = function(args) { }; -IClientRPCService_executeUpdateStatementV2_result.prototype = {}; -IClientRPCService_executeUpdateStatementV2_result.prototype.read = function(input) { +IClientRPCService_closeSession_result.prototype = {}; +IClientRPCService_closeSession_result.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); var ftype = ret.ftype; - var fid = ret.fid; if (ftype == Thrift.Type.STOP) { break; } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } + input.skip(ftype); input.readFieldEnd(); } input.readStructEnd(); return; }; -IClientRPCService_executeUpdateStatementV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeUpdateStatementV2_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } +IClientRPCService_closeSession_result.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_closeSession_result'); output.writeFieldStop(); output.writeStructEnd(); return; }; -var IClientRPCService_executeStatementV2_args = function(args) { +var IClientRPCService_executeQueryStatement_args = function(args) { this.req = null; if (args) { if (args.req !== undefined && args.req !== null) { @@ -228,8 +200,8 @@ var IClientRPCService_executeStatementV2_args = function(args) { } } }; -IClientRPCService_executeStatementV2_args.prototype = {}; -IClientRPCService_executeStatementV2_args.prototype.read = function(input) { +IClientRPCService_executeQueryStatement_args.prototype = {}; +IClientRPCService_executeQueryStatement_args.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -242,7 +214,7 @@ IClientRPCService_executeStatementV2_args.prototype.read = function(input) { case 1: if (ftype == Thrift.Type.STRUCT) { this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); + this.req[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -259,11 +231,11 @@ IClientRPCService_executeStatementV2_args.prototype.read = function(input) { return; }; -IClientRPCService_executeStatementV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeStatementV2_args'); +IClientRPCService_executeQueryStatement_args.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatement_args'); if (this.req !== null && this.req !== undefined) { output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); + this.req[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -271,7 +243,7 @@ IClientRPCService_executeStatementV2_args.prototype.write = function(output) { return; }; -var IClientRPCService_executeStatementV2_result = function(args) { +var IClientRPCService_executeQueryStatement_result = function(args) { this.success = null; if (args) { if (args.success !== undefined && args.success !== null) { @@ -279,8 +251,8 @@ var IClientRPCService_executeStatementV2_result = function(args) { } } }; -IClientRPCService_executeStatementV2_result.prototype = {}; -IClientRPCService_executeStatementV2_result.prototype.read = function(input) { +IClientRPCService_executeQueryStatement_result.prototype = {}; +IClientRPCService_executeQueryStatement_result.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -293,7 +265,7 @@ IClientRPCService_executeStatementV2_result.prototype.read = function(input) { case 0: if (ftype == Thrift.Type.STRUCT) { this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); + this.success[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -310,11 +282,11 @@ IClientRPCService_executeStatementV2_result.prototype.read = function(input) { return; }; -IClientRPCService_executeStatementV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeStatementV2_result'); +IClientRPCService_executeQueryStatement_result.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_executeQueryStatement_result'); if (this.success !== null && this.success !== undefined) { output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); + this.success[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -322,16 +294,16 @@ IClientRPCService_executeStatementV2_result.prototype.write = function(output) { return; }; -var IClientRPCService_executeRawDataQueryV2_args = function(args) { - this.req = null; +var IClientRPCService_requestStatementId_args = function(args) { + this.sessionId = null; if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSRawDataQueryReq(args.req); + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; } } }; -IClientRPCService_executeRawDataQueryV2_args.prototype = {}; -IClientRPCService_executeRawDataQueryV2_args.prototype.read = function(input) { +IClientRPCService_requestStatementId_args.prototype = {}; +IClientRPCService_requestStatementId_args.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -342,9 +314,8 @@ IClientRPCService_executeRawDataQueryV2_args.prototype.read = function(input) { } switch (fid) { case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSRawDataQueryReq(); - this.req.read(input); + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); } else { input.skip(ftype); } @@ -361,11 +332,11 @@ IClientRPCService_executeRawDataQueryV2_args.prototype.read = function(input) { return; }; -IClientRPCService_executeRawDataQueryV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeRawDataQueryV2_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); +IClientRPCService_requestStatementId_args.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_requestStatementId_args'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); output.writeFieldEnd(); } output.writeFieldStop(); @@ -373,16 +344,16 @@ IClientRPCService_executeRawDataQueryV2_args.prototype.write = function(output) return; }; -var IClientRPCService_executeRawDataQueryV2_result = function(args) { +var IClientRPCService_requestStatementId_result = function(args) { this.success = null; if (args) { if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); + this.success = args.success; } } }; -IClientRPCService_executeRawDataQueryV2_result.prototype = {}; -IClientRPCService_executeRawDataQueryV2_result.prototype.read = function(input) { +IClientRPCService_requestStatementId_result.prototype = {}; +IClientRPCService_requestStatementId_result.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -393,9 +364,8 @@ IClientRPCService_executeRawDataQueryV2_result.prototype.read = function(input) } switch (fid) { case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); + if (ftype == Thrift.Type.I64) { + this.success = input.readI64(); } else { input.skip(ftype); } @@ -412,11 +382,11 @@ IClientRPCService_executeRawDataQueryV2_result.prototype.read = function(input) return; }; -IClientRPCService_executeRawDataQueryV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeRawDataQueryV2_result'); +IClientRPCService_requestStatementId_result.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_requestStatementId_result'); if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); + output.writeFieldBegin('success', Thrift.Type.I64, 0); + output.writeI64(this.success); output.writeFieldEnd(); } output.writeFieldStop(); @@ -424,16 +394,16 @@ IClientRPCService_executeRawDataQueryV2_result.prototype.write = function(output return; }; -var IClientRPCService_executeLastDataQueryV2_args = function(args) { +var IClientRPCService_insertRecord_args = function(args) { this.req = null; if (args) { if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSLastDataQueryReq(args.req); + this.req = new ttypes.TSInsertRecordReq(args.req); } } }; -IClientRPCService_executeLastDataQueryV2_args.prototype = {}; -IClientRPCService_executeLastDataQueryV2_args.prototype.read = function(input) { +IClientRPCService_insertRecord_args.prototype = {}; +IClientRPCService_insertRecord_args.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -445,8 +415,8 @@ IClientRPCService_executeLastDataQueryV2_args.prototype.read = function(input) { switch (fid) { case 1: if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSLastDataQueryReq(); - this.req.read(input); + this.req = new ttypes.TSInsertRecordReq(); + this.req[Symbol.for("read")](input); } else { input.skip(ftype); } @@ -463,11 +433,11 @@ IClientRPCService_executeLastDataQueryV2_args.prototype.read = function(input) { return; }; -IClientRPCService_executeLastDataQueryV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeLastDataQueryV2_args'); +IClientRPCService_insertRecord_args.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_insertRecord_args'); if (this.req !== null && this.req !== undefined) { output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); + this.req[Symbol.for("write")](output); output.writeFieldEnd(); } output.writeFieldStop(); @@ -475,16 +445,16 @@ IClientRPCService_executeLastDataQueryV2_args.prototype.write = function(output) return; }; -var IClientRPCService_executeLastDataQueryV2_result = function(args) { +var IClientRPCService_insertRecord_result = function(args) { this.success = null; if (args) { if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); + this.success = args.success; } } }; -IClientRPCService_executeLastDataQueryV2_result.prototype = {}; -IClientRPCService_executeLastDataQueryV2_result.prototype.read = function(input) { +IClientRPCService_insertRecord_result.prototype = {}; +IClientRPCService_insertRecord_result.prototype[Symbol.for("read")] = function(input) { input.readStructBegin(); while (true) { var ret = input.readFieldBegin(); @@ -495,9 +465,8 @@ IClientRPCService_executeLastDataQueryV2_result.prototype.read = function(input) } switch (fid) { case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); + if (ftype == Thrift.Type.I32) { + this.success = input.readI32(); } else { input.skip(ftype); } @@ -514,11 +483,11 @@ IClientRPCService_executeLastDataQueryV2_result.prototype.read = function(input) return; }; -IClientRPCService_executeLastDataQueryV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeLastDataQueryV2_result'); +IClientRPCService_insertRecord_result.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('IClientRPCService_insertRecord_result'); if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); + output.writeFieldBegin('success', Thrift.Type.I32, 0); + output.writeI32(this.success); output.writeFieldEnd(); } output.writeFieldStop(); @@ -526,12517 +495,504 @@ IClientRPCService_executeLastDataQueryV2_result.prototype.write = function(outpu return; }; -var IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSFastLastDataQueryForOneDeviceReq(args.req); - } - } +var IClientRPCServiceClient = exports.Client = function(output, pClass) { + this.output = output; + this.pClass = pClass; + this._seqid = 0; + this._reqs = {}; }; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype = {}; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSFastLastDataQueryForOneDeviceReq(); - this.req.read(input); +IClientRPCServiceClient.prototype = {}; +IClientRPCServiceClient.prototype.seqid = function() { return this._seqid; }; +IClientRPCServiceClient.prototype.new_seqid = function() { return this._seqid += 1; }; + +IClientRPCServiceClient.prototype.openSession = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); } else { - input.skip(ftype); + _defer.resolve(result); } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); + }; + this.send_openSession(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_openSession(req); } - input.readStructEnd(); - return; }; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); +IClientRPCServiceClient.prototype.send_openSession = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_openSession_args(params); + try { + output.writeMessageBegin('openSession', Thrift.MessageType.CALL, this.seqid()); + args[Symbol.for("write")](output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; } - output.writeFieldStop(); - output.writeStructEnd(); - return; }; -var IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } +IClientRPCServiceClient.prototype.recv_openSession = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x[Symbol.for("read")](input); + input.readMessageEnd(); + return callback(x); } + var result = new IClientRPCService_openSession_result(); + result[Symbol.for("read")](input); + input.readMessageEnd(); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('openSession failed: unknown result'); }; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype = {}; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); + +IClientRPCServiceClient.prototype.closeSession = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); } else { - input.skip(ftype); + _defer.resolve(result); } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); + }; + this.send_closeSession(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_closeSession(req); } - input.readStructEnd(); - return; }; -IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); +IClientRPCServiceClient.prototype.send_closeSession = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_closeSession_args(params); + try { + output.writeMessageBegin('closeSession', Thrift.MessageType.CALL, this.seqid()); + args[Symbol.for("write")](output); + output.writeMessageEnd(); + return this.output.flush(); } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeAggregationQueryV2_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSAggregationQueryReq(args.req); + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); } + throw e; } }; -IClientRPCService_executeAggregationQueryV2_args.prototype = {}; -IClientRPCService_executeAggregationQueryV2_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSAggregationQueryReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeAggregationQueryV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeAggregationQueryV2_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; -var IClientRPCService_executeAggregationQueryV2_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeAggregationQueryV2_result.prototype = {}; -IClientRPCService_executeAggregationQueryV2_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); +IClientRPCServiceClient.prototype.recv_closeSession = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x[Symbol.for("read")](input); + input.readMessageEnd(); + return callback(x); } - input.readStructEnd(); - return; -}; + var result = new IClientRPCService_closeSession_result(); + result[Symbol.for("read")](input); + input.readMessageEnd(); -IClientRPCService_executeAggregationQueryV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeAggregationQueryV2_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; + callback(null); }; -var IClientRPCService_executeGroupByQueryIntervalQuery_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSGroupByQueryIntervalReq(args.req); - } - } -}; -IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype = {}; -IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSGroupByQueryIntervalReq(); - this.req.read(input); +IClientRPCServiceClient.prototype.executeQueryStatement = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); } else { - input.skip(ftype); + _defer.resolve(result); } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeGroupByQueryIntervalQuery_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeGroupByQueryIntervalQuery_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); + }; + this.send_executeQueryStatement(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_executeQueryStatement(req); } - output.writeFieldStop(); - output.writeStructEnd(); - return; }; -var IClientRPCService_executeGroupByQueryIntervalQuery_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } +IClientRPCServiceClient.prototype.send_executeQueryStatement = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_executeQueryStatement_args(params); + try { + output.writeMessageBegin('executeQueryStatement', Thrift.MessageType.CALL, this.seqid()); + args[Symbol.for("write")](output); + output.writeMessageEnd(); + return this.output.flush(); } -}; -IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype = {}; -IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeGroupByQueryIntervalQuery_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeGroupByQueryIntervalQuery_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); + throw e; } - output.writeFieldStop(); - output.writeStructEnd(); - return; }; -var IClientRPCService_fetchResultsV2_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSFetchResultsReq(args.req); - } - } -}; -IClientRPCService_fetchResultsV2_args.prototype = {}; -IClientRPCService_fetchResultsV2_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSFetchResultsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); +IClientRPCServiceClient.prototype.recv_executeQueryStatement = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x[Symbol.for("read")](input); + input.readMessageEnd(); + return callback(x); } - input.readStructEnd(); - return; -}; + var result = new IClientRPCService_executeQueryStatement_result(); + result[Symbol.for("read")](input); + input.readMessageEnd(); -IClientRPCService_fetchResultsV2_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchResultsV2_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); + if (null !== result.success) { + return callback(null, result.success); } - output.writeFieldStop(); - output.writeStructEnd(); - return; + return callback('executeQueryStatement failed: unknown result'); }; -var IClientRPCService_fetchResultsV2_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSFetchResultsResp(args.success); - } - } -}; -IClientRPCService_fetchResultsV2_result.prototype = {}; -IClientRPCService_fetchResultsV2_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSFetchResultsResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchResultsV2_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchResultsV2_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_openSession_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSOpenSessionReq(args.req); - } - } -}; -IClientRPCService_openSession_args.prototype = {}; -IClientRPCService_openSession_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSOpenSessionReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_openSession_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_openSession_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_openSession_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSOpenSessionResp(args.success); - } - } -}; -IClientRPCService_openSession_result.prototype = {}; -IClientRPCService_openSession_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSOpenSessionResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_openSession_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_openSession_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_closeSession_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCloseSessionReq(args.req); - } - } -}; -IClientRPCService_closeSession_args.prototype = {}; -IClientRPCService_closeSession_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCloseSessionReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_closeSession_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_closeSession_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_closeSession_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_closeSession_result.prototype = {}; -IClientRPCService_closeSession_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_closeSession_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_closeSession_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeStatement_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteStatementReq(args.req); - } - } -}; -IClientRPCService_executeStatement_args.prototype = {}; -IClientRPCService_executeStatement_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeStatement_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeStatement_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeStatement_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeStatement_result.prototype = {}; -IClientRPCService_executeStatement_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeStatement_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeStatement_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeBatchStatement_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteBatchStatementReq(args.req); - } - } -}; -IClientRPCService_executeBatchStatement_args.prototype = {}; -IClientRPCService_executeBatchStatement_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteBatchStatementReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeBatchStatement_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeBatchStatement_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeBatchStatement_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_executeBatchStatement_result.prototype = {}; -IClientRPCService_executeBatchStatement_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeBatchStatement_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeBatchStatement_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeQueryStatement_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteStatementReq(args.req); - } - } -}; -IClientRPCService_executeQueryStatement_args.prototype = {}; -IClientRPCService_executeQueryStatement_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeQueryStatement_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeQueryStatement_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeQueryStatement_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeQueryStatement_result.prototype = {}; -IClientRPCService_executeQueryStatement_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeQueryStatement_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeQueryStatement_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeUpdateStatement_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSExecuteStatementReq(args.req); - } - } -}; -IClientRPCService_executeUpdateStatement_args.prototype = {}; -IClientRPCService_executeUpdateStatement_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSExecuteStatementReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeUpdateStatement_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeUpdateStatement_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeUpdateStatement_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeUpdateStatement_result.prototype = {}; -IClientRPCService_executeUpdateStatement_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeUpdateStatement_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeUpdateStatement_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchResults_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSFetchResultsReq(args.req); - } - } -}; -IClientRPCService_fetchResults_args.prototype = {}; -IClientRPCService_fetchResults_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSFetchResultsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchResults_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchResults_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchResults_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSFetchResultsResp(args.success); - } - } -}; -IClientRPCService_fetchResults_result.prototype = {}; -IClientRPCService_fetchResults_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSFetchResultsResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchResults_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchResults_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchMetadata_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSFetchMetadataReq(args.req); - } - } -}; -IClientRPCService_fetchMetadata_args.prototype = {}; -IClientRPCService_fetchMetadata_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSFetchMetadataReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchMetadata_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchMetadata_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchMetadata_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSFetchMetadataResp(args.success); - } - } -}; -IClientRPCService_fetchMetadata_result.prototype = {}; -IClientRPCService_fetchMetadata_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSFetchMetadataResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchMetadata_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchMetadata_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_cancelOperation_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCancelOperationReq(args.req); - } - } -}; -IClientRPCService_cancelOperation_args.prototype = {}; -IClientRPCService_cancelOperation_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCancelOperationReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_cancelOperation_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_cancelOperation_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_cancelOperation_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_cancelOperation_result.prototype = {}; -IClientRPCService_cancelOperation_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_cancelOperation_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_cancelOperation_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_closeOperation_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCloseOperationReq(args.req); - } - } -}; -IClientRPCService_closeOperation_args.prototype = {}; -IClientRPCService_closeOperation_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCloseOperationReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_closeOperation_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_closeOperation_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_closeOperation_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_closeOperation_result.prototype = {}; -IClientRPCService_closeOperation_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_closeOperation_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_closeOperation_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getTimeZone_args = function(args) { - this.sessionId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - } -}; -IClientRPCService_getTimeZone_args.prototype = {}; -IClientRPCService_getTimeZone_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getTimeZone_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getTimeZone_args'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getTimeZone_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSGetTimeZoneResp(args.success); - } - } -}; -IClientRPCService_getTimeZone_result.prototype = {}; -IClientRPCService_getTimeZone_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSGetTimeZoneResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getTimeZone_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getTimeZone_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setTimeZone_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSSetTimeZoneReq(args.req); - } - } -}; -IClientRPCService_setTimeZone_args.prototype = {}; -IClientRPCService_setTimeZone_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSSetTimeZoneReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setTimeZone_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setTimeZone_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setTimeZone_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_setTimeZone_result.prototype = {}; -IClientRPCService_setTimeZone_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setTimeZone_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setTimeZone_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getProperties_args = function(args) { -}; -IClientRPCService_getProperties_args.prototype = {}; -IClientRPCService_getProperties_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - if (ftype == Thrift.Type.STOP) { - break; - } - input.skip(ftype); - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getProperties_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getProperties_args'); - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getProperties_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.ServerProperties(args.success); - } - } -}; -IClientRPCService_getProperties_result.prototype = {}; -IClientRPCService_getProperties_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.ServerProperties(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getProperties_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getProperties_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setStorageGroup_args = function(args) { - this.sessionId = null; - this.storageGroup = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - if (args.storageGroup !== undefined && args.storageGroup !== null) { - this.storageGroup = args.storageGroup; - } - } -}; -IClientRPCService_setStorageGroup_args.prototype = {}; -IClientRPCService_setStorageGroup_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.storageGroup = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setStorageGroup_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setStorageGroup_args'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.storageGroup !== null && this.storageGroup !== undefined) { - output.writeFieldBegin('storageGroup', Thrift.Type.STRING, 2); - output.writeString(this.storageGroup); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setStorageGroup_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_setStorageGroup_result.prototype = {}; -IClientRPCService_setStorageGroup_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setStorageGroup_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setStorageGroup_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createTimeseries_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCreateTimeseriesReq(args.req); - } - } -}; -IClientRPCService_createTimeseries_args.prototype = {}; -IClientRPCService_createTimeseries_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCreateTimeseriesReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createTimeseries_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createTimeseries_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createTimeseries_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_createTimeseries_result.prototype = {}; -IClientRPCService_createTimeseries_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createTimeseries_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createTimeseries_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createAlignedTimeseries_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCreateAlignedTimeseriesReq(args.req); - } - } -}; -IClientRPCService_createAlignedTimeseries_args.prototype = {}; -IClientRPCService_createAlignedTimeseries_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCreateAlignedTimeseriesReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createAlignedTimeseries_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createAlignedTimeseries_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createAlignedTimeseries_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_createAlignedTimeseries_result.prototype = {}; -IClientRPCService_createAlignedTimeseries_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createAlignedTimeseries_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createAlignedTimeseries_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createMultiTimeseries_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCreateMultiTimeseriesReq(args.req); - } - } -}; -IClientRPCService_createMultiTimeseries_args.prototype = {}; -IClientRPCService_createMultiTimeseries_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCreateMultiTimeseriesReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createMultiTimeseries_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createMultiTimeseries_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createMultiTimeseries_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_createMultiTimeseries_result.prototype = {}; -IClientRPCService_createMultiTimeseries_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createMultiTimeseries_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createMultiTimeseries_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteTimeseries_args = function(args) { - this.sessionId = null; - this.path = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - if (args.path !== undefined && args.path !== null) { - this.path = Thrift.copyList(args.path, [null]); - } - } -}; -IClientRPCService_deleteTimeseries_args.prototype = {}; -IClientRPCService_deleteTimeseries_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.path = []; - var _rtmp3463 = input.readListBegin(); - var _size462 = _rtmp3463.size || 0; - for (var _i464 = 0; _i464 < _size462; ++_i464) { - var elem465 = null; - elem465 = input.readString(); - this.path.push(elem465); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteTimeseries_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteTimeseries_args'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.path !== null && this.path !== undefined) { - output.writeFieldBegin('path', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.path.length); - for (var iter466 in this.path) { - if (this.path.hasOwnProperty(iter466)) { - iter466 = this.path[iter466]; - output.writeString(iter466); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteTimeseries_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_deleteTimeseries_result.prototype = {}; -IClientRPCService_deleteTimeseries_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteTimeseries_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteTimeseries_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteStorageGroups_args = function(args) { - this.sessionId = null; - this.storageGroup = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - if (args.storageGroup !== undefined && args.storageGroup !== null) { - this.storageGroup = Thrift.copyList(args.storageGroup, [null]); - } - } -}; -IClientRPCService_deleteStorageGroups_args.prototype = {}; -IClientRPCService_deleteStorageGroups_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.storageGroup = []; - var _rtmp3468 = input.readListBegin(); - var _size467 = _rtmp3468.size || 0; - for (var _i469 = 0; _i469 < _size467; ++_i469) { - var elem470 = null; - elem470 = input.readString(); - this.storageGroup.push(elem470); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteStorageGroups_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteStorageGroups_args'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.storageGroup !== null && this.storageGroup !== undefined) { - output.writeFieldBegin('storageGroup', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.storageGroup.length); - for (var iter471 in this.storageGroup) { - if (this.storageGroup.hasOwnProperty(iter471)) { - iter471 = this.storageGroup[iter471]; - output.writeString(iter471); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteStorageGroups_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_deleteStorageGroups_result.prototype = {}; -IClientRPCService_deleteStorageGroups_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteStorageGroups_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteStorageGroups_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecord_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordReq(args.req); - } - } -}; -IClientRPCService_insertRecord_args.prototype = {}; -IClientRPCService_insertRecord_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecord_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecord_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecord_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertRecord_result.prototype = {}; -IClientRPCService_insertRecord_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecord_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecord_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecord_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertStringRecordReq(args.req); - } - } -}; -IClientRPCService_insertStringRecord_args.prototype = {}; -IClientRPCService_insertStringRecord_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertStringRecordReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecord_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecord_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecord_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertStringRecord_result.prototype = {}; -IClientRPCService_insertStringRecord_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecord_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecord_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertTablet_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertTabletReq(args.req); - } - } -}; -IClientRPCService_insertTablet_args.prototype = {}; -IClientRPCService_insertTablet_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertTabletReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertTablet_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertTablet_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertTablet_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertTablet_result.prototype = {}; -IClientRPCService_insertTablet_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertTablet_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertTablet_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertTablets_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertTabletsReq(args.req); - } - } -}; -IClientRPCService_insertTablets_args.prototype = {}; -IClientRPCService_insertTablets_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertTabletsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertTablets_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertTablets_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertTablets_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertTablets_result.prototype = {}; -IClientRPCService_insertTablets_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertTablets_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertTablets_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecords_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordsReq(args.req); - } - } -}; -IClientRPCService_insertRecords_args.prototype = {}; -IClientRPCService_insertRecords_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecords_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecords_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecords_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertRecords_result.prototype = {}; -IClientRPCService_insertRecords_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecords_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecords_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecordsOfOneDevice_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(args.req); - } - } -}; -IClientRPCService_insertRecordsOfOneDevice_args.prototype = {}; -IClientRPCService_insertRecordsOfOneDevice_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecordsOfOneDevice_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecordsOfOneDevice_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertRecordsOfOneDevice_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertRecordsOfOneDevice_result.prototype = {}; -IClientRPCService_insertRecordsOfOneDevice_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertRecordsOfOneDevice_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertRecordsOfOneDevice_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecordsOfOneDevice_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertStringRecordsOfOneDeviceReq(args.req); - } - } -}; -IClientRPCService_insertStringRecordsOfOneDevice_args.prototype = {}; -IClientRPCService_insertStringRecordsOfOneDevice_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertStringRecordsOfOneDeviceReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecordsOfOneDevice_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecordsOfOneDevice_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecordsOfOneDevice_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertStringRecordsOfOneDevice_result.prototype = {}; -IClientRPCService_insertStringRecordsOfOneDevice_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecordsOfOneDevice_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecordsOfOneDevice_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecords_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertStringRecordsReq(args.req); - } - } -}; -IClientRPCService_insertStringRecords_args.prototype = {}; -IClientRPCService_insertStringRecords_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertStringRecordsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecords_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecords_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_insertStringRecords_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_insertStringRecords_result.prototype = {}; -IClientRPCService_insertStringRecords_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_insertStringRecords_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_insertStringRecords_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertTablet_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertTabletReq(args.req); - } - } -}; -IClientRPCService_testInsertTablet_args.prototype = {}; -IClientRPCService_testInsertTablet_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertTabletReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertTablet_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertTablet_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertTablet_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertTablet_result.prototype = {}; -IClientRPCService_testInsertTablet_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertTablet_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertTablet_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertTablets_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertTabletsReq(args.req); - } - } -}; -IClientRPCService_testInsertTablets_args.prototype = {}; -IClientRPCService_testInsertTablets_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertTabletsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertTablets_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertTablets_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertTablets_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertTablets_result.prototype = {}; -IClientRPCService_testInsertTablets_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertTablets_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertTablets_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecord_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordReq(args.req); - } - } -}; -IClientRPCService_testInsertRecord_args.prototype = {}; -IClientRPCService_testInsertRecord_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecord_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecord_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecord_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertRecord_result.prototype = {}; -IClientRPCService_testInsertRecord_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecord_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecord_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertStringRecord_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertStringRecordReq(args.req); - } - } -}; -IClientRPCService_testInsertStringRecord_args.prototype = {}; -IClientRPCService_testInsertStringRecord_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertStringRecordReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertStringRecord_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertStringRecord_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertStringRecord_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertStringRecord_result.prototype = {}; -IClientRPCService_testInsertStringRecord_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertStringRecord_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertStringRecord_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecords_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordsReq(args.req); - } - } -}; -IClientRPCService_testInsertRecords_args.prototype = {}; -IClientRPCService_testInsertRecords_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecords_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecords_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecords_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertRecords_result.prototype = {}; -IClientRPCService_testInsertRecords_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecords_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecords_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecordsOfOneDevice_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(args.req); - } - } -}; -IClientRPCService_testInsertRecordsOfOneDevice_args.prototype = {}; -IClientRPCService_testInsertRecordsOfOneDevice_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertRecordsOfOneDeviceReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecordsOfOneDevice_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecordsOfOneDevice_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertRecordsOfOneDevice_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertRecordsOfOneDevice_result.prototype = {}; -IClientRPCService_testInsertRecordsOfOneDevice_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertRecordsOfOneDevice_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertRecordsOfOneDevice_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertStringRecords_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSInsertStringRecordsReq(args.req); - } - } -}; -IClientRPCService_testInsertStringRecords_args.prototype = {}; -IClientRPCService_testInsertStringRecords_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSInsertStringRecordsReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertStringRecords_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertStringRecords_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testInsertStringRecords_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testInsertStringRecords_result.prototype = {}; -IClientRPCService_testInsertStringRecords_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testInsertStringRecords_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testInsertStringRecords_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteData_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSDeleteDataReq(args.req); - } - } -}; -IClientRPCService_deleteData_args.prototype = {}; -IClientRPCService_deleteData_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSDeleteDataReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteData_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteData_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_deleteData_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_deleteData_result.prototype = {}; -IClientRPCService_deleteData_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_deleteData_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_deleteData_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeRawDataQuery_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSRawDataQueryReq(args.req); - } - } -}; -IClientRPCService_executeRawDataQuery_args.prototype = {}; -IClientRPCService_executeRawDataQuery_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSRawDataQueryReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeRawDataQuery_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeRawDataQuery_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeRawDataQuery_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeRawDataQuery_result.prototype = {}; -IClientRPCService_executeRawDataQuery_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeRawDataQuery_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeRawDataQuery_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeLastDataQuery_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSLastDataQueryReq(args.req); - } - } -}; -IClientRPCService_executeLastDataQuery_args.prototype = {}; -IClientRPCService_executeLastDataQuery_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSLastDataQueryReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeLastDataQuery_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeLastDataQuery_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeLastDataQuery_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeLastDataQuery_result.prototype = {}; -IClientRPCService_executeLastDataQuery_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeLastDataQuery_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeLastDataQuery_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeAggregationQuery_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSAggregationQueryReq(args.req); - } - } -}; -IClientRPCService_executeAggregationQuery_args.prototype = {}; -IClientRPCService_executeAggregationQuery_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSAggregationQueryReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeAggregationQuery_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeAggregationQuery_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_executeAggregationQuery_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSExecuteStatementResp(args.success); - } - } -}; -IClientRPCService_executeAggregationQuery_result.prototype = {}; -IClientRPCService_executeAggregationQuery_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSExecuteStatementResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_executeAggregationQuery_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_executeAggregationQuery_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_requestStatementId_args = function(args) { - this.sessionId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - } -}; -IClientRPCService_requestStatementId_args.prototype = {}; -IClientRPCService_requestStatementId_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_requestStatementId_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_requestStatementId_args'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_requestStatementId_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = args.success; - } - } -}; -IClientRPCService_requestStatementId_result.prototype = {}; -IClientRPCService_requestStatementId_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.I64) { - this.success = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_requestStatementId_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_requestStatementId_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.I64, 0); - output.writeI64(this.success); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSCreateSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_createSchemaTemplate_args.prototype = {}; -IClientRPCService_createSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSCreateSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_createSchemaTemplate_result.prototype = {}; -IClientRPCService_createSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_appendSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSAppendSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_appendSchemaTemplate_args.prototype = {}; -IClientRPCService_appendSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSAppendSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_appendSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_appendSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_appendSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_appendSchemaTemplate_result.prototype = {}; -IClientRPCService_appendSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_appendSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_appendSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pruneSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSPruneSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_pruneSchemaTemplate_args.prototype = {}; -IClientRPCService_pruneSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSPruneSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pruneSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pruneSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pruneSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_pruneSchemaTemplate_result.prototype = {}; -IClientRPCService_pruneSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pruneSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pruneSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_querySchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSQueryTemplateReq(args.req); - } - } -}; -IClientRPCService_querySchemaTemplate_args.prototype = {}; -IClientRPCService_querySchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSQueryTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_querySchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_querySchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_querySchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSQueryTemplateResp(args.success); - } - } -}; -IClientRPCService_querySchemaTemplate_result.prototype = {}; -IClientRPCService_querySchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSQueryTemplateResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_querySchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_querySchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_showConfigurationTemplate_args = function(args) { -}; -IClientRPCService_showConfigurationTemplate_args.prototype = {}; -IClientRPCService_showConfigurationTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - if (ftype == Thrift.Type.STOP) { - break; - } - input.skip(ftype); - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_showConfigurationTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_showConfigurationTemplate_args'); - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_showConfigurationTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TShowConfigurationTemplateResp(args.success); - } - } -}; -IClientRPCService_showConfigurationTemplate_result.prototype = {}; -IClientRPCService_showConfigurationTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TShowConfigurationTemplateResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_showConfigurationTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_showConfigurationTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_showConfiguration_args = function(args) { - this.nodeId = null; - if (args) { - if (args.nodeId !== undefined && args.nodeId !== null) { - this.nodeId = args.nodeId; - } - } -}; -IClientRPCService_showConfiguration_args.prototype = {}; -IClientRPCService_showConfiguration_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.nodeId = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_showConfiguration_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_showConfiguration_args'); - if (this.nodeId !== null && this.nodeId !== undefined) { - output.writeFieldBegin('nodeId', Thrift.Type.I32, 1); - output.writeI32(this.nodeId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_showConfiguration_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TShowConfigurationResp(args.success); - } - } -}; -IClientRPCService_showConfiguration_result.prototype = {}; -IClientRPCService_showConfiguration_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TShowConfigurationResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_showConfiguration_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_showConfiguration_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSSetSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_setSchemaTemplate_args.prototype = {}; -IClientRPCService_setSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSSetSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_setSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_setSchemaTemplate_result.prototype = {}; -IClientRPCService_setSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_setSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_setSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_unsetSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSUnsetSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_unsetSchemaTemplate_args.prototype = {}; -IClientRPCService_unsetSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSUnsetSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_unsetSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_unsetSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_unsetSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_unsetSchemaTemplate_result.prototype = {}; -IClientRPCService_unsetSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_unsetSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_unsetSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_dropSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TSDropSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_dropSchemaTemplate_args.prototype = {}; -IClientRPCService_dropSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TSDropSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_dropSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_dropSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_dropSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_dropSchemaTemplate_result.prototype = {}; -IClientRPCService_dropSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_dropSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_dropSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createTimeseriesUsingSchemaTemplate_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TCreateTimeseriesUsingSchemaTemplateReq(args.req); - } - } -}; -IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype = {}; -IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TCreateTimeseriesUsingSchemaTemplateReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createTimeseriesUsingSchemaTemplate_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createTimeseriesUsingSchemaTemplate_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, 1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_createTimeseriesUsingSchemaTemplate_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype = {}; -IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_createTimeseriesUsingSchemaTemplate_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_createTimeseriesUsingSchemaTemplate_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_handshake_args = function(args) { - this.info = null; - if (args) { - if (args.info !== undefined && args.info !== null) { - this.info = new ttypes.TSyncIdentityInfo(args.info); - } - } -}; -IClientRPCService_handshake_args.prototype = {}; -IClientRPCService_handshake_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case -1: - if (ftype == Thrift.Type.STRUCT) { - this.info = new ttypes.TSyncIdentityInfo(); - this.info.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_handshake_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_handshake_args'); - if (this.info !== null && this.info !== undefined) { - output.writeFieldBegin('info', Thrift.Type.STRUCT, -1); - this.info.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_handshake_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_handshake_result.prototype = {}; -IClientRPCService_handshake_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_handshake_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_handshake_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_sendPipeData_args = function(args) { - this.buff = null; - if (args) { - if (args.buff !== undefined && args.buff !== null) { - this.buff = args.buff; - } - } -}; -IClientRPCService_sendPipeData_args.prototype = {}; -IClientRPCService_sendPipeData_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.buff = input.readBinary(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_sendPipeData_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_sendPipeData_args'); - if (this.buff !== null && this.buff !== undefined) { - output.writeFieldBegin('buff', Thrift.Type.STRING, 1); - output.writeBinary(this.buff); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_sendPipeData_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_sendPipeData_result.prototype = {}; -IClientRPCService_sendPipeData_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_sendPipeData_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_sendPipeData_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_sendFile_args = function(args) { - this.metaInfo = null; - this.buff = null; - if (args) { - if (args.metaInfo !== undefined && args.metaInfo !== null) { - this.metaInfo = new ttypes.TSyncTransportMetaInfo(args.metaInfo); - } - if (args.buff !== undefined && args.buff !== null) { - this.buff = args.buff; - } - } -}; -IClientRPCService_sendFile_args.prototype = {}; -IClientRPCService_sendFile_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.metaInfo = new ttypes.TSyncTransportMetaInfo(); - this.metaInfo.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.buff = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_sendFile_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_sendFile_args'); - if (this.metaInfo !== null && this.metaInfo !== undefined) { - output.writeFieldBegin('metaInfo', Thrift.Type.STRUCT, 1); - this.metaInfo.write(output); - output.writeFieldEnd(); - } - if (this.buff !== null && this.buff !== undefined) { - output.writeFieldBegin('buff', Thrift.Type.STRING, 2); - output.writeBinary(this.buff); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_sendFile_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_sendFile_result.prototype = {}; -IClientRPCService_sendFile_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_sendFile_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_sendFile_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pipeTransfer_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TPipeTransferReq(args.req); - } - } -}; -IClientRPCService_pipeTransfer_args.prototype = {}; -IClientRPCService_pipeTransfer_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case -1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TPipeTransferReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pipeTransfer_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pipeTransfer_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, -1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pipeTransfer_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TPipeTransferResp(args.success); - } - } -}; -IClientRPCService_pipeTransfer_result.prototype = {}; -IClientRPCService_pipeTransfer_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TPipeTransferResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pipeTransfer_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pipeTransfer_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pipeSubscribe_args = function(args) { - this.req = null; - if (args) { - if (args.req !== undefined && args.req !== null) { - this.req = new ttypes.TPipeSubscribeReq(args.req); - } - } -}; -IClientRPCService_pipeSubscribe_args.prototype = {}; -IClientRPCService_pipeSubscribe_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case -1: - if (ftype == Thrift.Type.STRUCT) { - this.req = new ttypes.TPipeSubscribeReq(); - this.req.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pipeSubscribe_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pipeSubscribe_args'); - if (this.req !== null && this.req !== undefined) { - output.writeFieldBegin('req', Thrift.Type.STRUCT, -1); - this.req.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_pipeSubscribe_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TPipeSubscribeResp(args.success); - } - } -}; -IClientRPCService_pipeSubscribe_result.prototype = {}; -IClientRPCService_pipeSubscribe_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TPipeSubscribeResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_pipeSubscribe_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_pipeSubscribe_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getBackupConfiguration_args = function(args) { -}; -IClientRPCService_getBackupConfiguration_args.prototype = {}; -IClientRPCService_getBackupConfiguration_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - if (ftype == Thrift.Type.STOP) { - break; - } - input.skip(ftype); - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getBackupConfiguration_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getBackupConfiguration_args'); - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_getBackupConfiguration_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSBackupConfigurationResp(args.success); - } - } -}; -IClientRPCService_getBackupConfiguration_result.prototype = {}; -IClientRPCService_getBackupConfiguration_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSBackupConfigurationResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_getBackupConfiguration_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_getBackupConfiguration_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchAllConnectionsInfo_args = function(args) { -}; -IClientRPCService_fetchAllConnectionsInfo_args.prototype = {}; -IClientRPCService_fetchAllConnectionsInfo_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - if (ftype == Thrift.Type.STOP) { - break; - } - input.skip(ftype); - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchAllConnectionsInfo_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchAllConnectionsInfo_args'); - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_fetchAllConnectionsInfo_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new ttypes.TSConnectionInfoResp(args.success); - } - } -}; -IClientRPCService_fetchAllConnectionsInfo_result.prototype = {}; -IClientRPCService_fetchAllConnectionsInfo_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new ttypes.TSConnectionInfoResp(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_fetchAllConnectionsInfo_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_fetchAllConnectionsInfo_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testConnectionEmptyRPC_args = function(args) { -}; -IClientRPCService_testConnectionEmptyRPC_args.prototype = {}; -IClientRPCService_testConnectionEmptyRPC_args.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - if (ftype == Thrift.Type.STOP) { - break; - } - input.skip(ftype); - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testConnectionEmptyRPC_args.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testConnectionEmptyRPC_args'); - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCService_testConnectionEmptyRPC_result = function(args) { - this.success = null; - if (args) { - if (args.success !== undefined && args.success !== null) { - this.success = new common_ttypes.TSStatus(args.success); - } - } -}; -IClientRPCService_testConnectionEmptyRPC_result.prototype = {}; -IClientRPCService_testConnectionEmptyRPC_result.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 0: - if (ftype == Thrift.Type.STRUCT) { - this.success = new common_ttypes.TSStatus(); - this.success.read(input); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -IClientRPCService_testConnectionEmptyRPC_result.prototype.write = function(output) { - output.writeStructBegin('IClientRPCService_testConnectionEmptyRPC_result'); - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.STRUCT, 0); - this.success.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var IClientRPCServiceClient = exports.Client = function(output, pClass) { - this.output = output; - this.pClass = pClass; - this._seqid = 0; - this._reqs = {}; -}; -IClientRPCServiceClient.prototype = {}; -IClientRPCServiceClient.prototype.seqid = function() { return this._seqid; }; -IClientRPCServiceClient.prototype.new_seqid = function() { return this._seqid += 1; }; - -IClientRPCServiceClient.prototype.executeQueryStatementV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeQueryStatementV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeQueryStatementV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeQueryStatementV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeQueryStatementV2_args(params); - try { - output.writeMessageBegin('executeQueryStatementV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeQueryStatementV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeQueryStatementV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeQueryStatementV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeUpdateStatementV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeUpdateStatementV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeUpdateStatementV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeUpdateStatementV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeUpdateStatementV2_args(params); - try { - output.writeMessageBegin('executeUpdateStatementV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeUpdateStatementV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeUpdateStatementV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeUpdateStatementV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeStatementV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeStatementV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeStatementV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeStatementV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeStatementV2_args(params); - try { - output.writeMessageBegin('executeStatementV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeStatementV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeStatementV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeStatementV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeRawDataQueryV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeRawDataQueryV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeRawDataQueryV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeRawDataQueryV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeRawDataQueryV2_args(params); - try { - output.writeMessageBegin('executeRawDataQueryV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeRawDataQueryV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeRawDataQueryV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeRawDataQueryV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeLastDataQueryV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeLastDataQueryV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeLastDataQueryV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeLastDataQueryV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeLastDataQueryV2_args(params); - try { - output.writeMessageBegin('executeLastDataQueryV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeLastDataQueryV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeLastDataQueryV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeLastDataQueryV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeFastLastDataQueryForOneDeviceV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeFastLastDataQueryForOneDeviceV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeFastLastDataQueryForOneDeviceV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeFastLastDataQueryForOneDeviceV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args(params); - try { - output.writeMessageBegin('executeFastLastDataQueryForOneDeviceV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeFastLastDataQueryForOneDeviceV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeFastLastDataQueryForOneDeviceV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeAggregationQueryV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeAggregationQueryV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeAggregationQueryV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeAggregationQueryV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeAggregationQueryV2_args(params); - try { - output.writeMessageBegin('executeAggregationQueryV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeAggregationQueryV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeAggregationQueryV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeAggregationQueryV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeGroupByQueryIntervalQuery = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeGroupByQueryIntervalQuery(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeGroupByQueryIntervalQuery(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeGroupByQueryIntervalQuery = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeGroupByQueryIntervalQuery_args(params); - try { - output.writeMessageBegin('executeGroupByQueryIntervalQuery', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeGroupByQueryIntervalQuery = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeGroupByQueryIntervalQuery_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeGroupByQueryIntervalQuery failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.fetchResultsV2 = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_fetchResultsV2(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_fetchResultsV2(req); - } -}; - -IClientRPCServiceClient.prototype.send_fetchResultsV2 = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_fetchResultsV2_args(params); - try { - output.writeMessageBegin('fetchResultsV2', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_fetchResultsV2 = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_fetchResultsV2_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('fetchResultsV2 failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.openSession = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_openSession(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_openSession(req); - } -}; - -IClientRPCServiceClient.prototype.send_openSession = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_openSession_args(params); - try { - output.writeMessageBegin('openSession', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_openSession = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_openSession_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('openSession failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.closeSession = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_closeSession(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_closeSession(req); - } -}; - -IClientRPCServiceClient.prototype.send_closeSession = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_closeSession_args(params); - try { - output.writeMessageBegin('closeSession', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_closeSession = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_closeSession_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('closeSession failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeStatement = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeStatement(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeStatement(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeStatement = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeStatement_args(params); - try { - output.writeMessageBegin('executeStatement', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeStatement = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeStatement_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeStatement failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeBatchStatement = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeBatchStatement(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeBatchStatement(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeBatchStatement = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeBatchStatement_args(params); - try { - output.writeMessageBegin('executeBatchStatement', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeBatchStatement = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeBatchStatement_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeBatchStatement failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeQueryStatement = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeQueryStatement(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeQueryStatement(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeQueryStatement = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeQueryStatement_args(params); - try { - output.writeMessageBegin('executeQueryStatement', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeQueryStatement = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeQueryStatement_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeQueryStatement failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeUpdateStatement = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeUpdateStatement(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeUpdateStatement(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeUpdateStatement = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeUpdateStatement_args(params); - try { - output.writeMessageBegin('executeUpdateStatement', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeUpdateStatement = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeUpdateStatement_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeUpdateStatement failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.fetchResults = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_fetchResults(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_fetchResults(req); - } -}; - -IClientRPCServiceClient.prototype.send_fetchResults = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_fetchResults_args(params); - try { - output.writeMessageBegin('fetchResults', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_fetchResults = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_fetchResults_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('fetchResults failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.fetchMetadata = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_fetchMetadata(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_fetchMetadata(req); - } -}; - -IClientRPCServiceClient.prototype.send_fetchMetadata = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_fetchMetadata_args(params); - try { - output.writeMessageBegin('fetchMetadata', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_fetchMetadata = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_fetchMetadata_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('fetchMetadata failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.cancelOperation = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_cancelOperation(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_cancelOperation(req); - } -}; - -IClientRPCServiceClient.prototype.send_cancelOperation = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_cancelOperation_args(params); - try { - output.writeMessageBegin('cancelOperation', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_cancelOperation = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_cancelOperation_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('cancelOperation failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.closeOperation = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_closeOperation(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_closeOperation(req); - } -}; - -IClientRPCServiceClient.prototype.send_closeOperation = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_closeOperation_args(params); - try { - output.writeMessageBegin('closeOperation', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_closeOperation = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_closeOperation_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('closeOperation failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.getTimeZone = function(sessionId, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_getTimeZone(sessionId); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_getTimeZone(sessionId); - } -}; - -IClientRPCServiceClient.prototype.send_getTimeZone = function(sessionId) { - var output = new this.pClass(this.output); - var params = { - sessionId: sessionId - }; - var args = new IClientRPCService_getTimeZone_args(params); - try { - output.writeMessageBegin('getTimeZone', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_getTimeZone = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_getTimeZone_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('getTimeZone failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.setTimeZone = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_setTimeZone(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_setTimeZone(req); - } -}; - -IClientRPCServiceClient.prototype.send_setTimeZone = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_setTimeZone_args(params); - try { - output.writeMessageBegin('setTimeZone', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_setTimeZone = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_setTimeZone_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('setTimeZone failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.getProperties = function(callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_getProperties(); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_getProperties(); - } -}; - -IClientRPCServiceClient.prototype.send_getProperties = function() { - var output = new this.pClass(this.output); - var args = new IClientRPCService_getProperties_args(); - try { - output.writeMessageBegin('getProperties', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_getProperties = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_getProperties_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('getProperties failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.setStorageGroup = function(sessionId, storageGroup, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_setStorageGroup(sessionId, storageGroup); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_setStorageGroup(sessionId, storageGroup); - } -}; - -IClientRPCServiceClient.prototype.send_setStorageGroup = function(sessionId, storageGroup) { - var output = new this.pClass(this.output); - var params = { - sessionId: sessionId, - storageGroup: storageGroup - }; - var args = new IClientRPCService_setStorageGroup_args(params); - try { - output.writeMessageBegin('setStorageGroup', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_setStorageGroup = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_setStorageGroup_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('setStorageGroup failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.createTimeseries = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_createTimeseries(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_createTimeseries(req); - } -}; - -IClientRPCServiceClient.prototype.send_createTimeseries = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_createTimeseries_args(params); - try { - output.writeMessageBegin('createTimeseries', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_createTimeseries = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_createTimeseries_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('createTimeseries failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.createAlignedTimeseries = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_createAlignedTimeseries(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_createAlignedTimeseries(req); - } -}; - -IClientRPCServiceClient.prototype.send_createAlignedTimeseries = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_createAlignedTimeseries_args(params); - try { - output.writeMessageBegin('createAlignedTimeseries', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_createAlignedTimeseries = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_createAlignedTimeseries_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('createAlignedTimeseries failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.createMultiTimeseries = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_createMultiTimeseries(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_createMultiTimeseries(req); - } -}; - -IClientRPCServiceClient.prototype.send_createMultiTimeseries = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_createMultiTimeseries_args(params); - try { - output.writeMessageBegin('createMultiTimeseries', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_createMultiTimeseries = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_createMultiTimeseries_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('createMultiTimeseries failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.deleteTimeseries = function(sessionId, path, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_deleteTimeseries(sessionId, path); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_deleteTimeseries(sessionId, path); - } -}; - -IClientRPCServiceClient.prototype.send_deleteTimeseries = function(sessionId, path) { - var output = new this.pClass(this.output); - var params = { - sessionId: sessionId, - path: path - }; - var args = new IClientRPCService_deleteTimeseries_args(params); - try { - output.writeMessageBegin('deleteTimeseries', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_deleteTimeseries = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_deleteTimeseries_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('deleteTimeseries failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.deleteStorageGroups = function(sessionId, storageGroup, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_deleteStorageGroups(sessionId, storageGroup); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_deleteStorageGroups(sessionId, storageGroup); - } -}; - -IClientRPCServiceClient.prototype.send_deleteStorageGroups = function(sessionId, storageGroup) { - var output = new this.pClass(this.output); - var params = { - sessionId: sessionId, - storageGroup: storageGroup - }; - var args = new IClientRPCService_deleteStorageGroups_args(params); - try { - output.writeMessageBegin('deleteStorageGroups', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_deleteStorageGroups = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_deleteStorageGroups_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('deleteStorageGroups failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertRecord = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertRecord(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertRecord(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertRecord = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertRecord_args(params); - try { - output.writeMessageBegin('insertRecord', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertRecord = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertRecord_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertRecord failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertStringRecord = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertStringRecord(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertStringRecord(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertStringRecord = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertStringRecord_args(params); - try { - output.writeMessageBegin('insertStringRecord', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertStringRecord = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertStringRecord_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertStringRecord failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertTablet = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertTablet(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertTablet(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertTablet = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertTablet_args(params); - try { - output.writeMessageBegin('insertTablet', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertTablet = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertTablet_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertTablet failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertTablets = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertTablets(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertTablets(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertTablets = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertTablets_args(params); - try { - output.writeMessageBegin('insertTablets', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertTablets = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertTablets_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertTablets failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertRecords = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertRecords(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertRecords(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertRecords = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertRecords_args(params); - try { - output.writeMessageBegin('insertRecords', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertRecords = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertRecords_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertRecords failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertRecordsOfOneDevice = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertRecordsOfOneDevice(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertRecordsOfOneDevice(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertRecordsOfOneDevice = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertRecordsOfOneDevice_args(params); - try { - output.writeMessageBegin('insertRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertRecordsOfOneDevice = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertRecordsOfOneDevice_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertRecordsOfOneDevice failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertStringRecordsOfOneDevice = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertStringRecordsOfOneDevice(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertStringRecordsOfOneDevice(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertStringRecordsOfOneDevice = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertStringRecordsOfOneDevice_args(params); - try { - output.writeMessageBegin('insertStringRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertStringRecordsOfOneDevice = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertStringRecordsOfOneDevice_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertStringRecordsOfOneDevice failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.insertStringRecords = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_insertStringRecords(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_insertStringRecords(req); - } -}; - -IClientRPCServiceClient.prototype.send_insertStringRecords = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_insertStringRecords_args(params); - try { - output.writeMessageBegin('insertStringRecords', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_insertStringRecords = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_insertStringRecords_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('insertStringRecords failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertTablet = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertTablet(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertTablet(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertTablet = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertTablet_args(params); - try { - output.writeMessageBegin('testInsertTablet', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertTablet = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertTablet_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertTablet failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertTablets = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertTablets(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertTablets(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertTablets = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertTablets_args(params); - try { - output.writeMessageBegin('testInsertTablets', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertTablets = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertTablets_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertTablets failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertRecord = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertRecord(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertRecord(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertRecord = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertRecord_args(params); - try { - output.writeMessageBegin('testInsertRecord', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertRecord = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertRecord_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertRecord failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertStringRecord = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertStringRecord(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertStringRecord(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertStringRecord = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertStringRecord_args(params); - try { - output.writeMessageBegin('testInsertStringRecord', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertStringRecord = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertStringRecord_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertStringRecord failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertRecords = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertRecords(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertRecords(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertRecords = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertRecords_args(params); - try { - output.writeMessageBegin('testInsertRecords', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertRecords = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertRecords_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertRecords failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertRecordsOfOneDevice = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertRecordsOfOneDevice(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertRecordsOfOneDevice(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertRecordsOfOneDevice = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertRecordsOfOneDevice_args(params); - try { - output.writeMessageBegin('testInsertRecordsOfOneDevice', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertRecordsOfOneDevice = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertRecordsOfOneDevice_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertRecordsOfOneDevice failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testInsertStringRecords = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testInsertStringRecords(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testInsertStringRecords(req); - } -}; - -IClientRPCServiceClient.prototype.send_testInsertStringRecords = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_testInsertStringRecords_args(params); - try { - output.writeMessageBegin('testInsertStringRecords', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testInsertStringRecords = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testInsertStringRecords_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testInsertStringRecords failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.deleteData = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_deleteData(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_deleteData(req); - } -}; - -IClientRPCServiceClient.prototype.send_deleteData = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_deleteData_args(params); - try { - output.writeMessageBegin('deleteData', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_deleteData = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_deleteData_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('deleteData failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeRawDataQuery = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeRawDataQuery(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeRawDataQuery(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeRawDataQuery = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeRawDataQuery_args(params); - try { - output.writeMessageBegin('executeRawDataQuery', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeRawDataQuery = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeRawDataQuery_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeRawDataQuery failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeLastDataQuery = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeLastDataQuery(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeLastDataQuery(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeLastDataQuery = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeLastDataQuery_args(params); - try { - output.writeMessageBegin('executeLastDataQuery', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeLastDataQuery = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeLastDataQuery_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeLastDataQuery failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.executeAggregationQuery = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_executeAggregationQuery(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_executeAggregationQuery(req); - } -}; - -IClientRPCServiceClient.prototype.send_executeAggregationQuery = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_executeAggregationQuery_args(params); - try { - output.writeMessageBegin('executeAggregationQuery', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_executeAggregationQuery = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_executeAggregationQuery_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('executeAggregationQuery failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.requestStatementId = function(sessionId, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_requestStatementId(sessionId); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_requestStatementId(sessionId); - } -}; - -IClientRPCServiceClient.prototype.send_requestStatementId = function(sessionId) { - var output = new this.pClass(this.output); - var params = { - sessionId: sessionId - }; - var args = new IClientRPCService_requestStatementId_args(params); - try { - output.writeMessageBegin('requestStatementId', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_requestStatementId = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_requestStatementId_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('requestStatementId failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.createSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_createSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_createSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_createSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_createSchemaTemplate_args(params); - try { - output.writeMessageBegin('createSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_createSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_createSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('createSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.appendSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_appendSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_appendSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_appendSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_appendSchemaTemplate_args(params); - try { - output.writeMessageBegin('appendSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_appendSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_appendSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('appendSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.pruneSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_pruneSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_pruneSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_pruneSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_pruneSchemaTemplate_args(params); - try { - output.writeMessageBegin('pruneSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_pruneSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_pruneSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('pruneSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.querySchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_querySchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_querySchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_querySchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_querySchemaTemplate_args(params); - try { - output.writeMessageBegin('querySchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_querySchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_querySchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('querySchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.showConfigurationTemplate = function(callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_showConfigurationTemplate(); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_showConfigurationTemplate(); - } -}; - -IClientRPCServiceClient.prototype.send_showConfigurationTemplate = function() { - var output = new this.pClass(this.output); - var args = new IClientRPCService_showConfigurationTemplate_args(); - try { - output.writeMessageBegin('showConfigurationTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_showConfigurationTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_showConfigurationTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('showConfigurationTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.showConfiguration = function(nodeId, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_showConfiguration(nodeId); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_showConfiguration(nodeId); - } -}; - -IClientRPCServiceClient.prototype.send_showConfiguration = function(nodeId) { - var output = new this.pClass(this.output); - var params = { - nodeId: nodeId - }; - var args = new IClientRPCService_showConfiguration_args(params); - try { - output.writeMessageBegin('showConfiguration', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_showConfiguration = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_showConfiguration_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('showConfiguration failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.setSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_setSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_setSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_setSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_setSchemaTemplate_args(params); - try { - output.writeMessageBegin('setSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_setSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_setSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('setSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.unsetSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_unsetSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_unsetSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_unsetSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_unsetSchemaTemplate_args(params); - try { - output.writeMessageBegin('unsetSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_unsetSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_unsetSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('unsetSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.dropSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_dropSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_dropSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_dropSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_dropSchemaTemplate_args(params); - try { - output.writeMessageBegin('dropSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_dropSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_dropSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('dropSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.createTimeseriesUsingSchemaTemplate = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_createTimeseriesUsingSchemaTemplate(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_createTimeseriesUsingSchemaTemplate(req); - } -}; - -IClientRPCServiceClient.prototype.send_createTimeseriesUsingSchemaTemplate = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_createTimeseriesUsingSchemaTemplate_args(params); - try { - output.writeMessageBegin('createTimeseriesUsingSchemaTemplate', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_createTimeseriesUsingSchemaTemplate = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('createTimeseriesUsingSchemaTemplate failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.handshake = function(info, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_handshake(info); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_handshake(info); - } -}; - -IClientRPCServiceClient.prototype.send_handshake = function(info) { - var output = new this.pClass(this.output); - var params = { - info: info - }; - var args = new IClientRPCService_handshake_args(params); - try { - output.writeMessageBegin('handshake', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_handshake = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_handshake_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('handshake failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.sendPipeData = function(buff, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_sendPipeData(buff); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_sendPipeData(buff); - } -}; - -IClientRPCServiceClient.prototype.send_sendPipeData = function(buff) { - var output = new this.pClass(this.output); - var params = { - buff: buff - }; - var args = new IClientRPCService_sendPipeData_args(params); - try { - output.writeMessageBegin('sendPipeData', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_sendPipeData = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_sendPipeData_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('sendPipeData failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.sendFile = function(metaInfo, buff, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_sendFile(metaInfo, buff); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_sendFile(metaInfo, buff); - } -}; - -IClientRPCServiceClient.prototype.send_sendFile = function(metaInfo, buff) { - var output = new this.pClass(this.output); - var params = { - metaInfo: metaInfo, - buff: buff - }; - var args = new IClientRPCService_sendFile_args(params); - try { - output.writeMessageBegin('sendFile', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_sendFile = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_sendFile_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('sendFile failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.pipeTransfer = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_pipeTransfer(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_pipeTransfer(req); - } -}; - -IClientRPCServiceClient.prototype.send_pipeTransfer = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_pipeTransfer_args(params); - try { - output.writeMessageBegin('pipeTransfer', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_pipeTransfer = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_pipeTransfer_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('pipeTransfer failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.pipeSubscribe = function(req, callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_pipeSubscribe(req); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_pipeSubscribe(req); - } -}; - -IClientRPCServiceClient.prototype.send_pipeSubscribe = function(req) { - var output = new this.pClass(this.output); - var params = { - req: req - }; - var args = new IClientRPCService_pipeSubscribe_args(params); - try { - output.writeMessageBegin('pipeSubscribe', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_pipeSubscribe = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_pipeSubscribe_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('pipeSubscribe failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.getBackupConfiguration = function(callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_getBackupConfiguration(); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_getBackupConfiguration(); - } -}; - -IClientRPCServiceClient.prototype.send_getBackupConfiguration = function() { - var output = new this.pClass(this.output); - var args = new IClientRPCService_getBackupConfiguration_args(); - try { - output.writeMessageBegin('getBackupConfiguration', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_getBackupConfiguration = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_getBackupConfiguration_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('getBackupConfiguration failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.fetchAllConnectionsInfo = function(callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_fetchAllConnectionsInfo(); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_fetchAllConnectionsInfo(); - } -}; - -IClientRPCServiceClient.prototype.send_fetchAllConnectionsInfo = function() { - var output = new this.pClass(this.output); - var args = new IClientRPCService_fetchAllConnectionsInfo_args(); - try { - output.writeMessageBegin('fetchAllConnectionsInfo', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_fetchAllConnectionsInfo = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_fetchAllConnectionsInfo_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('fetchAllConnectionsInfo failed: unknown result'); -}; - -IClientRPCServiceClient.prototype.testConnectionEmptyRPC = function(callback) { - this._seqid = this.new_seqid(); - if (callback === undefined) { - var _defer = Q.defer(); - this._reqs[this.seqid()] = function(error, result) { - if (error) { - _defer.reject(error); - } else { - _defer.resolve(result); - } - }; - this.send_testConnectionEmptyRPC(); - return _defer.promise; - } else { - this._reqs[this.seqid()] = callback; - this.send_testConnectionEmptyRPC(); - } -}; - -IClientRPCServiceClient.prototype.send_testConnectionEmptyRPC = function() { - var output = new this.pClass(this.output); - var args = new IClientRPCService_testConnectionEmptyRPC_args(); - try { - output.writeMessageBegin('testConnectionEmptyRPC', Thrift.MessageType.CALL, this.seqid()); - args.write(output); - output.writeMessageEnd(); - return this.output.flush(); - } - catch (e) { - delete this._reqs[this.seqid()]; - if (typeof output.reset === 'function') { - output.reset(); - } - throw e; - } -}; - -IClientRPCServiceClient.prototype.recv_testConnectionEmptyRPC = function(input,mtype,rseqid) { - var callback = this._reqs[rseqid] || function() {}; - delete this._reqs[rseqid]; - if (mtype == Thrift.MessageType.EXCEPTION) { - var x = new Thrift.TApplicationException(); - x.read(input); - input.readMessageEnd(); - return callback(x); - } - var result = new IClientRPCService_testConnectionEmptyRPC_result(); - result.read(input); - input.readMessageEnd(); - - if (null !== result.success) { - return callback(null, result.success); - } - return callback('testConnectionEmptyRPC failed: unknown result'); -}; -var IClientRPCServiceProcessor = exports.Processor = function(handler) { - this._handler = handler; -}; -IClientRPCServiceProcessor.prototype.process = function(input, output) { - var r = input.readMessageBegin(); - if (this['process_' + r.fname]) { - return this['process_' + r.fname].call(this, r.rseqid, input, output); - } else { - input.skip(Thrift.Type.STRUCT); - input.readMessageEnd(); - var x = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, 'Unknown function ' + r.fname); - output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid); - x.write(output); - output.writeMessageEnd(); - output.flush(); - } -}; -IClientRPCServiceProcessor.prototype.process_executeQueryStatementV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeQueryStatementV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeQueryStatementV2.length === 1) { - Q.fcall(this._handler.executeQueryStatementV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeQueryStatementV2_result({success: result}); - output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeQueryStatementV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeQueryStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeQueryStatementV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeUpdateStatementV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeUpdateStatementV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeUpdateStatementV2.length === 1) { - Q.fcall(this._handler.executeUpdateStatementV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeUpdateStatementV2_result({success: result}); - output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeUpdateStatementV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeUpdateStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeUpdateStatementV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeStatementV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeStatementV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeStatementV2.length === 1) { - Q.fcall(this._handler.executeStatementV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeStatementV2_result({success: result}); - output.writeMessageBegin("executeStatementV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeStatementV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeStatementV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeStatementV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeStatementV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeStatementV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeRawDataQueryV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeRawDataQueryV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeRawDataQueryV2.length === 1) { - Q.fcall(this._handler.executeRawDataQueryV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeRawDataQueryV2_result({success: result}); - output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeRawDataQueryV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeRawDataQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeRawDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeLastDataQueryV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeLastDataQueryV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeLastDataQueryV2.length === 1) { - Q.fcall(this._handler.executeLastDataQueryV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeLastDataQueryV2_result({success: result}); - output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeLastDataQueryV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeLastDataQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeLastDataQueryV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeFastLastDataQueryForOneDeviceV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeFastLastDataQueryForOneDeviceV2.length === 1) { - Q.fcall(this._handler.executeFastLastDataQueryForOneDeviceV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result({success: result}); - output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeFastLastDataQueryForOneDeviceV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeFastLastDataQueryForOneDeviceV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeFastLastDataQueryForOneDeviceV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeAggregationQueryV2 = function(seqid, input, output) { - var args = new IClientRPCService_executeAggregationQueryV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeAggregationQueryV2.length === 1) { - Q.fcall(this._handler.executeAggregationQueryV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeAggregationQueryV2_result({success: result}); - output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeAggregationQueryV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeAggregationQueryV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeAggregationQueryV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeGroupByQueryIntervalQuery = function(seqid, input, output) { - var args = new IClientRPCService_executeGroupByQueryIntervalQuery_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeGroupByQueryIntervalQuery.length === 1) { - Q.fcall(this._handler.executeGroupByQueryIntervalQuery.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeGroupByQueryIntervalQuery_result({success: result}); - output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeGroupByQueryIntervalQuery(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeGroupByQueryIntervalQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeGroupByQueryIntervalQuery", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_fetchResultsV2 = function(seqid, input, output) { - var args = new IClientRPCService_fetchResultsV2_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.fetchResultsV2.length === 1) { - Q.fcall(this._handler.fetchResultsV2.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_fetchResultsV2_result({success: result}); - output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.fetchResultsV2(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_fetchResultsV2_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchResultsV2", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_openSession = function(seqid, input, output) { - var args = new IClientRPCService_openSession_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.openSession.length === 1) { - Q.fcall(this._handler.openSession.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_openSession_result({success: result}); - output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.openSession(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_openSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_closeSession = function(seqid, input, output) { - var args = new IClientRPCService_closeSession_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.closeSession.length === 1) { - Q.fcall(this._handler.closeSession.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_closeSession_result({success: result}); - output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.closeSession(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_closeSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeStatement = function(seqid, input, output) { - var args = new IClientRPCService_executeStatement_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeStatement.length === 1) { - Q.fcall(this._handler.executeStatement.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeStatement_result({success: result}); - output.writeMessageBegin("executeStatement", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeStatement", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeStatement(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeStatement", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeStatement", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeBatchStatement = function(seqid, input, output) { - var args = new IClientRPCService_executeBatchStatement_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeBatchStatement.length === 1) { - Q.fcall(this._handler.executeBatchStatement.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeBatchStatement_result({success: result}); - output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeBatchStatement(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeBatchStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeBatchStatement", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeQueryStatement = function(seqid, input, output) { - var args = new IClientRPCService_executeQueryStatement_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeQueryStatement.length === 1) { - Q.fcall(this._handler.executeQueryStatement.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeQueryStatement_result({success: result}); - output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeQueryStatement(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeQueryStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeUpdateStatement = function(seqid, input, output) { - var args = new IClientRPCService_executeUpdateStatement_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeUpdateStatement.length === 1) { - Q.fcall(this._handler.executeUpdateStatement.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeUpdateStatement_result({success: result}); - output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeUpdateStatement(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeUpdateStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeUpdateStatement", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_fetchResults = function(seqid, input, output) { - var args = new IClientRPCService_fetchResults_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.fetchResults.length === 1) { - Q.fcall(this._handler.fetchResults.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_fetchResults_result({success: result}); - output.writeMessageBegin("fetchResults", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchResults", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.fetchResults(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_fetchResults_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("fetchResults", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchResults", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_fetchMetadata = function(seqid, input, output) { - var args = new IClientRPCService_fetchMetadata_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.fetchMetadata.length === 1) { - Q.fcall(this._handler.fetchMetadata.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_fetchMetadata_result({success: result}); - output.writeMessageBegin("fetchMetadata", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchMetadata", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.fetchMetadata(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_fetchMetadata_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("fetchMetadata", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchMetadata", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_cancelOperation = function(seqid, input, output) { - var args = new IClientRPCService_cancelOperation_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.cancelOperation.length === 1) { - Q.fcall(this._handler.cancelOperation.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_cancelOperation_result({success: result}); - output.writeMessageBegin("cancelOperation", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("cancelOperation", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.cancelOperation(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_cancelOperation_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("cancelOperation", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("cancelOperation", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_closeOperation = function(seqid, input, output) { - var args = new IClientRPCService_closeOperation_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.closeOperation.length === 1) { - Q.fcall(this._handler.closeOperation.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_closeOperation_result({success: result}); - output.writeMessageBegin("closeOperation", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("closeOperation", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.closeOperation(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_closeOperation_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("closeOperation", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("closeOperation", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_getTimeZone = function(seqid, input, output) { - var args = new IClientRPCService_getTimeZone_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.getTimeZone.length === 1) { - Q.fcall(this._handler.getTimeZone.bind(this._handler), - args.sessionId - ).then(function(result) { - var result_obj = new IClientRPCService_getTimeZone_result({success: result}); - output.writeMessageBegin("getTimeZone", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getTimeZone", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.getTimeZone(args.sessionId, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_getTimeZone_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("getTimeZone", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getTimeZone", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_setTimeZone = function(seqid, input, output) { - var args = new IClientRPCService_setTimeZone_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.setTimeZone.length === 1) { - Q.fcall(this._handler.setTimeZone.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_setTimeZone_result({success: result}); - output.writeMessageBegin("setTimeZone", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setTimeZone", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.setTimeZone(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_setTimeZone_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("setTimeZone", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setTimeZone", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_getProperties = function(seqid, input, output) { - var args = new IClientRPCService_getProperties_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.getProperties.length === 0) { - Q.fcall(this._handler.getProperties.bind(this._handler) - ).then(function(result) { - var result_obj = new IClientRPCService_getProperties_result({success: result}); - output.writeMessageBegin("getProperties", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getProperties", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.getProperties(function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_getProperties_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("getProperties", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getProperties", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_setStorageGroup = function(seqid, input, output) { - var args = new IClientRPCService_setStorageGroup_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.setStorageGroup.length === 2) { - Q.fcall(this._handler.setStorageGroup.bind(this._handler), - args.sessionId, - args.storageGroup - ).then(function(result) { - var result_obj = new IClientRPCService_setStorageGroup_result({success: result}); - output.writeMessageBegin("setStorageGroup", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setStorageGroup", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.setStorageGroup(args.sessionId, args.storageGroup, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_setStorageGroup_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("setStorageGroup", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setStorageGroup", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_createTimeseries = function(seqid, input, output) { - var args = new IClientRPCService_createTimeseries_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.createTimeseries.length === 1) { - Q.fcall(this._handler.createTimeseries.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_createTimeseries_result({success: result}); - output.writeMessageBegin("createTimeseries", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createTimeseries", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.createTimeseries(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_createTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("createTimeseries", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createTimeseries", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_createAlignedTimeseries = function(seqid, input, output) { - var args = new IClientRPCService_createAlignedTimeseries_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.createAlignedTimeseries.length === 1) { - Q.fcall(this._handler.createAlignedTimeseries.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_createAlignedTimeseries_result({success: result}); - output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.createAlignedTimeseries(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_createAlignedTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createAlignedTimeseries", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_createMultiTimeseries = function(seqid, input, output) { - var args = new IClientRPCService_createMultiTimeseries_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.createMultiTimeseries.length === 1) { - Q.fcall(this._handler.createMultiTimeseries.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_createMultiTimeseries_result({success: result}); - output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.createMultiTimeseries(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_createMultiTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createMultiTimeseries", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_deleteTimeseries = function(seqid, input, output) { - var args = new IClientRPCService_deleteTimeseries_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.deleteTimeseries.length === 2) { - Q.fcall(this._handler.deleteTimeseries.bind(this._handler), - args.sessionId, - args.path - ).then(function(result) { - var result_obj = new IClientRPCService_deleteTimeseries_result({success: result}); - output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.deleteTimeseries(args.sessionId, args.path, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_deleteTimeseries_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteTimeseries", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_deleteStorageGroups = function(seqid, input, output) { - var args = new IClientRPCService_deleteStorageGroups_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.deleteStorageGroups.length === 2) { - Q.fcall(this._handler.deleteStorageGroups.bind(this._handler), - args.sessionId, - args.storageGroup - ).then(function(result) { - var result_obj = new IClientRPCService_deleteStorageGroups_result({success: result}); - output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.deleteStorageGroups(args.sessionId, args.storageGroup, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_deleteStorageGroups_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteStorageGroups", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertRecord = function(seqid, input, output) { - var args = new IClientRPCService_insertRecord_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertRecord.length === 1) { - Q.fcall(this._handler.insertRecord.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertRecord_result({success: result}); - output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertRecord(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertStringRecord = function(seqid, input, output) { - var args = new IClientRPCService_insertStringRecord_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertStringRecord.length === 1) { - Q.fcall(this._handler.insertStringRecord.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertStringRecord_result({success: result}); - output.writeMessageBegin("insertStringRecord", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecord", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertStringRecord(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertStringRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertStringRecord", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecord", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertTablet = function(seqid, input, output) { - var args = new IClientRPCService_insertTablet_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertTablet.length === 1) { - Q.fcall(this._handler.insertTablet.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertTablet_result({success: result}); - output.writeMessageBegin("insertTablet", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertTablet", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertTablet(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertTablet_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertTablet", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertTablet", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertTablets = function(seqid, input, output) { - var args = new IClientRPCService_insertTablets_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertTablets.length === 1) { - Q.fcall(this._handler.insertTablets.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertTablets_result({success: result}); - output.writeMessageBegin("insertTablets", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertTablets", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertTablets(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertTablets_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertTablets", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertTablets", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertRecords = function(seqid, input, output) { - var args = new IClientRPCService_insertRecords_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertRecords.length === 1) { - Q.fcall(this._handler.insertRecords.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertRecords_result({success: result}); - output.writeMessageBegin("insertRecords", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecords", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertRecords(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertRecords", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecords", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertRecordsOfOneDevice = function(seqid, input, output) { - var args = new IClientRPCService_insertRecordsOfOneDevice_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertRecordsOfOneDevice.length === 1) { - Q.fcall(this._handler.insertRecordsOfOneDevice.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertRecordsOfOneDevice_result({success: result}); - output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertRecordsOfOneDevice(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertStringRecordsOfOneDevice = function(seqid, input, output) { - var args = new IClientRPCService_insertStringRecordsOfOneDevice_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertStringRecordsOfOneDevice.length === 1) { - Q.fcall(this._handler.insertStringRecordsOfOneDevice.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertStringRecordsOfOneDevice_result({success: result}); - output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertStringRecordsOfOneDevice(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertStringRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_insertStringRecords = function(seqid, input, output) { - var args = new IClientRPCService_insertStringRecords_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.insertStringRecords.length === 1) { - Q.fcall(this._handler.insertStringRecords.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_insertStringRecords_result({success: result}); - output.writeMessageBegin("insertStringRecords", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecords", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.insertStringRecords(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_insertStringRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("insertStringRecords", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("insertStringRecords", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertTablet = function(seqid, input, output) { - var args = new IClientRPCService_testInsertTablet_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertTablet.length === 1) { - Q.fcall(this._handler.testInsertTablet.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertTablet_result({success: result}); - output.writeMessageBegin("testInsertTablet", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertTablet", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertTablet(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertTablet_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertTablet", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertTablet", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertTablets = function(seqid, input, output) { - var args = new IClientRPCService_testInsertTablets_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertTablets.length === 1) { - Q.fcall(this._handler.testInsertTablets.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertTablets_result({success: result}); - output.writeMessageBegin("testInsertTablets", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertTablets", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertTablets(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertTablets_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertTablets", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertTablets", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertRecord = function(seqid, input, output) { - var args = new IClientRPCService_testInsertRecord_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertRecord.length === 1) { - Q.fcall(this._handler.testInsertRecord.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertRecord_result({success: result}); - output.writeMessageBegin("testInsertRecord", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecord", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertRecord(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertRecord", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecord", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertStringRecord = function(seqid, input, output) { - var args = new IClientRPCService_testInsertStringRecord_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertStringRecord.length === 1) { - Q.fcall(this._handler.testInsertStringRecord.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertStringRecord_result({success: result}); - output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertStringRecord(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertStringRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertStringRecord", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertRecords = function(seqid, input, output) { - var args = new IClientRPCService_testInsertRecords_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertRecords.length === 1) { - Q.fcall(this._handler.testInsertRecords.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertRecords_result({success: result}); - output.writeMessageBegin("testInsertRecords", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecords", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertRecords(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertRecords", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecords", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertRecordsOfOneDevice = function(seqid, input, output) { - var args = new IClientRPCService_testInsertRecordsOfOneDevice_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertRecordsOfOneDevice.length === 1) { - Q.fcall(this._handler.testInsertRecordsOfOneDevice.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertRecordsOfOneDevice_result({success: result}); - output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertRecordsOfOneDevice(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertRecordsOfOneDevice_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertRecordsOfOneDevice", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_testInsertStringRecords = function(seqid, input, output) { - var args = new IClientRPCService_testInsertStringRecords_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.testInsertStringRecords.length === 1) { - Q.fcall(this._handler.testInsertStringRecords.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_testInsertStringRecords_result({success: result}); - output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.testInsertStringRecords(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testInsertStringRecords_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testInsertStringRecords", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_deleteData = function(seqid, input, output) { - var args = new IClientRPCService_deleteData_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.deleteData.length === 1) { - Q.fcall(this._handler.deleteData.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_deleteData_result({success: result}); - output.writeMessageBegin("deleteData", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteData", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.deleteData(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_deleteData_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("deleteData", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("deleteData", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeRawDataQuery = function(seqid, input, output) { - var args = new IClientRPCService_executeRawDataQuery_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeRawDataQuery.length === 1) { - Q.fcall(this._handler.executeRawDataQuery.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeRawDataQuery_result({success: result}); - output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeRawDataQuery(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeRawDataQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeRawDataQuery", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeLastDataQuery = function(seqid, input, output) { - var args = new IClientRPCService_executeLastDataQuery_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeLastDataQuery.length === 1) { - Q.fcall(this._handler.executeLastDataQuery.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeLastDataQuery_result({success: result}); - output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeLastDataQuery(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeLastDataQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeLastDataQuery", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_executeAggregationQuery = function(seqid, input, output) { - var args = new IClientRPCService_executeAggregationQuery_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.executeAggregationQuery.length === 1) { - Q.fcall(this._handler.executeAggregationQuery.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_executeAggregationQuery_result({success: result}); - output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.executeAggregationQuery(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_executeAggregationQuery_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("executeAggregationQuery", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_requestStatementId = function(seqid, input, output) { - var args = new IClientRPCService_requestStatementId_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.requestStatementId.length === 1) { - Q.fcall(this._handler.requestStatementId.bind(this._handler), - args.sessionId - ).then(function(result) { - var result_obj = new IClientRPCService_requestStatementId_result({success: result}); - output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.requestStatementId(args.sessionId, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_requestStatementId_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_createSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_createSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.createSchemaTemplate.length === 1) { - Q.fcall(this._handler.createSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_createSchemaTemplate_result({success: result}); - output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.createSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_createSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_appendSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_appendSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.appendSchemaTemplate.length === 1) { - Q.fcall(this._handler.appendSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_appendSchemaTemplate_result({success: result}); - output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.appendSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_appendSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("appendSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_pruneSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_pruneSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.pruneSchemaTemplate.length === 1) { - Q.fcall(this._handler.pruneSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_pruneSchemaTemplate_result({success: result}); - output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.pruneSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_pruneSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pruneSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_querySchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_querySchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.querySchemaTemplate.length === 1) { - Q.fcall(this._handler.querySchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_querySchemaTemplate_result({success: result}); - output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.querySchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_querySchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("querySchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_showConfigurationTemplate = function(seqid, input, output) { - var args = new IClientRPCService_showConfigurationTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.showConfigurationTemplate.length === 0) { - Q.fcall(this._handler.showConfigurationTemplate.bind(this._handler) - ).then(function(result) { - var result_obj = new IClientRPCService_showConfigurationTemplate_result({success: result}); - output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.showConfigurationTemplate(function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_showConfigurationTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("showConfigurationTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_showConfiguration = function(seqid, input, output) { - var args = new IClientRPCService_showConfiguration_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.showConfiguration.length === 1) { - Q.fcall(this._handler.showConfiguration.bind(this._handler), - args.nodeId - ).then(function(result) { - var result_obj = new IClientRPCService_showConfiguration_result({success: result}); - output.writeMessageBegin("showConfiguration", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("showConfiguration", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.showConfiguration(args.nodeId, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_showConfiguration_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("showConfiguration", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("showConfiguration", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_setSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_setSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.setSchemaTemplate.length === 1) { - Q.fcall(this._handler.setSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_setSchemaTemplate_result({success: result}); - output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.setSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_setSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("setSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } -}; -IClientRPCServiceProcessor.prototype.process_unsetSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_unsetSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.unsetSchemaTemplate.length === 1) { - Q.fcall(this._handler.unsetSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_unsetSchemaTemplate_result({success: result}); - output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.unsetSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_unsetSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.REPLY, seqid); +IClientRPCServiceClient.prototype.requestStatementId = function(sessionId, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("unsetSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); + _defer.resolve(result); } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + }; + this.send_requestStatementId(sessionId); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_requestStatementId(sessionId); } }; -IClientRPCServiceProcessor.prototype.process_dropSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_dropSchemaTemplate_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.dropSchemaTemplate.length === 1) { - Q.fcall(this._handler.dropSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_dropSchemaTemplate_result({success: result}); - output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.dropSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_dropSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("dropSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + +IClientRPCServiceClient.prototype.send_requestStatementId = function(sessionId) { + var output = new this.pClass(this.output); + var params = { + sessionId: sessionId + }; + var args = new IClientRPCService_requestStatementId_args(params); + try { + output.writeMessageBegin('requestStatementId', Thrift.MessageType.CALL, this.seqid()); + args[Symbol.for("write")](output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; } }; -IClientRPCServiceProcessor.prototype.process_createTimeseriesUsingSchemaTemplate = function(seqid, input, output) { - var args = new IClientRPCService_createTimeseriesUsingSchemaTemplate_args(); - args.read(input); + +IClientRPCServiceClient.prototype.recv_requestStatementId = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x[Symbol.for("read")](input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_requestStatementId_result(); + result[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.createTimeseriesUsingSchemaTemplate.length === 1) { - Q.fcall(this._handler.createTimeseriesUsingSchemaTemplate.bind(this._handler), - args.req - ).then(function(result) { - var result_obj = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result({success: result}); - output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.createTimeseriesUsingSchemaTemplate(args.req, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_createTimeseriesUsingSchemaTemplate_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("createTimeseriesUsingSchemaTemplate", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + + if (null !== result.success) { + return callback(null, result.success); } + return callback('requestStatementId failed: unknown result'); }; -IClientRPCServiceProcessor.prototype.process_handshake = function(seqid, input, output) { - var args = new IClientRPCService_handshake_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.handshake.length === 1) { - Q.fcall(this._handler.handshake.bind(this._handler), - args.info - ).then(function(result) { - var result_obj = new IClientRPCService_handshake_result({success: result}); - output.writeMessageBegin("handshake", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("handshake", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.handshake(args.info, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_handshake_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("handshake", Thrift.MessageType.REPLY, seqid); + +IClientRPCServiceClient.prototype.insertRecord = function(req, callback) { + this._seqid = this.new_seqid(); + if (callback === undefined) { + var _defer = Q.defer(); + this._reqs[this.seqid()] = function(error, result) { + if (error) { + _defer.reject(error); } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("handshake", Thrift.MessageType.EXCEPTION, seqid); + _defer.resolve(result); } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + }; + this.send_insertRecord(req); + return _defer.promise; + } else { + this._reqs[this.seqid()] = callback; + this.send_insertRecord(req); } }; -IClientRPCServiceProcessor.prototype.process_sendPipeData = function(seqid, input, output) { - var args = new IClientRPCService_sendPipeData_args(); - args.read(input); - input.readMessageEnd(); - if (this._handler.sendPipeData.length === 1) { - Q.fcall(this._handler.sendPipeData.bind(this._handler), - args.buff - ).then(function(result) { - var result_obj = new IClientRPCService_sendPipeData_result({success: result}); - output.writeMessageBegin("sendPipeData", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("sendPipeData", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); - } else { - this._handler.sendPipeData(args.buff, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_sendPipeData_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("sendPipeData", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("sendPipeData", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + +IClientRPCServiceClient.prototype.send_insertRecord = function(req) { + var output = new this.pClass(this.output); + var params = { + req: req + }; + var args = new IClientRPCService_insertRecord_args(params); + try { + output.writeMessageBegin('insertRecord', Thrift.MessageType.CALL, this.seqid()); + args[Symbol.for("write")](output); + output.writeMessageEnd(); + return this.output.flush(); + } + catch (e) { + delete this._reqs[this.seqid()]; + if (typeof output.reset === 'function') { + output.reset(); + } + throw e; } }; -IClientRPCServiceProcessor.prototype.process_sendFile = function(seqid, input, output) { - var args = new IClientRPCService_sendFile_args(); - args.read(input); + +IClientRPCServiceClient.prototype.recv_insertRecord = function(input,mtype,rseqid) { + var callback = this._reqs[rseqid] || function() {}; + delete this._reqs[rseqid]; + if (mtype == Thrift.MessageType.EXCEPTION) { + var x = new Thrift.TApplicationException(); + x[Symbol.for("read")](input); + input.readMessageEnd(); + return callback(x); + } + var result = new IClientRPCService_insertRecord_result(); + result[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.sendFile.length === 2) { - Q.fcall(this._handler.sendFile.bind(this._handler), - args.metaInfo, - args.buff - ).then(function(result) { - var result_obj = new IClientRPCService_sendFile_result({success: result}); - output.writeMessageBegin("sendFile", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }).catch(function (err) { - var result; - result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("sendFile", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); - output.writeMessageEnd(); - output.flush(); - }); + + if (null !== result.success) { + return callback(null, result.success); + } + return callback('insertRecord failed: unknown result'); +}; +var IClientRPCServiceProcessor = exports.Processor = function(handler) { + this._handler = handler; +}; +IClientRPCServiceProcessor.prototype.process = function(input, output) { + var r = input.readMessageBegin(); + if (this['process_' + r.fname]) { + return this['process_' + r.fname].call(this, r.rseqid, input, output); } else { - this._handler.sendFile(args.metaInfo, args.buff, function (err, result) { - var result_obj; - if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_sendFile_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("sendFile", Thrift.MessageType.REPLY, seqid); - } else { - result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("sendFile", Thrift.MessageType.EXCEPTION, seqid); - } - result_obj.write(output); - output.writeMessageEnd(); - output.flush(); - }); + input.skip(Thrift.Type.STRUCT); + input.readMessageEnd(); + var x = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN_METHOD, 'Unknown function ' + r.fname); + output.writeMessageBegin(r.fname, Thrift.MessageType.EXCEPTION, r.rseqid); + x[Symbol.for("write")](output); + output.writeMessageEnd(); + output.flush(); } }; -IClientRPCServiceProcessor.prototype.process_pipeTransfer = function(seqid, input, output) { - var args = new IClientRPCService_pipeTransfer_args(); - args.read(input); +IClientRPCServiceProcessor.prototype.process_openSession = function(seqid, input, output) { + var args = new IClientRPCService_openSession_args(); + args[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.pipeTransfer.length === 1) { - Q.fcall(this._handler.pipeTransfer.bind(this._handler), + if (this._handler.openSession.length === 1) { + Q.fcall(this._handler.openSession.bind(this._handler), args.req ).then(function(result) { - var result_obj = new IClientRPCService_pipeTransfer_result({success: result}); - output.writeMessageBegin("pipeTransfer", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); + var result_obj = new IClientRPCService_openSession_result({success: result}); + output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }).catch(function (err) { var result; result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pipeTransfer", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); + output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); + result[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } else { - this._handler.pipeTransfer(args.req, function (err, result) { + this._handler.openSession(args.req, function (err, result) { var result_obj; if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_pipeTransfer_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("pipeTransfer", Thrift.MessageType.REPLY, seqid); + result_obj = new IClientRPCService_openSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("openSession", Thrift.MessageType.REPLY, seqid); } else { result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pipeTransfer", Thrift.MessageType.EXCEPTION, seqid); + output.writeMessageBegin("openSession", Thrift.MessageType.EXCEPTION, seqid); } - result_obj.write(output); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } }; -IClientRPCServiceProcessor.prototype.process_pipeSubscribe = function(seqid, input, output) { - var args = new IClientRPCService_pipeSubscribe_args(); - args.read(input); +IClientRPCServiceProcessor.prototype.process_closeSession = function(seqid, input, output) { + var args = new IClientRPCService_closeSession_args(); + args[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.pipeSubscribe.length === 1) { - Q.fcall(this._handler.pipeSubscribe.bind(this._handler), + if (this._handler.closeSession.length === 1) { + Q.fcall(this._handler.closeSession.bind(this._handler), args.req ).then(function(result) { - var result_obj = new IClientRPCService_pipeSubscribe_result({success: result}); - output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); + var result_obj = new IClientRPCService_closeSession_result({success: result}); + output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }).catch(function (err) { var result; result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); + output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); + result[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } else { - this._handler.pipeSubscribe(args.req, function (err, result) { + this._handler.closeSession(args.req, function (err, result) { var result_obj; if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_pipeSubscribe_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.REPLY, seqid); + result_obj = new IClientRPCService_closeSession_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("closeSession", Thrift.MessageType.REPLY, seqid); } else { result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("pipeSubscribe", Thrift.MessageType.EXCEPTION, seqid); + output.writeMessageBegin("closeSession", Thrift.MessageType.EXCEPTION, seqid); } - result_obj.write(output); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } }; -IClientRPCServiceProcessor.prototype.process_getBackupConfiguration = function(seqid, input, output) { - var args = new IClientRPCService_getBackupConfiguration_args(); - args.read(input); +IClientRPCServiceProcessor.prototype.process_executeQueryStatement = function(seqid, input, output) { + var args = new IClientRPCService_executeQueryStatement_args(); + args[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.getBackupConfiguration.length === 0) { - Q.fcall(this._handler.getBackupConfiguration.bind(this._handler) + if (this._handler.executeQueryStatement.length === 1) { + Q.fcall(this._handler.executeQueryStatement.bind(this._handler), + args.req ).then(function(result) { - var result_obj = new IClientRPCService_getBackupConfiguration_result({success: result}); - output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); + var result_obj = new IClientRPCService_executeQueryStatement_result({success: result}); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }).catch(function (err) { var result; result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); + result[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } else { - this._handler.getBackupConfiguration(function (err, result) { + this._handler.executeQueryStatement(args.req, function (err, result) { var result_obj; if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_getBackupConfiguration_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.REPLY, seqid); + result_obj = new IClientRPCService_executeQueryStatement_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.REPLY, seqid); } else { result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("getBackupConfiguration", Thrift.MessageType.EXCEPTION, seqid); + output.writeMessageBegin("executeQueryStatement", Thrift.MessageType.EXCEPTION, seqid); } - result_obj.write(output); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } }; -IClientRPCServiceProcessor.prototype.process_fetchAllConnectionsInfo = function(seqid, input, output) { - var args = new IClientRPCService_fetchAllConnectionsInfo_args(); - args.read(input); +IClientRPCServiceProcessor.prototype.process_requestStatementId = function(seqid, input, output) { + var args = new IClientRPCService_requestStatementId_args(); + args[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.fetchAllConnectionsInfo.length === 0) { - Q.fcall(this._handler.fetchAllConnectionsInfo.bind(this._handler) + if (this._handler.requestStatementId.length === 1) { + Q.fcall(this._handler.requestStatementId.bind(this._handler), + args.sessionId ).then(function(result) { - var result_obj = new IClientRPCService_fetchAllConnectionsInfo_result({success: result}); - output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); + var result_obj = new IClientRPCService_requestStatementId_result({success: result}); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }).catch(function (err) { var result; result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); + result[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } else { - this._handler.fetchAllConnectionsInfo(function (err, result) { + this._handler.requestStatementId(args.sessionId, function (err, result) { var result_obj; if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_fetchAllConnectionsInfo_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.REPLY, seqid); + result_obj = new IClientRPCService_requestStatementId_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.REPLY, seqid); } else { result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("fetchAllConnectionsInfo", Thrift.MessageType.EXCEPTION, seqid); + output.writeMessageBegin("requestStatementId", Thrift.MessageType.EXCEPTION, seqid); } - result_obj.write(output); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } }; -IClientRPCServiceProcessor.prototype.process_testConnectionEmptyRPC = function(seqid, input, output) { - var args = new IClientRPCService_testConnectionEmptyRPC_args(); - args.read(input); +IClientRPCServiceProcessor.prototype.process_insertRecord = function(seqid, input, output) { + var args = new IClientRPCService_insertRecord_args(); + args[Symbol.for("read")](input); input.readMessageEnd(); - if (this._handler.testConnectionEmptyRPC.length === 0) { - Q.fcall(this._handler.testConnectionEmptyRPC.bind(this._handler) + if (this._handler.insertRecord.length === 1) { + Q.fcall(this._handler.insertRecord.bind(this._handler), + args.req ).then(function(result) { - var result_obj = new IClientRPCService_testConnectionEmptyRPC_result({success: result}); - output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.REPLY, seqid); - result_obj.write(output); + var result_obj = new IClientRPCService_insertRecord_result({success: result}); + output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }).catch(function (err) { var result; result = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.EXCEPTION, seqid); - result.write(output); + output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); + result[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); } else { - this._handler.testConnectionEmptyRPC(function (err, result) { + this._handler.insertRecord(args.req, function (err, result) { var result_obj; if ((err === null || typeof err === 'undefined')) { - result_obj = new IClientRPCService_testConnectionEmptyRPC_result((err !== null || typeof err === 'undefined') ? err : {success: result}); - output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.REPLY, seqid); + result_obj = new IClientRPCService_insertRecord_result((err !== null || typeof err === 'undefined') ? err : {success: result}); + output.writeMessageBegin("insertRecord", Thrift.MessageType.REPLY, seqid); } else { result_obj = new Thrift.TApplicationException(Thrift.TApplicationExceptionType.UNKNOWN, err.message); - output.writeMessageBegin("testConnectionEmptyRPC", Thrift.MessageType.EXCEPTION, seqid); + output.writeMessageBegin("insertRecord", Thrift.MessageType.EXCEPTION, seqid); } - result_obj.write(output); + result_obj[Symbol.for("write")](output); output.writeMessageEnd(); output.flush(); }); diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.thrift b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.thrift new file mode 100644 index 0000000..aa087f5 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService.thrift @@ -0,0 +1,65 @@ +namespace js IClientRPCService +namespace java IClientRPCService + +enum TSProtocolVersion { + IOTDB_SERVICE_PROTOCOL_V1 = 1, + IOTDB_SERVICE_PROTOCOL_V2 = 2, + IOTDB_SERVICE_PROTOCOL_V3 = 3 +} + +struct TSOpenSessionReq { + 1: optional string username + 2: optional string password + 3: optional i32 client_protocol + 4: optional string zoneId + 5: optional map configuration +} + +struct TSCloseSessionReq { + 1: required i64 sessionId +} + +struct TSExecuteStatementReq { + 1: required i64 sessionId + 2: required string statement + 3: required i64 statementId + 4: required i32 fetchSize + 5: optional i32 timeout +} + +struct TSInsertRecordReq { + 1: required i64 sessionId + 2: required string prefixPath + 3: required list measurements + 4: required binary values + 5: required i64 timestamp + 6: optional bool isAligned +} + +struct TSOpenSessionResp { + 1: required i64 sessionId + 2: required i32 serverProtocolVersion +} + +struct TSExecuteStatementResp { + 1: optional list columns + 2: optional list dataTypeList + 3: optional map columnNameIndexMap + 4: optional i64 queryId + 5: optional QueryDataSet queryDataSet + 6: optional bool ignoreTimeStamp +} + +struct QueryDataSet { + 1: required list valueList + 2: required list bitmapList + 3: required binary time +} + +service IClientRPCService { + TSOpenSessionResp openSession(1: TSOpenSessionReq req) + void closeSession(1: TSCloseSessionReq req) + TSExecuteStatementResp executeQueryStatement(1: TSExecuteStatementReq req) + i64 requestStatementId(1: i64 sessionId) + i32 insertRecord(1: TSInsertRecordReq req) +} diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.d.ts b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.d.ts new file mode 100644 index 0000000..4cb465b --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.d.ts @@ -0,0 +1,110 @@ +interface Int64 { + constructor(o?: number | string): this; + toString(): string; + toJson(): string; +} + +export enum TSProtocolVersion { + IOTDB_SERVICE_PROTOCOL_V1 = 1, + IOTDB_SERVICE_PROTOCOL_V2 = 2, + IOTDB_SERVICE_PROTOCOL_V3 = 3, +} + +export class TSOpenSessionReq { + username?: string; + password?: string; + client_protocol?: number; + zoneId?: string; + configuration?: Map; + + constructor(arg?: { + username?: string; + password?: string; + client_protocol?: number; + zoneId?: string; + configuration?: Map; + }) +} + +export class TSCloseSessionReq { + sessionId: Int64; + + constructor(arg?: { + sessionId: Int64; + }) +} + +export class TSExecuteStatementReq { + sessionId: Int64; + statement: string; + statementId: Int64; + fetchSize: number; + timeout?: number; + + constructor(arg?: { + sessionId: Int64; + statement: string; + statementId: Int64; + fetchSize: number; + timeout?: number; + }) +} + +export class TSInsertRecordReq { + sessionId: Int64; + prefixPath: string; + measurements: string[]; + values: Buffer; + timestamp: Int64; + isAligned?: boolean; + + constructor(arg?: { + sessionId: Int64; + prefixPath: string; + measurements: string[]; + values: Buffer; + timestamp: Int64; + isAligned?: boolean; + }) +} + +export class TSOpenSessionResp { + sessionId: Int64; + serverProtocolVersion: number; + + constructor(arg?: { + sessionId: Int64; + serverProtocolVersion: number; + }) +} + +export class TSExecuteStatementResp { + columns?: string[]; + dataTypeList?: number[]; + columnNameIndexMap?: Map; + queryId?: Int64; + queryDataSet?: QueryDataSet; + ignoreTimeStamp?: boolean; + + constructor(arg?: { + columns?: string[]; + dataTypeList?: number[]; + columnNameIndexMap?: Map; + queryId?: Int64; + queryDataSet?: QueryDataSet; + ignoreTimeStamp?: boolean; + }) +} + +export class QueryDataSet { + valueList: Buffer[]; + bitmapList: Buffer[]; + time: Buffer; + + constructor(arg?: { + valueList: Buffer[]; + bitmapList: Buffer[]; + time: Buffer; + }) +} + diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.js new file mode 100644 index 0000000..1e491d3 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/IClientRPCService_types.js @@ -0,0 +1,829 @@ +// +// Autogenerated by Thrift Compiler (0.22.0) +// +// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +// +"use strict"; + +var thrift = require('thrift'); +var Thrift = thrift.Thrift; +var Q = thrift.Q; +var Int64 = require('node-int64'); + + +var ttypes = module.exports = {}; +ttypes.TSProtocolVersion = { + 'IOTDB_SERVICE_PROTOCOL_V1' : 1, + 'IOTDB_SERVICE_PROTOCOL_V2' : 2, + 'IOTDB_SERVICE_PROTOCOL_V3' : 3 +}; +var TSOpenSessionReq = module.exports.TSOpenSessionReq = function(args) { + this.username = null; + this.password = null; + this.client_protocol = null; + this.zoneId = null; + this.configuration = null; + if (args) { + if (args.username !== undefined && args.username !== null) { + this.username = args.username; + } + if (args.password !== undefined && args.password !== null) { + this.password = args.password; + } + if (args.client_protocol !== undefined && args.client_protocol !== null) { + this.client_protocol = args.client_protocol; + } + if (args.zoneId !== undefined && args.zoneId !== null) { + this.zoneId = args.zoneId; + } + if (args.configuration !== undefined && args.configuration !== null) { + this.configuration = Thrift.copyMap(args.configuration, [null]); + } + } +}; +TSOpenSessionReq.prototype = {}; +TSOpenSessionReq.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.STRING) { + this.username = input.readString(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.password = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I32) { + this.client_protocol = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.zoneId = input.readString(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.MAP) { + this.configuration = {}; + var _rtmp31 = input.readMapBegin(); + var _size0 = _rtmp31.size || 0; + for (var _i2 = 0; _i2 < _size0; ++_i2) { + var key3 = null; + var val4 = null; + key3 = input.readString(); + val4 = input.readString(); + this.configuration[key3] = val4; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSOpenSessionReq.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSOpenSessionReq'); + if (this.username !== null && this.username !== undefined) { + output.writeFieldBegin('username', Thrift.Type.STRING, 1); + output.writeString(this.username); + output.writeFieldEnd(); + } + if (this.password !== null && this.password !== undefined) { + output.writeFieldBegin('password', Thrift.Type.STRING, 2); + output.writeString(this.password); + output.writeFieldEnd(); + } + if (this.client_protocol !== null && this.client_protocol !== undefined) { + output.writeFieldBegin('client_protocol', Thrift.Type.I32, 3); + output.writeI32(this.client_protocol); + output.writeFieldEnd(); + } + if (this.zoneId !== null && this.zoneId !== undefined) { + output.writeFieldBegin('zoneId', Thrift.Type.STRING, 4); + output.writeString(this.zoneId); + output.writeFieldEnd(); + } + if (this.configuration !== null && this.configuration !== undefined) { + output.writeFieldBegin('configuration', Thrift.Type.MAP, 5); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configuration)); + for (var kiter5 in this.configuration) { + if (this.configuration.hasOwnProperty(kiter5)) { + var viter6 = this.configuration[kiter5]; + output.writeString(kiter5); + output.writeString(viter6); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSCloseSessionReq = module.exports.TSCloseSessionReq = function(args) { + this.sessionId = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + } +}; +TSCloseSessionReq.prototype = {}; +TSCloseSessionReq.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 0: + input.skip(ftype); + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSCloseSessionReq.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSCloseSessionReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSExecuteStatementReq = module.exports.TSExecuteStatementReq = function(args) { + this.sessionId = null; + this.statement = null; + this.statementId = null; + this.fetchSize = null; + this.timeout = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.statement !== undefined && args.statement !== null) { + this.statement = args.statement; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statement is unset!'); + } + if (args.statementId !== undefined && args.statementId !== null) { + this.statementId = args.statementId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); + } + if (args.fetchSize !== undefined && args.fetchSize !== null) { + this.fetchSize = args.fetchSize; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fetchSize is unset!'); + } + if (args.timeout !== undefined && args.timeout !== null) { + this.timeout = args.timeout; + } + } +}; +TSExecuteStatementReq.prototype = {}; +TSExecuteStatementReq.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.statement = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.I64) { + this.statementId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I32) { + this.fetchSize = input.readI32(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I32) { + this.timeout = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSExecuteStatementReq.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSExecuteStatementReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.statement !== null && this.statement !== undefined) { + output.writeFieldBegin('statement', Thrift.Type.STRING, 2); + output.writeString(this.statement); + output.writeFieldEnd(); + } + if (this.statementId !== null && this.statementId !== undefined) { + output.writeFieldBegin('statementId', Thrift.Type.I64, 3); + output.writeI64(this.statementId); + output.writeFieldEnd(); + } + if (this.fetchSize !== null && this.fetchSize !== undefined) { + output.writeFieldBegin('fetchSize', Thrift.Type.I32, 4); + output.writeI32(this.fetchSize); + output.writeFieldEnd(); + } + if (this.timeout !== null && this.timeout !== undefined) { + output.writeFieldBegin('timeout', Thrift.Type.I32, 5); + output.writeI32(this.timeout); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSInsertRecordReq = module.exports.TSInsertRecordReq = function(args) { + this.sessionId = null; + this.prefixPath = null; + this.measurements = null; + this.values = null; + this.timestamp = null; + this.isAligned = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.prefixPath !== undefined && args.prefixPath !== null) { + this.prefixPath = args.prefixPath; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); + } + if (args.measurements !== undefined && args.measurements !== null) { + this.measurements = Thrift.copyList(args.measurements, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); + } + if (args.values !== undefined && args.values !== null) { + this.values = args.values; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); + } + if (args.timestamp !== undefined && args.timestamp !== null) { + this.timestamp = args.timestamp; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamp is unset!'); + } + if (args.isAligned !== undefined && args.isAligned !== null) { + this.isAligned = args.isAligned; + } + } +}; +TSInsertRecordReq.prototype = {}; +TSInsertRecordReq.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.STRING) { + this.prefixPath = input.readString(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.LIST) { + this.measurements = []; + var _rtmp38 = input.readListBegin(); + var _size7 = _rtmp38.size || 0; + for (var _i9 = 0; _i9 < _size7; ++_i9) { + var elem10 = null; + elem10 = input.readString(); + this.measurements.push(elem10); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.STRING) { + this.values = input.readBinary(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.I64) { + this.timestamp = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.isAligned = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSInsertRecordReq.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSInsertRecordReq'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.prefixPath !== null && this.prefixPath !== undefined) { + output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); + output.writeString(this.prefixPath); + output.writeFieldEnd(); + } + if (this.measurements !== null && this.measurements !== undefined) { + output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); + output.writeListBegin(Thrift.Type.STRING, this.measurements.length); + for (var iter11 in this.measurements) { + if (this.measurements.hasOwnProperty(iter11)) { + iter11 = this.measurements[iter11]; + output.writeString(iter11); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.values !== null && this.values !== undefined) { + output.writeFieldBegin('values', Thrift.Type.STRING, 4); + output.writeBinary(this.values); + output.writeFieldEnd(); + } + if (this.timestamp !== null && this.timestamp !== undefined) { + output.writeFieldBegin('timestamp', Thrift.Type.I64, 5); + output.writeI64(this.timestamp); + output.writeFieldEnd(); + } + if (this.isAligned !== null && this.isAligned !== undefined) { + output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); + output.writeBool(this.isAligned); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSOpenSessionResp = module.exports.TSOpenSessionResp = function(args) { + this.sessionId = null; + this.serverProtocolVersion = null; + if (args) { + if (args.sessionId !== undefined && args.sessionId !== null) { + this.sessionId = args.sessionId; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); + } + if (args.serverProtocolVersion !== undefined && args.serverProtocolVersion !== null) { + this.serverProtocolVersion = args.serverProtocolVersion; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serverProtocolVersion is unset!'); + } + } +}; +TSOpenSessionResp.prototype = {}; +TSOpenSessionResp.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.I64) { + this.sessionId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.I32) { + this.serverProtocolVersion = input.readI32(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSOpenSessionResp.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSOpenSessionResp'); + if (this.sessionId !== null && this.sessionId !== undefined) { + output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); + output.writeI64(this.sessionId); + output.writeFieldEnd(); + } + if (this.serverProtocolVersion !== null && this.serverProtocolVersion !== undefined) { + output.writeFieldBegin('serverProtocolVersion', Thrift.Type.I32, 2); + output.writeI32(this.serverProtocolVersion); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var TSExecuteStatementResp = module.exports.TSExecuteStatementResp = function(args) { + this.columns = null; + this.dataTypeList = null; + this.columnNameIndexMap = null; + this.queryId = null; + this.queryDataSet = null; + this.ignoreTimeStamp = null; + if (args) { + if (args.columns !== undefined && args.columns !== null) { + this.columns = Thrift.copyList(args.columns, [null]); + } + if (args.dataTypeList !== undefined && args.dataTypeList !== null) { + this.dataTypeList = Thrift.copyList(args.dataTypeList, [null]); + } + if (args.columnNameIndexMap !== undefined && args.columnNameIndexMap !== null) { + this.columnNameIndexMap = Thrift.copyMap(args.columnNameIndexMap, [null]); + } + if (args.queryId !== undefined && args.queryId !== null) { + this.queryId = args.queryId; + } + if (args.queryDataSet !== undefined && args.queryDataSet !== null) { + this.queryDataSet = new ttypes.QueryDataSet(args.queryDataSet); + } + if (args.ignoreTimeStamp !== undefined && args.ignoreTimeStamp !== null) { + this.ignoreTimeStamp = args.ignoreTimeStamp; + } + } +}; +TSExecuteStatementResp.prototype = {}; +TSExecuteStatementResp.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.columns = []; + var _rtmp313 = input.readListBegin(); + var _size12 = _rtmp313.size || 0; + for (var _i14 = 0; _i14 < _size12; ++_i14) { + var elem15 = null; + elem15 = input.readString(); + this.columns.push(elem15); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.dataTypeList = []; + var _rtmp317 = input.readListBegin(); + var _size16 = _rtmp317.size || 0; + for (var _i18 = 0; _i18 < _size16; ++_i18) { + var elem19 = null; + elem19 = input.readI32(); + this.dataTypeList.push(elem19); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.MAP) { + this.columnNameIndexMap = {}; + var _rtmp321 = input.readMapBegin(); + var _size20 = _rtmp321.size || 0; + for (var _i22 = 0; _i22 < _size20; ++_i22) { + var key23 = null; + var val24 = null; + key23 = input.readString(); + val24 = input.readI32(); + this.columnNameIndexMap[key23] = val24; + } + input.readMapEnd(); + } else { + input.skip(ftype); + } + break; + case 4: + if (ftype == Thrift.Type.I64) { + this.queryId = input.readI64(); + } else { + input.skip(ftype); + } + break; + case 5: + if (ftype == Thrift.Type.STRUCT) { + this.queryDataSet = new ttypes.QueryDataSet(); + this.queryDataSet[Symbol.for("read")](input); + } else { + input.skip(ftype); + } + break; + case 6: + if (ftype == Thrift.Type.BOOL) { + this.ignoreTimeStamp = input.readBool(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +TSExecuteStatementResp.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('TSExecuteStatementResp'); + if (this.columns !== null && this.columns !== undefined) { + output.writeFieldBegin('columns', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.columns.length); + for (var iter25 in this.columns) { + if (this.columns.hasOwnProperty(iter25)) { + iter25 = this.columns[iter25]; + output.writeString(iter25); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.dataTypeList !== null && this.dataTypeList !== undefined) { + output.writeFieldBegin('dataTypeList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.I32, this.dataTypeList.length); + for (var iter26 in this.dataTypeList) { + if (this.dataTypeList.hasOwnProperty(iter26)) { + iter26 = this.dataTypeList[iter26]; + output.writeI32(iter26); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.columnNameIndexMap !== null && this.columnNameIndexMap !== undefined) { + output.writeFieldBegin('columnNameIndexMap', Thrift.Type.MAP, 3); + output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.I32, Thrift.objectLength(this.columnNameIndexMap)); + for (var kiter27 in this.columnNameIndexMap) { + if (this.columnNameIndexMap.hasOwnProperty(kiter27)) { + var viter28 = this.columnNameIndexMap[kiter27]; + output.writeString(kiter27); + output.writeI32(viter28); + } + } + output.writeMapEnd(); + output.writeFieldEnd(); + } + if (this.queryId !== null && this.queryId !== undefined) { + output.writeFieldBegin('queryId', Thrift.Type.I64, 4); + output.writeI64(this.queryId); + output.writeFieldEnd(); + } + if (this.queryDataSet !== null && this.queryDataSet !== undefined) { + output.writeFieldBegin('queryDataSet', Thrift.Type.STRUCT, 5); + this.queryDataSet[Symbol.for("write")](output); + output.writeFieldEnd(); + } + if (this.ignoreTimeStamp !== null && this.ignoreTimeStamp !== undefined) { + output.writeFieldBegin('ignoreTimeStamp', Thrift.Type.BOOL, 6); + output.writeBool(this.ignoreTimeStamp); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + +var QueryDataSet = module.exports.QueryDataSet = function(args) { + this.valueList = null; + this.bitmapList = null; + this.time = null; + if (args) { + if (args.valueList !== undefined && args.valueList !== null) { + this.valueList = Thrift.copyList(args.valueList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valueList is unset!'); + } + if (args.bitmapList !== undefined && args.bitmapList !== null) { + this.bitmapList = Thrift.copyList(args.bitmapList, [null]); + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field bitmapList is unset!'); + } + if (args.time !== undefined && args.time !== null) { + this.time = args.time; + } else { + throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field time is unset!'); + } + } +}; +QueryDataSet.prototype = {}; +QueryDataSet.prototype[Symbol.for("read")] = function(input) { + input.readStructBegin(); + while (true) { + var ret = input.readFieldBegin(); + var ftype = ret.ftype; + var fid = ret.fid; + if (ftype == Thrift.Type.STOP) { + break; + } + switch (fid) { + case 1: + if (ftype == Thrift.Type.LIST) { + this.valueList = []; + var _rtmp330 = input.readListBegin(); + var _size29 = _rtmp330.size || 0; + for (var _i31 = 0; _i31 < _size29; ++_i31) { + var elem32 = null; + elem32 = input.readBinary(); + this.valueList.push(elem32); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 2: + if (ftype == Thrift.Type.LIST) { + this.bitmapList = []; + var _rtmp334 = input.readListBegin(); + var _size33 = _rtmp334.size || 0; + for (var _i35 = 0; _i35 < _size33; ++_i35) { + var elem36 = null; + elem36 = input.readBinary(); + this.bitmapList.push(elem36); + } + input.readListEnd(); + } else { + input.skip(ftype); + } + break; + case 3: + if (ftype == Thrift.Type.STRING) { + this.time = input.readBinary(); + } else { + input.skip(ftype); + } + break; + default: + input.skip(ftype); + } + input.readFieldEnd(); + } + input.readStructEnd(); + return; +}; + +QueryDataSet.prototype[Symbol.for("write")] = function(output) { + output.writeStructBegin('QueryDataSet'); + if (this.valueList !== null && this.valueList !== undefined) { + output.writeFieldBegin('valueList', Thrift.Type.LIST, 1); + output.writeListBegin(Thrift.Type.STRING, this.valueList.length); + for (var iter37 in this.valueList) { + if (this.valueList.hasOwnProperty(iter37)) { + iter37 = this.valueList[iter37]; + output.writeBinary(iter37); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.bitmapList !== null && this.bitmapList !== undefined) { + output.writeFieldBegin('bitmapList', Thrift.Type.LIST, 2); + output.writeListBegin(Thrift.Type.STRING, this.bitmapList.length); + for (var iter38 in this.bitmapList) { + if (this.bitmapList.hasOwnProperty(iter38)) { + iter38 = this.bitmapList[iter38]; + output.writeBinary(iter38); + } + } + output.writeListEnd(); + output.writeFieldEnd(); + } + if (this.time !== null && this.time !== undefined) { + output.writeFieldBegin('time', Thrift.Type.STRING, 3); + output.writeBinary(this.time); + output.writeFieldEnd(); + } + output.writeFieldStop(); + output.writeStructEnd(); + return; +}; + diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js deleted file mode 100644 index 018aec1..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/client_types.js +++ /dev/null @@ -1,7961 +0,0 @@ -// -// Autogenerated by Thrift Compiler (0.14.1) -// -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING -// -"use strict"; - -var thrift = require('thrift'); -var Thrift = thrift.Thrift; -var Q = thrift.Q; -var Int64 = require('node-int64'); - -var common_ttypes = require('./common_types'); - - -var ttypes = module.exports = {}; -ttypes.TSProtocolVersion = { - 'IOTDB_SERVICE_PROTOCOL_V1' : 0, - 'IOTDB_SERVICE_PROTOCOL_V2' : 1, - 'IOTDB_SERVICE_PROTOCOL_V3' : 2 -}; -ttypes.TSConnectionType = { - 'THRIFT_BASED' : 0, - 'MQTT_BASED' : 1, - 'INTERNAL' : 2, - 'REST_BASED' : 3 -}; -var TSQueryDataSet = module.exports.TSQueryDataSet = function(args) { - this.time = null; - this.valueList = null; - this.bitmapList = null; - if (args) { - if (args.time !== undefined && args.time !== null) { - this.time = args.time; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field time is unset!'); - } - if (args.valueList !== undefined && args.valueList !== null) { - this.valueList = Thrift.copyList(args.valueList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valueList is unset!'); - } - if (args.bitmapList !== undefined && args.bitmapList !== null) { - this.bitmapList = Thrift.copyList(args.bitmapList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field bitmapList is unset!'); - } - } -}; -TSQueryDataSet.prototype = {}; -TSQueryDataSet.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.time = input.readBinary(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.valueList = []; - var _rtmp31 = input.readListBegin(); - var _size0 = _rtmp31.size || 0; - for (var _i2 = 0; _i2 < _size0; ++_i2) { - var elem3 = null; - elem3 = input.readBinary(); - this.valueList.push(elem3); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.bitmapList = []; - var _rtmp35 = input.readListBegin(); - var _size4 = _rtmp35.size || 0; - for (var _i6 = 0; _i6 < _size4; ++_i6) { - var elem7 = null; - elem7 = input.readBinary(); - this.bitmapList.push(elem7); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSQueryDataSet.prototype.write = function(output) { - output.writeStructBegin('TSQueryDataSet'); - if (this.time !== null && this.time !== undefined) { - output.writeFieldBegin('time', Thrift.Type.STRING, 1); - output.writeBinary(this.time); - output.writeFieldEnd(); - } - if (this.valueList !== null && this.valueList !== undefined) { - output.writeFieldBegin('valueList', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.valueList.length); - for (var iter8 in this.valueList) { - if (this.valueList.hasOwnProperty(iter8)) { - iter8 = this.valueList[iter8]; - output.writeBinary(iter8); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.bitmapList !== null && this.bitmapList !== undefined) { - output.writeFieldBegin('bitmapList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.bitmapList.length); - for (var iter9 in this.bitmapList) { - if (this.bitmapList.hasOwnProperty(iter9)) { - iter9 = this.bitmapList[iter9]; - output.writeBinary(iter9); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSQueryNonAlignDataSet = module.exports.TSQueryNonAlignDataSet = function(args) { - this.timeList = null; - this.valueList = null; - if (args) { - if (args.timeList !== undefined && args.timeList !== null) { - this.timeList = Thrift.copyList(args.timeList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeList is unset!'); - } - if (args.valueList !== undefined && args.valueList !== null) { - this.valueList = Thrift.copyList(args.valueList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valueList is unset!'); - } - } -}; -TSQueryNonAlignDataSet.prototype = {}; -TSQueryNonAlignDataSet.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.timeList = []; - var _rtmp311 = input.readListBegin(); - var _size10 = _rtmp311.size || 0; - for (var _i12 = 0; _i12 < _size10; ++_i12) { - var elem13 = null; - elem13 = input.readBinary(); - this.timeList.push(elem13); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.valueList = []; - var _rtmp315 = input.readListBegin(); - var _size14 = _rtmp315.size || 0; - for (var _i16 = 0; _i16 < _size14; ++_i16) { - var elem17 = null; - elem17 = input.readBinary(); - this.valueList.push(elem17); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSQueryNonAlignDataSet.prototype.write = function(output) { - output.writeStructBegin('TSQueryNonAlignDataSet'); - if (this.timeList !== null && this.timeList !== undefined) { - output.writeFieldBegin('timeList', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.timeList.length); - for (var iter18 in this.timeList) { - if (this.timeList.hasOwnProperty(iter18)) { - iter18 = this.timeList[iter18]; - output.writeBinary(iter18); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valueList !== null && this.valueList !== undefined) { - output.writeFieldBegin('valueList', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.valueList.length); - for (var iter19 in this.valueList) { - if (this.valueList.hasOwnProperty(iter19)) { - iter19 = this.valueList[iter19]; - output.writeBinary(iter19); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSTracingInfo = module.exports.TSTracingInfo = function(args) { - this.activityList = null; - this.elapsedTimeList = null; - this.seriesPathNum = null; - this.seqFileNum = null; - this.unSeqFileNum = null; - this.sequenceChunkNum = null; - this.sequenceChunkPointNum = null; - this.unsequenceChunkNum = null; - this.unsequenceChunkPointNum = null; - this.totalPageNum = null; - this.overlappedPageNum = null; - if (args) { - if (args.activityList !== undefined && args.activityList !== null) { - this.activityList = Thrift.copyList(args.activityList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field activityList is unset!'); - } - if (args.elapsedTimeList !== undefined && args.elapsedTimeList !== null) { - this.elapsedTimeList = Thrift.copyList(args.elapsedTimeList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field elapsedTimeList is unset!'); - } - if (args.seriesPathNum !== undefined && args.seriesPathNum !== null) { - this.seriesPathNum = args.seriesPathNum; - } - if (args.seqFileNum !== undefined && args.seqFileNum !== null) { - this.seqFileNum = args.seqFileNum; - } - if (args.unSeqFileNum !== undefined && args.unSeqFileNum !== null) { - this.unSeqFileNum = args.unSeqFileNum; - } - if (args.sequenceChunkNum !== undefined && args.sequenceChunkNum !== null) { - this.sequenceChunkNum = args.sequenceChunkNum; - } - if (args.sequenceChunkPointNum !== undefined && args.sequenceChunkPointNum !== null) { - this.sequenceChunkPointNum = args.sequenceChunkPointNum; - } - if (args.unsequenceChunkNum !== undefined && args.unsequenceChunkNum !== null) { - this.unsequenceChunkNum = args.unsequenceChunkNum; - } - if (args.unsequenceChunkPointNum !== undefined && args.unsequenceChunkPointNum !== null) { - this.unsequenceChunkPointNum = args.unsequenceChunkPointNum; - } - if (args.totalPageNum !== undefined && args.totalPageNum !== null) { - this.totalPageNum = args.totalPageNum; - } - if (args.overlappedPageNum !== undefined && args.overlappedPageNum !== null) { - this.overlappedPageNum = args.overlappedPageNum; - } - } -}; -TSTracingInfo.prototype = {}; -TSTracingInfo.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.activityList = []; - var _rtmp321 = input.readListBegin(); - var _size20 = _rtmp321.size || 0; - for (var _i22 = 0; _i22 < _size20; ++_i22) { - var elem23 = null; - elem23 = input.readString(); - this.activityList.push(elem23); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.elapsedTimeList = []; - var _rtmp325 = input.readListBegin(); - var _size24 = _rtmp325.size || 0; - for (var _i26 = 0; _i26 < _size24; ++_i26) { - var elem27 = null; - elem27 = input.readI64(); - this.elapsedTimeList.push(elem27); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.seriesPathNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.seqFileNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.unSeqFileNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I32) { - this.sequenceChunkNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.I64) { - this.sequenceChunkPointNum = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.I32) { - this.unsequenceChunkNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I64) { - this.unsequenceChunkPointNum = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.I32) { - this.totalPageNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 11: - if (ftype == Thrift.Type.I32) { - this.overlappedPageNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSTracingInfo.prototype.write = function(output) { - output.writeStructBegin('TSTracingInfo'); - if (this.activityList !== null && this.activityList !== undefined) { - output.writeFieldBegin('activityList', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.activityList.length); - for (var iter28 in this.activityList) { - if (this.activityList.hasOwnProperty(iter28)) { - iter28 = this.activityList[iter28]; - output.writeString(iter28); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.elapsedTimeList !== null && this.elapsedTimeList !== undefined) { - output.writeFieldBegin('elapsedTimeList', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.I64, this.elapsedTimeList.length); - for (var iter29 in this.elapsedTimeList) { - if (this.elapsedTimeList.hasOwnProperty(iter29)) { - iter29 = this.elapsedTimeList[iter29]; - output.writeI64(iter29); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.seriesPathNum !== null && this.seriesPathNum !== undefined) { - output.writeFieldBegin('seriesPathNum', Thrift.Type.I32, 3); - output.writeI32(this.seriesPathNum); - output.writeFieldEnd(); - } - if (this.seqFileNum !== null && this.seqFileNum !== undefined) { - output.writeFieldBegin('seqFileNum', Thrift.Type.I32, 4); - output.writeI32(this.seqFileNum); - output.writeFieldEnd(); - } - if (this.unSeqFileNum !== null && this.unSeqFileNum !== undefined) { - output.writeFieldBegin('unSeqFileNum', Thrift.Type.I32, 5); - output.writeI32(this.unSeqFileNum); - output.writeFieldEnd(); - } - if (this.sequenceChunkNum !== null && this.sequenceChunkNum !== undefined) { - output.writeFieldBegin('sequenceChunkNum', Thrift.Type.I32, 6); - output.writeI32(this.sequenceChunkNum); - output.writeFieldEnd(); - } - if (this.sequenceChunkPointNum !== null && this.sequenceChunkPointNum !== undefined) { - output.writeFieldBegin('sequenceChunkPointNum', Thrift.Type.I64, 7); - output.writeI64(this.sequenceChunkPointNum); - output.writeFieldEnd(); - } - if (this.unsequenceChunkNum !== null && this.unsequenceChunkNum !== undefined) { - output.writeFieldBegin('unsequenceChunkNum', Thrift.Type.I32, 8); - output.writeI32(this.unsequenceChunkNum); - output.writeFieldEnd(); - } - if (this.unsequenceChunkPointNum !== null && this.unsequenceChunkPointNum !== undefined) { - output.writeFieldBegin('unsequenceChunkPointNum', Thrift.Type.I64, 9); - output.writeI64(this.unsequenceChunkPointNum); - output.writeFieldEnd(); - } - if (this.totalPageNum !== null && this.totalPageNum !== undefined) { - output.writeFieldBegin('totalPageNum', Thrift.Type.I32, 10); - output.writeI32(this.totalPageNum); - output.writeFieldEnd(); - } - if (this.overlappedPageNum !== null && this.overlappedPageNum !== undefined) { - output.writeFieldBegin('overlappedPageNum', Thrift.Type.I32, 11); - output.writeI32(this.overlappedPageNum); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSExecuteStatementResp = module.exports.TSExecuteStatementResp = function(args) { - this.status = null; - this.queryId = null; - this.columns = null; - this.operationType = null; - this.ignoreTimeStamp = null; - this.dataTypeList = null; - this.queryDataSet = null; - this.nonAlignQueryDataSet = null; - this.columnNameIndexMap = null; - this.sgColumns = null; - this.aliasColumns = null; - this.tracingInfo = null; - this.queryResult = null; - this.moreData = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.queryId !== undefined && args.queryId !== null) { - this.queryId = args.queryId; - } - if (args.columns !== undefined && args.columns !== null) { - this.columns = Thrift.copyList(args.columns, [null]); - } - if (args.operationType !== undefined && args.operationType !== null) { - this.operationType = args.operationType; - } - if (args.ignoreTimeStamp !== undefined && args.ignoreTimeStamp !== null) { - this.ignoreTimeStamp = args.ignoreTimeStamp; - } - if (args.dataTypeList !== undefined && args.dataTypeList !== null) { - this.dataTypeList = Thrift.copyList(args.dataTypeList, [null]); - } - if (args.queryDataSet !== undefined && args.queryDataSet !== null) { - this.queryDataSet = new ttypes.TSQueryDataSet(args.queryDataSet); - } - if (args.nonAlignQueryDataSet !== undefined && args.nonAlignQueryDataSet !== null) { - this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(args.nonAlignQueryDataSet); - } - if (args.columnNameIndexMap !== undefined && args.columnNameIndexMap !== null) { - this.columnNameIndexMap = Thrift.copyMap(args.columnNameIndexMap, [null]); - } - if (args.sgColumns !== undefined && args.sgColumns !== null) { - this.sgColumns = Thrift.copyList(args.sgColumns, [null]); - } - if (args.aliasColumns !== undefined && args.aliasColumns !== null) { - this.aliasColumns = Thrift.copyList(args.aliasColumns, [null]); - } - if (args.tracingInfo !== undefined && args.tracingInfo !== null) { - this.tracingInfo = new ttypes.TSTracingInfo(args.tracingInfo); - } - if (args.queryResult !== undefined && args.queryResult !== null) { - this.queryResult = Thrift.copyList(args.queryResult, [null]); - } - if (args.moreData !== undefined && args.moreData !== null) { - this.moreData = args.moreData; - } - } -}; -TSExecuteStatementResp.prototype = {}; -TSExecuteStatementResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.queryId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.columns = []; - var _rtmp331 = input.readListBegin(); - var _size30 = _rtmp331.size || 0; - for (var _i32 = 0; _i32 < _size30; ++_i32) { - var elem33 = null; - elem33 = input.readString(); - this.columns.push(elem33); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.operationType = input.readString(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.BOOL) { - this.ignoreTimeStamp = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.dataTypeList = []; - var _rtmp335 = input.readListBegin(); - var _size34 = _rtmp335.size || 0; - for (var _i36 = 0; _i36 < _size34; ++_i36) { - var elem37 = null; - elem37 = input.readString(); - this.dataTypeList.push(elem37); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.STRUCT) { - this.queryDataSet = new ttypes.TSQueryDataSet(); - this.queryDataSet.read(input); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.STRUCT) { - this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(); - this.nonAlignQueryDataSet.read(input); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.MAP) { - this.columnNameIndexMap = {}; - var _rtmp339 = input.readMapBegin(); - var _size38 = _rtmp339.size || 0; - for (var _i40 = 0; _i40 < _size38; ++_i40) { - var key41 = null; - var val42 = null; - key41 = input.readString(); - val42 = input.readI32(); - this.columnNameIndexMap[key41] = val42; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.LIST) { - this.sgColumns = []; - var _rtmp344 = input.readListBegin(); - var _size43 = _rtmp344.size || 0; - for (var _i45 = 0; _i45 < _size43; ++_i45) { - var elem46 = null; - elem46 = input.readString(); - this.sgColumns.push(elem46); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 11: - if (ftype == Thrift.Type.LIST) { - this.aliasColumns = []; - var _rtmp348 = input.readListBegin(); - var _size47 = _rtmp348.size || 0; - for (var _i49 = 0; _i49 < _size47; ++_i49) { - var elem50 = null; - elem50 = input.readByte(); - this.aliasColumns.push(elem50); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 12: - if (ftype == Thrift.Type.STRUCT) { - this.tracingInfo = new ttypes.TSTracingInfo(); - this.tracingInfo.read(input); - } else { - input.skip(ftype); - } - break; - case 13: - if (ftype == Thrift.Type.LIST) { - this.queryResult = []; - var _rtmp352 = input.readListBegin(); - var _size51 = _rtmp352.size || 0; - for (var _i53 = 0; _i53 < _size51; ++_i53) { - var elem54 = null; - elem54 = input.readBinary(); - this.queryResult.push(elem54); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 14: - if (ftype == Thrift.Type.BOOL) { - this.moreData = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSExecuteStatementResp.prototype.write = function(output) { - output.writeStructBegin('TSExecuteStatementResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.queryId !== null && this.queryId !== undefined) { - output.writeFieldBegin('queryId', Thrift.Type.I64, 2); - output.writeI64(this.queryId); - output.writeFieldEnd(); - } - if (this.columns !== null && this.columns !== undefined) { - output.writeFieldBegin('columns', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.columns.length); - for (var iter55 in this.columns) { - if (this.columns.hasOwnProperty(iter55)) { - iter55 = this.columns[iter55]; - output.writeString(iter55); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.operationType !== null && this.operationType !== undefined) { - output.writeFieldBegin('operationType', Thrift.Type.STRING, 4); - output.writeString(this.operationType); - output.writeFieldEnd(); - } - if (this.ignoreTimeStamp !== null && this.ignoreTimeStamp !== undefined) { - output.writeFieldBegin('ignoreTimeStamp', Thrift.Type.BOOL, 5); - output.writeBool(this.ignoreTimeStamp); - output.writeFieldEnd(); - } - if (this.dataTypeList !== null && this.dataTypeList !== undefined) { - output.writeFieldBegin('dataTypeList', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.STRING, this.dataTypeList.length); - for (var iter56 in this.dataTypeList) { - if (this.dataTypeList.hasOwnProperty(iter56)) { - iter56 = this.dataTypeList[iter56]; - output.writeString(iter56); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.queryDataSet !== null && this.queryDataSet !== undefined) { - output.writeFieldBegin('queryDataSet', Thrift.Type.STRUCT, 7); - this.queryDataSet.write(output); - output.writeFieldEnd(); - } - if (this.nonAlignQueryDataSet !== null && this.nonAlignQueryDataSet !== undefined) { - output.writeFieldBegin('nonAlignQueryDataSet', Thrift.Type.STRUCT, 8); - this.nonAlignQueryDataSet.write(output); - output.writeFieldEnd(); - } - if (this.columnNameIndexMap !== null && this.columnNameIndexMap !== undefined) { - output.writeFieldBegin('columnNameIndexMap', Thrift.Type.MAP, 9); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.I32, Thrift.objectLength(this.columnNameIndexMap)); - for (var kiter57 in this.columnNameIndexMap) { - if (this.columnNameIndexMap.hasOwnProperty(kiter57)) { - var viter58 = this.columnNameIndexMap[kiter57]; - output.writeString(kiter57); - output.writeI32(viter58); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.sgColumns !== null && this.sgColumns !== undefined) { - output.writeFieldBegin('sgColumns', Thrift.Type.LIST, 10); - output.writeListBegin(Thrift.Type.STRING, this.sgColumns.length); - for (var iter59 in this.sgColumns) { - if (this.sgColumns.hasOwnProperty(iter59)) { - iter59 = this.sgColumns[iter59]; - output.writeString(iter59); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.aliasColumns !== null && this.aliasColumns !== undefined) { - output.writeFieldBegin('aliasColumns', Thrift.Type.LIST, 11); - output.writeListBegin(Thrift.Type.BYTE, this.aliasColumns.length); - for (var iter60 in this.aliasColumns) { - if (this.aliasColumns.hasOwnProperty(iter60)) { - iter60 = this.aliasColumns[iter60]; - output.writeByte(iter60); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.tracingInfo !== null && this.tracingInfo !== undefined) { - output.writeFieldBegin('tracingInfo', Thrift.Type.STRUCT, 12); - this.tracingInfo.write(output); - output.writeFieldEnd(); - } - if (this.queryResult !== null && this.queryResult !== undefined) { - output.writeFieldBegin('queryResult', Thrift.Type.LIST, 13); - output.writeListBegin(Thrift.Type.STRING, this.queryResult.length); - for (var iter61 in this.queryResult) { - if (this.queryResult.hasOwnProperty(iter61)) { - iter61 = this.queryResult[iter61]; - output.writeBinary(iter61); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.moreData !== null && this.moreData !== undefined) { - output.writeFieldBegin('moreData', Thrift.Type.BOOL, 14); - output.writeBool(this.moreData); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSOpenSessionResp = module.exports.TSOpenSessionResp = function(args) { - this.status = null; - this.serverProtocolVersion = 0; - this.sessionId = null; - this.configuration = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.serverProtocolVersion !== undefined && args.serverProtocolVersion !== null) { - this.serverProtocolVersion = args.serverProtocolVersion; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serverProtocolVersion is unset!'); - } - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } - if (args.configuration !== undefined && args.configuration !== null) { - this.configuration = Thrift.copyMap(args.configuration, [null]); - } - } -}; -TSOpenSessionResp.prototype = {}; -TSOpenSessionResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.serverProtocolVersion = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.MAP) { - this.configuration = {}; - var _rtmp363 = input.readMapBegin(); - var _size62 = _rtmp363.size || 0; - for (var _i64 = 0; _i64 < _size62; ++_i64) { - var key65 = null; - var val66 = null; - key65 = input.readString(); - val66 = input.readString(); - this.configuration[key65] = val66; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSOpenSessionResp.prototype.write = function(output) { - output.writeStructBegin('TSOpenSessionResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.serverProtocolVersion !== null && this.serverProtocolVersion !== undefined) { - output.writeFieldBegin('serverProtocolVersion', Thrift.Type.I32, 2); - output.writeI32(this.serverProtocolVersion); - output.writeFieldEnd(); - } - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 3); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.configuration !== null && this.configuration !== undefined) { - output.writeFieldBegin('configuration', Thrift.Type.MAP, 4); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configuration)); - for (var kiter67 in this.configuration) { - if (this.configuration.hasOwnProperty(kiter67)) { - var viter68 = this.configuration[kiter67]; - output.writeString(kiter67); - output.writeString(viter68); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSOpenSessionReq = module.exports.TSOpenSessionReq = function(args) { - this.client_protocol = 2; - this.zoneId = null; - this.username = null; - this.password = null; - this.configuration = null; - if (args) { - if (args.client_protocol !== undefined && args.client_protocol !== null) { - this.client_protocol = args.client_protocol; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field client_protocol is unset!'); - } - if (args.zoneId !== undefined && args.zoneId !== null) { - this.zoneId = args.zoneId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field zoneId is unset!'); - } - if (args.username !== undefined && args.username !== null) { - this.username = args.username; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field username is unset!'); - } - if (args.password !== undefined && args.password !== null) { - this.password = args.password; - } - if (args.configuration !== undefined && args.configuration !== null) { - this.configuration = Thrift.copyMap(args.configuration, [null]); - } - } -}; -TSOpenSessionReq.prototype = {}; -TSOpenSessionReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.client_protocol = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.zoneId = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.username = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.password = input.readString(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.MAP) { - this.configuration = {}; - var _rtmp370 = input.readMapBegin(); - var _size69 = _rtmp370.size || 0; - for (var _i71 = 0; _i71 < _size69; ++_i71) { - var key72 = null; - var val73 = null; - key72 = input.readString(); - val73 = input.readString(); - this.configuration[key72] = val73; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSOpenSessionReq.prototype.write = function(output) { - output.writeStructBegin('TSOpenSessionReq'); - if (this.client_protocol !== null && this.client_protocol !== undefined) { - output.writeFieldBegin('client_protocol', Thrift.Type.I32, 1); - output.writeI32(this.client_protocol); - output.writeFieldEnd(); - } - if (this.zoneId !== null && this.zoneId !== undefined) { - output.writeFieldBegin('zoneId', Thrift.Type.STRING, 2); - output.writeString(this.zoneId); - output.writeFieldEnd(); - } - if (this.username !== null && this.username !== undefined) { - output.writeFieldBegin('username', Thrift.Type.STRING, 3); - output.writeString(this.username); - output.writeFieldEnd(); - } - if (this.password !== null && this.password !== undefined) { - output.writeFieldBegin('password', Thrift.Type.STRING, 4); - output.writeString(this.password); - output.writeFieldEnd(); - } - if (this.configuration !== null && this.configuration !== undefined) { - output.writeFieldBegin('configuration', Thrift.Type.MAP, 5); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configuration)); - for (var kiter74 in this.configuration) { - if (this.configuration.hasOwnProperty(kiter74)) { - var viter75 = this.configuration[kiter74]; - output.writeString(kiter74); - output.writeString(viter75); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCloseSessionReq = module.exports.TSCloseSessionReq = function(args) { - this.sessionId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - } -}; -TSCloseSessionReq.prototype = {}; -TSCloseSessionReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCloseSessionReq.prototype.write = function(output) { - output.writeStructBegin('TSCloseSessionReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSExecuteStatementReq = module.exports.TSExecuteStatementReq = function(args) { - this.sessionId = null; - this.statement = null; - this.statementId = null; - this.fetchSize = null; - this.timeout = null; - this.enableRedirectQuery = null; - this.jdbcQuery = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.statement !== undefined && args.statement !== null) { - this.statement = args.statement; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statement is unset!'); - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { - this.enableRedirectQuery = args.enableRedirectQuery; - } - if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { - this.jdbcQuery = args.jdbcQuery; - } - } -}; -TSExecuteStatementReq.prototype = {}; -TSExecuteStatementReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.statement = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.enableRedirectQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.BOOL) { - this.jdbcQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSExecuteStatementReq.prototype.write = function(output) { - output.writeStructBegin('TSExecuteStatementReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.statement !== null && this.statement !== undefined) { - output.writeFieldBegin('statement', Thrift.Type.STRING, 2); - output.writeString(this.statement); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 3); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 4); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 5); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { - output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 6); - output.writeBool(this.enableRedirectQuery); - output.writeFieldEnd(); - } - if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { - output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 7); - output.writeBool(this.jdbcQuery); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSExecuteBatchStatementReq = module.exports.TSExecuteBatchStatementReq = function(args) { - this.sessionId = null; - this.statements = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.statements !== undefined && args.statements !== null) { - this.statements = Thrift.copyList(args.statements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statements is unset!'); - } - } -}; -TSExecuteBatchStatementReq.prototype = {}; -TSExecuteBatchStatementReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.statements = []; - var _rtmp377 = input.readListBegin(); - var _size76 = _rtmp377.size || 0; - for (var _i78 = 0; _i78 < _size76; ++_i78) { - var elem79 = null; - elem79 = input.readString(); - this.statements.push(elem79); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSExecuteBatchStatementReq.prototype.write = function(output) { - output.writeStructBegin('TSExecuteBatchStatementReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.statements !== null && this.statements !== undefined) { - output.writeFieldBegin('statements', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.statements.length); - for (var iter80 in this.statements) { - if (this.statements.hasOwnProperty(iter80)) { - iter80 = this.statements[iter80]; - output.writeString(iter80); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSGetOperationStatusReq = module.exports.TSGetOperationStatusReq = function(args) { - this.sessionId = null; - this.queryId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.queryId !== undefined && args.queryId !== null) { - this.queryId = args.queryId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); - } - } -}; -TSGetOperationStatusReq.prototype = {}; -TSGetOperationStatusReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.queryId = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSGetOperationStatusReq.prototype.write = function(output) { - output.writeStructBegin('TSGetOperationStatusReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.queryId !== null && this.queryId !== undefined) { - output.writeFieldBegin('queryId', Thrift.Type.I64, 2); - output.writeI64(this.queryId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCancelOperationReq = module.exports.TSCancelOperationReq = function(args) { - this.sessionId = null; - this.queryId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.queryId !== undefined && args.queryId !== null) { - this.queryId = args.queryId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); - } - } -}; -TSCancelOperationReq.prototype = {}; -TSCancelOperationReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.queryId = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCancelOperationReq.prototype.write = function(output) { - output.writeStructBegin('TSCancelOperationReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.queryId !== null && this.queryId !== undefined) { - output.writeFieldBegin('queryId', Thrift.Type.I64, 2); - output.writeI64(this.queryId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCloseOperationReq = module.exports.TSCloseOperationReq = function(args) { - this.sessionId = null; - this.queryId = null; - this.statementId = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.queryId !== undefined && args.queryId !== null) { - this.queryId = args.queryId; - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } - } -}; -TSCloseOperationReq.prototype = {}; -TSCloseOperationReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.queryId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCloseOperationReq.prototype.write = function(output) { - output.writeStructBegin('TSCloseOperationReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.queryId !== null && this.queryId !== undefined) { - output.writeFieldBegin('queryId', Thrift.Type.I64, 2); - output.writeI64(this.queryId); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 3); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSFetchResultsReq = module.exports.TSFetchResultsReq = function(args) { - this.sessionId = null; - this.statement = null; - this.fetchSize = null; - this.queryId = null; - this.isAlign = null; - this.timeout = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.statement !== undefined && args.statement !== null) { - this.statement = args.statement; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statement is unset!'); - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fetchSize is unset!'); - } - if (args.queryId !== undefined && args.queryId !== null) { - this.queryId = args.queryId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryId is unset!'); - } - if (args.isAlign !== undefined && args.isAlign !== null) { - this.isAlign = args.isAlign; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAlign is unset!'); - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - } -}; -TSFetchResultsReq.prototype = {}; -TSFetchResultsReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.statement = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I64) { - this.queryId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.BOOL) { - this.isAlign = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSFetchResultsReq.prototype.write = function(output) { - output.writeStructBegin('TSFetchResultsReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.statement !== null && this.statement !== undefined) { - output.writeFieldBegin('statement', Thrift.Type.STRING, 2); - output.writeString(this.statement); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.queryId !== null && this.queryId !== undefined) { - output.writeFieldBegin('queryId', Thrift.Type.I64, 4); - output.writeI64(this.queryId); - output.writeFieldEnd(); - } - if (this.isAlign !== null && this.isAlign !== undefined) { - output.writeFieldBegin('isAlign', Thrift.Type.BOOL, 5); - output.writeBool(this.isAlign); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 6); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSFetchResultsResp = module.exports.TSFetchResultsResp = function(args) { - this.status = null; - this.hasResultSet = null; - this.isAlign = null; - this.queryDataSet = null; - this.nonAlignQueryDataSet = null; - this.queryResult = null; - this.moreData = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.hasResultSet !== undefined && args.hasResultSet !== null) { - this.hasResultSet = args.hasResultSet; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field hasResultSet is unset!'); - } - if (args.isAlign !== undefined && args.isAlign !== null) { - this.isAlign = args.isAlign; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAlign is unset!'); - } - if (args.queryDataSet !== undefined && args.queryDataSet !== null) { - this.queryDataSet = new ttypes.TSQueryDataSet(args.queryDataSet); - } - if (args.nonAlignQueryDataSet !== undefined && args.nonAlignQueryDataSet !== null) { - this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(args.nonAlignQueryDataSet); - } - if (args.queryResult !== undefined && args.queryResult !== null) { - this.queryResult = Thrift.copyList(args.queryResult, [null]); - } - if (args.moreData !== undefined && args.moreData !== null) { - this.moreData = args.moreData; - } - } -}; -TSFetchResultsResp.prototype = {}; -TSFetchResultsResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.BOOL) { - this.hasResultSet = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.BOOL) { - this.isAlign = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRUCT) { - this.queryDataSet = new ttypes.TSQueryDataSet(); - this.queryDataSet.read(input); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.STRUCT) { - this.nonAlignQueryDataSet = new ttypes.TSQueryNonAlignDataSet(); - this.nonAlignQueryDataSet.read(input); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.queryResult = []; - var _rtmp382 = input.readListBegin(); - var _size81 = _rtmp382.size || 0; - for (var _i83 = 0; _i83 < _size81; ++_i83) { - var elem84 = null; - elem84 = input.readBinary(); - this.queryResult.push(elem84); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.BOOL) { - this.moreData = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSFetchResultsResp.prototype.write = function(output) { - output.writeStructBegin('TSFetchResultsResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.hasResultSet !== null && this.hasResultSet !== undefined) { - output.writeFieldBegin('hasResultSet', Thrift.Type.BOOL, 2); - output.writeBool(this.hasResultSet); - output.writeFieldEnd(); - } - if (this.isAlign !== null && this.isAlign !== undefined) { - output.writeFieldBegin('isAlign', Thrift.Type.BOOL, 3); - output.writeBool(this.isAlign); - output.writeFieldEnd(); - } - if (this.queryDataSet !== null && this.queryDataSet !== undefined) { - output.writeFieldBegin('queryDataSet', Thrift.Type.STRUCT, 4); - this.queryDataSet.write(output); - output.writeFieldEnd(); - } - if (this.nonAlignQueryDataSet !== null && this.nonAlignQueryDataSet !== undefined) { - output.writeFieldBegin('nonAlignQueryDataSet', Thrift.Type.STRUCT, 5); - this.nonAlignQueryDataSet.write(output); - output.writeFieldEnd(); - } - if (this.queryResult !== null && this.queryResult !== undefined) { - output.writeFieldBegin('queryResult', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.STRING, this.queryResult.length); - for (var iter85 in this.queryResult) { - if (this.queryResult.hasOwnProperty(iter85)) { - iter85 = this.queryResult[iter85]; - output.writeBinary(iter85); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.moreData !== null && this.moreData !== undefined) { - output.writeFieldBegin('moreData', Thrift.Type.BOOL, 7); - output.writeBool(this.moreData); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSFetchMetadataResp = module.exports.TSFetchMetadataResp = function(args) { - this.status = null; - this.metadataInJson = null; - this.columnsList = null; - this.dataType = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.metadataInJson !== undefined && args.metadataInJson !== null) { - this.metadataInJson = args.metadataInJson; - } - if (args.columnsList !== undefined && args.columnsList !== null) { - this.columnsList = Thrift.copyList(args.columnsList, [null]); - } - if (args.dataType !== undefined && args.dataType !== null) { - this.dataType = args.dataType; - } - } -}; -TSFetchMetadataResp.prototype = {}; -TSFetchMetadataResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.metadataInJson = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.columnsList = []; - var _rtmp387 = input.readListBegin(); - var _size86 = _rtmp387.size || 0; - for (var _i88 = 0; _i88 < _size86; ++_i88) { - var elem89 = null; - elem89 = input.readString(); - this.columnsList.push(elem89); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.dataType = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSFetchMetadataResp.prototype.write = function(output) { - output.writeStructBegin('TSFetchMetadataResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.metadataInJson !== null && this.metadataInJson !== undefined) { - output.writeFieldBegin('metadataInJson', Thrift.Type.STRING, 2); - output.writeString(this.metadataInJson); - output.writeFieldEnd(); - } - if (this.columnsList !== null && this.columnsList !== undefined) { - output.writeFieldBegin('columnsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.columnsList.length); - for (var iter90 in this.columnsList) { - if (this.columnsList.hasOwnProperty(iter90)) { - iter90 = this.columnsList[iter90]; - output.writeString(iter90); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.dataType !== null && this.dataType !== undefined) { - output.writeFieldBegin('dataType', Thrift.Type.STRING, 4); - output.writeString(this.dataType); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSFetchMetadataReq = module.exports.TSFetchMetadataReq = function(args) { - this.sessionId = null; - this.type = null; - this.columnPath = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - if (args.columnPath !== undefined && args.columnPath !== null) { - this.columnPath = args.columnPath; - } - } -}; -TSFetchMetadataReq.prototype = {}; -TSFetchMetadataReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.type = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.columnPath = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSFetchMetadataReq.prototype.write = function(output) { - output.writeStructBegin('TSFetchMetadataReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.STRING, 2); - output.writeString(this.type); - output.writeFieldEnd(); - } - if (this.columnPath !== null && this.columnPath !== undefined) { - output.writeFieldBegin('columnPath', Thrift.Type.STRING, 3); - output.writeString(this.columnPath); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSGetTimeZoneResp = module.exports.TSGetTimeZoneResp = function(args) { - this.status = null; - this.timeZone = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.timeZone !== undefined && args.timeZone !== null) { - this.timeZone = args.timeZone; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeZone is unset!'); - } - } -}; -TSGetTimeZoneResp.prototype = {}; -TSGetTimeZoneResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.timeZone = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSGetTimeZoneResp.prototype.write = function(output) { - output.writeStructBegin('TSGetTimeZoneResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.timeZone !== null && this.timeZone !== undefined) { - output.writeFieldBegin('timeZone', Thrift.Type.STRING, 2); - output.writeString(this.timeZone); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSSetTimeZoneReq = module.exports.TSSetTimeZoneReq = function(args) { - this.sessionId = null; - this.timeZone = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.timeZone !== undefined && args.timeZone !== null) { - this.timeZone = args.timeZone; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeZone is unset!'); - } - } -}; -TSSetTimeZoneReq.prototype = {}; -TSSetTimeZoneReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.timeZone = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSSetTimeZoneReq.prototype.write = function(output) { - output.writeStructBegin('TSSetTimeZoneReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.timeZone !== null && this.timeZone !== undefined) { - output.writeFieldBegin('timeZone', Thrift.Type.STRING, 2); - output.writeString(this.timeZone); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertRecordReq = module.exports.TSInsertRecordReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurements = null; - this.values = null; - this.timestamp = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); - } - if (args.values !== undefined && args.values !== null) { - this.values = args.values; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); - } - if (args.timestamp !== undefined && args.timestamp !== null) { - this.timestamp = args.timestamp; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamp is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertRecordReq.prototype = {}; -TSInsertRecordReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp392 = input.readListBegin(); - var _size91 = _rtmp392.size || 0; - for (var _i93 = 0; _i93 < _size91; ++_i93) { - var elem94 = null; - elem94 = input.readString(); - this.measurements.push(elem94); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.values = input.readBinary(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.timestamp = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertRecordReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertRecordReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter95 in this.measurements) { - if (this.measurements.hasOwnProperty(iter95)) { - iter95 = this.measurements[iter95]; - output.writeString(iter95); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.values !== null && this.values !== undefined) { - output.writeFieldBegin('values', Thrift.Type.STRING, 4); - output.writeBinary(this.values); - output.writeFieldEnd(); - } - if (this.timestamp !== null && this.timestamp !== undefined) { - output.writeFieldBegin('timestamp', Thrift.Type.I64, 5); - output.writeI64(this.timestamp); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertStringRecordReq = module.exports.TSInsertStringRecordReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurements = null; - this.values = null; - this.timestamp = null; - this.isAligned = null; - this.timeout = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); - } - if (args.values !== undefined && args.values !== null) { - this.values = Thrift.copyList(args.values, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); - } - if (args.timestamp !== undefined && args.timestamp !== null) { - this.timestamp = args.timestamp; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamp is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - } -}; -TSInsertStringRecordReq.prototype = {}; -TSInsertStringRecordReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp397 = input.readListBegin(); - var _size96 = _rtmp397.size || 0; - for (var _i98 = 0; _i98 < _size96; ++_i98) { - var elem99 = null; - elem99 = input.readString(); - this.measurements.push(elem99); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.values = []; - var _rtmp3101 = input.readListBegin(); - var _size100 = _rtmp3101.size || 0; - for (var _i102 = 0; _i102 < _size100; ++_i102) { - var elem103 = null; - elem103 = input.readString(); - this.values.push(elem103); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.timestamp = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertStringRecordReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertStringRecordReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter104 in this.measurements) { - if (this.measurements.hasOwnProperty(iter104)) { - iter104 = this.measurements[iter104]; - output.writeString(iter104); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.values !== null && this.values !== undefined) { - output.writeFieldBegin('values', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.values.length); - for (var iter105 in this.values) { - if (this.values.hasOwnProperty(iter105)) { - iter105 = this.values[iter105]; - output.writeString(iter105); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestamp !== null && this.timestamp !== undefined) { - output.writeFieldBegin('timestamp', Thrift.Type.I64, 5); - output.writeI64(this.timestamp); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 7); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertTabletReq = module.exports.TSInsertTabletReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurements = null; - this.values = null; - this.timestamps = null; - this.types = null; - this.size = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); - } - if (args.values !== undefined && args.values !== null) { - this.values = args.values; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field values is unset!'); - } - if (args.timestamps !== undefined && args.timestamps !== null) { - this.timestamps = args.timestamps; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); - } - if (args.types !== undefined && args.types !== null) { - this.types = Thrift.copyList(args.types, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field types is unset!'); - } - if (args.size !== undefined && args.size !== null) { - this.size = args.size; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field size is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertTabletReq.prototype = {}; -TSInsertTabletReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp3107 = input.readListBegin(); - var _size106 = _rtmp3107.size || 0; - for (var _i108 = 0; _i108 < _size106; ++_i108) { - var elem109 = null; - elem109 = input.readString(); - this.measurements.push(elem109); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.values = input.readBinary(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.STRING) { - this.timestamps = input.readBinary(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.types = []; - var _rtmp3111 = input.readListBegin(); - var _size110 = _rtmp3111.size || 0; - for (var _i112 = 0; _i112 < _size110; ++_i112) { - var elem113 = null; - elem113 = input.readI32(); - this.types.push(elem113); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.I32) { - this.size = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertTabletReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertTabletReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter114 in this.measurements) { - if (this.measurements.hasOwnProperty(iter114)) { - iter114 = this.measurements[iter114]; - output.writeString(iter114); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.values !== null && this.values !== undefined) { - output.writeFieldBegin('values', Thrift.Type.STRING, 4); - output.writeBinary(this.values); - output.writeFieldEnd(); - } - if (this.timestamps !== null && this.timestamps !== undefined) { - output.writeFieldBegin('timestamps', Thrift.Type.STRING, 5); - output.writeBinary(this.timestamps); - output.writeFieldEnd(); - } - if (this.types !== null && this.types !== undefined) { - output.writeFieldBegin('types', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.I32, this.types.length); - for (var iter115 in this.types) { - if (this.types.hasOwnProperty(iter115)) { - iter115 = this.types[iter115]; - output.writeI32(iter115); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.size !== null && this.size !== undefined) { - output.writeFieldBegin('size', Thrift.Type.I32, 7); - output.writeI32(this.size); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 8); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertTabletsReq = module.exports.TSInsertTabletsReq = function(args) { - this.sessionId = null; - this.prefixPaths = null; - this.measurementsList = null; - this.valuesList = null; - this.timestampsList = null; - this.typesList = null; - this.sizeList = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPaths !== undefined && args.prefixPaths !== null) { - this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); - } - if (args.measurementsList !== undefined && args.measurementsList !== null) { - this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); - } - if (args.valuesList !== undefined && args.valuesList !== null) { - this.valuesList = Thrift.copyList(args.valuesList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); - } - if (args.timestampsList !== undefined && args.timestampsList !== null) { - this.timestampsList = Thrift.copyList(args.timestampsList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestampsList is unset!'); - } - if (args.typesList !== undefined && args.typesList !== null) { - this.typesList = Thrift.copyList(args.typesList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field typesList is unset!'); - } - if (args.sizeList !== undefined && args.sizeList !== null) { - this.sizeList = Thrift.copyList(args.sizeList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sizeList is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertTabletsReq.prototype = {}; -TSInsertTabletsReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.prefixPaths = []; - var _rtmp3117 = input.readListBegin(); - var _size116 = _rtmp3117.size || 0; - for (var _i118 = 0; _i118 < _size116; ++_i118) { - var elem119 = null; - elem119 = input.readString(); - this.prefixPaths.push(elem119); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurementsList = []; - var _rtmp3121 = input.readListBegin(); - var _size120 = _rtmp3121.size || 0; - for (var _i122 = 0; _i122 < _size120; ++_i122) { - var elem123 = null; - elem123 = []; - var _rtmp3125 = input.readListBegin(); - var _size124 = _rtmp3125.size || 0; - for (var _i126 = 0; _i126 < _size124; ++_i126) { - var elem127 = null; - elem127 = input.readString(); - elem123.push(elem127); - } - input.readListEnd(); - this.measurementsList.push(elem123); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.valuesList = []; - var _rtmp3129 = input.readListBegin(); - var _size128 = _rtmp3129.size || 0; - for (var _i130 = 0; _i130 < _size128; ++_i130) { - var elem131 = null; - elem131 = input.readBinary(); - this.valuesList.push(elem131); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.timestampsList = []; - var _rtmp3133 = input.readListBegin(); - var _size132 = _rtmp3133.size || 0; - for (var _i134 = 0; _i134 < _size132; ++_i134) { - var elem135 = null; - elem135 = input.readBinary(); - this.timestampsList.push(elem135); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.typesList = []; - var _rtmp3137 = input.readListBegin(); - var _size136 = _rtmp3137.size || 0; - for (var _i138 = 0; _i138 < _size136; ++_i138) { - var elem139 = null; - elem139 = []; - var _rtmp3141 = input.readListBegin(); - var _size140 = _rtmp3141.size || 0; - for (var _i142 = 0; _i142 < _size140; ++_i142) { - var elem143 = null; - elem143 = input.readI32(); - elem139.push(elem143); - } - input.readListEnd(); - this.typesList.push(elem139); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.LIST) { - this.sizeList = []; - var _rtmp3145 = input.readListBegin(); - var _size144 = _rtmp3145.size || 0; - for (var _i146 = 0; _i146 < _size144; ++_i146) { - var elem147 = null; - elem147 = input.readI32(); - this.sizeList.push(elem147); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertTabletsReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertTabletsReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPaths !== null && this.prefixPaths !== undefined) { - output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); - for (var iter148 in this.prefixPaths) { - if (this.prefixPaths.hasOwnProperty(iter148)) { - iter148 = this.prefixPaths[iter148]; - output.writeString(iter148); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.measurementsList !== null && this.measurementsList !== undefined) { - output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); - for (var iter149 in this.measurementsList) { - if (this.measurementsList.hasOwnProperty(iter149)) { - iter149 = this.measurementsList[iter149]; - output.writeListBegin(Thrift.Type.STRING, iter149.length); - for (var iter150 in iter149) { - if (iter149.hasOwnProperty(iter150)) { - iter150 = iter149[iter150]; - output.writeString(iter150); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valuesList !== null && this.valuesList !== undefined) { - output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); - for (var iter151 in this.valuesList) { - if (this.valuesList.hasOwnProperty(iter151)) { - iter151 = this.valuesList[iter151]; - output.writeBinary(iter151); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestampsList !== null && this.timestampsList !== undefined) { - output.writeFieldBegin('timestampsList', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.STRING, this.timestampsList.length); - for (var iter152 in this.timestampsList) { - if (this.timestampsList.hasOwnProperty(iter152)) { - iter152 = this.timestampsList[iter152]; - output.writeBinary(iter152); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.typesList !== null && this.typesList !== undefined) { - output.writeFieldBegin('typesList', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.LIST, this.typesList.length); - for (var iter153 in this.typesList) { - if (this.typesList.hasOwnProperty(iter153)) { - iter153 = this.typesList[iter153]; - output.writeListBegin(Thrift.Type.I32, iter153.length); - for (var iter154 in iter153) { - if (iter153.hasOwnProperty(iter154)) { - iter154 = iter153[iter154]; - output.writeI32(iter154); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.sizeList !== null && this.sizeList !== undefined) { - output.writeFieldBegin('sizeList', Thrift.Type.LIST, 7); - output.writeListBegin(Thrift.Type.I32, this.sizeList.length); - for (var iter155 in this.sizeList) { - if (this.sizeList.hasOwnProperty(iter155)) { - iter155 = this.sizeList[iter155]; - output.writeI32(iter155); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 8); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertRecordsReq = module.exports.TSInsertRecordsReq = function(args) { - this.sessionId = null; - this.prefixPaths = null; - this.measurementsList = null; - this.valuesList = null; - this.timestamps = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPaths !== undefined && args.prefixPaths !== null) { - this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); - } - if (args.measurementsList !== undefined && args.measurementsList !== null) { - this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); - } - if (args.valuesList !== undefined && args.valuesList !== null) { - this.valuesList = Thrift.copyList(args.valuesList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); - } - if (args.timestamps !== undefined && args.timestamps !== null) { - this.timestamps = Thrift.copyList(args.timestamps, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertRecordsReq.prototype = {}; -TSInsertRecordsReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.prefixPaths = []; - var _rtmp3157 = input.readListBegin(); - var _size156 = _rtmp3157.size || 0; - for (var _i158 = 0; _i158 < _size156; ++_i158) { - var elem159 = null; - elem159 = input.readString(); - this.prefixPaths.push(elem159); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurementsList = []; - var _rtmp3161 = input.readListBegin(); - var _size160 = _rtmp3161.size || 0; - for (var _i162 = 0; _i162 < _size160; ++_i162) { - var elem163 = null; - elem163 = []; - var _rtmp3165 = input.readListBegin(); - var _size164 = _rtmp3165.size || 0; - for (var _i166 = 0; _i166 < _size164; ++_i166) { - var elem167 = null; - elem167 = input.readString(); - elem163.push(elem167); - } - input.readListEnd(); - this.measurementsList.push(elem163); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.valuesList = []; - var _rtmp3169 = input.readListBegin(); - var _size168 = _rtmp3169.size || 0; - for (var _i170 = 0; _i170 < _size168; ++_i170) { - var elem171 = null; - elem171 = input.readBinary(); - this.valuesList.push(elem171); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.timestamps = []; - var _rtmp3173 = input.readListBegin(); - var _size172 = _rtmp3173.size || 0; - for (var _i174 = 0; _i174 < _size172; ++_i174) { - var elem175 = null; - elem175 = input.readI64(); - this.timestamps.push(elem175); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertRecordsReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertRecordsReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPaths !== null && this.prefixPaths !== undefined) { - output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); - for (var iter176 in this.prefixPaths) { - if (this.prefixPaths.hasOwnProperty(iter176)) { - iter176 = this.prefixPaths[iter176]; - output.writeString(iter176); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.measurementsList !== null && this.measurementsList !== undefined) { - output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); - for (var iter177 in this.measurementsList) { - if (this.measurementsList.hasOwnProperty(iter177)) { - iter177 = this.measurementsList[iter177]; - output.writeListBegin(Thrift.Type.STRING, iter177.length); - for (var iter178 in iter177) { - if (iter177.hasOwnProperty(iter178)) { - iter178 = iter177[iter178]; - output.writeString(iter178); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valuesList !== null && this.valuesList !== undefined) { - output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); - for (var iter179 in this.valuesList) { - if (this.valuesList.hasOwnProperty(iter179)) { - iter179 = this.valuesList[iter179]; - output.writeBinary(iter179); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestamps !== null && this.timestamps !== undefined) { - output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I64, this.timestamps.length); - for (var iter180 in this.timestamps) { - if (this.timestamps.hasOwnProperty(iter180)) { - iter180 = this.timestamps[iter180]; - output.writeI64(iter180); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertRecordsOfOneDeviceReq = module.exports.TSInsertRecordsOfOneDeviceReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurementsList = null; - this.valuesList = null; - this.timestamps = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurementsList !== undefined && args.measurementsList !== null) { - this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); - } - if (args.valuesList !== undefined && args.valuesList !== null) { - this.valuesList = Thrift.copyList(args.valuesList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); - } - if (args.timestamps !== undefined && args.timestamps !== null) { - this.timestamps = Thrift.copyList(args.timestamps, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertRecordsOfOneDeviceReq.prototype = {}; -TSInsertRecordsOfOneDeviceReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurementsList = []; - var _rtmp3182 = input.readListBegin(); - var _size181 = _rtmp3182.size || 0; - for (var _i183 = 0; _i183 < _size181; ++_i183) { - var elem184 = null; - elem184 = []; - var _rtmp3186 = input.readListBegin(); - var _size185 = _rtmp3186.size || 0; - for (var _i187 = 0; _i187 < _size185; ++_i187) { - var elem188 = null; - elem188 = input.readString(); - elem184.push(elem188); - } - input.readListEnd(); - this.measurementsList.push(elem184); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.valuesList = []; - var _rtmp3190 = input.readListBegin(); - var _size189 = _rtmp3190.size || 0; - for (var _i191 = 0; _i191 < _size189; ++_i191) { - var elem192 = null; - elem192 = input.readBinary(); - this.valuesList.push(elem192); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.timestamps = []; - var _rtmp3194 = input.readListBegin(); - var _size193 = _rtmp3194.size || 0; - for (var _i195 = 0; _i195 < _size193; ++_i195) { - var elem196 = null; - elem196 = input.readI64(); - this.timestamps.push(elem196); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertRecordsOfOneDeviceReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertRecordsOfOneDeviceReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurementsList !== null && this.measurementsList !== undefined) { - output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); - for (var iter197 in this.measurementsList) { - if (this.measurementsList.hasOwnProperty(iter197)) { - iter197 = this.measurementsList[iter197]; - output.writeListBegin(Thrift.Type.STRING, iter197.length); - for (var iter198 in iter197) { - if (iter197.hasOwnProperty(iter198)) { - iter198 = iter197[iter198]; - output.writeString(iter198); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valuesList !== null && this.valuesList !== undefined) { - output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.valuesList.length); - for (var iter199 in this.valuesList) { - if (this.valuesList.hasOwnProperty(iter199)) { - iter199 = this.valuesList[iter199]; - output.writeBinary(iter199); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestamps !== null && this.timestamps !== undefined) { - output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I64, this.timestamps.length); - for (var iter200 in this.timestamps) { - if (this.timestamps.hasOwnProperty(iter200)) { - iter200 = this.timestamps[iter200]; - output.writeI64(iter200); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertStringRecordsOfOneDeviceReq = module.exports.TSInsertStringRecordsOfOneDeviceReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurementsList = null; - this.valuesList = null; - this.timestamps = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurementsList !== undefined && args.measurementsList !== null) { - this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); - } - if (args.valuesList !== undefined && args.valuesList !== null) { - this.valuesList = Thrift.copyList(args.valuesList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); - } - if (args.timestamps !== undefined && args.timestamps !== null) { - this.timestamps = Thrift.copyList(args.timestamps, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertStringRecordsOfOneDeviceReq.prototype = {}; -TSInsertStringRecordsOfOneDeviceReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurementsList = []; - var _rtmp3202 = input.readListBegin(); - var _size201 = _rtmp3202.size || 0; - for (var _i203 = 0; _i203 < _size201; ++_i203) { - var elem204 = null; - elem204 = []; - var _rtmp3206 = input.readListBegin(); - var _size205 = _rtmp3206.size || 0; - for (var _i207 = 0; _i207 < _size205; ++_i207) { - var elem208 = null; - elem208 = input.readString(); - elem204.push(elem208); - } - input.readListEnd(); - this.measurementsList.push(elem204); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.valuesList = []; - var _rtmp3210 = input.readListBegin(); - var _size209 = _rtmp3210.size || 0; - for (var _i211 = 0; _i211 < _size209; ++_i211) { - var elem212 = null; - elem212 = []; - var _rtmp3214 = input.readListBegin(); - var _size213 = _rtmp3214.size || 0; - for (var _i215 = 0; _i215 < _size213; ++_i215) { - var elem216 = null; - elem216 = input.readString(); - elem212.push(elem216); - } - input.readListEnd(); - this.valuesList.push(elem212); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.timestamps = []; - var _rtmp3218 = input.readListBegin(); - var _size217 = _rtmp3218.size || 0; - for (var _i219 = 0; _i219 < _size217; ++_i219) { - var elem220 = null; - elem220 = input.readI64(); - this.timestamps.push(elem220); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertStringRecordsOfOneDeviceReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertStringRecordsOfOneDeviceReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurementsList !== null && this.measurementsList !== undefined) { - output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); - for (var iter221 in this.measurementsList) { - if (this.measurementsList.hasOwnProperty(iter221)) { - iter221 = this.measurementsList[iter221]; - output.writeListBegin(Thrift.Type.STRING, iter221.length); - for (var iter222 in iter221) { - if (iter221.hasOwnProperty(iter222)) { - iter222 = iter221[iter222]; - output.writeString(iter222); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valuesList !== null && this.valuesList !== undefined) { - output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.LIST, this.valuesList.length); - for (var iter223 in this.valuesList) { - if (this.valuesList.hasOwnProperty(iter223)) { - iter223 = this.valuesList[iter223]; - output.writeListBegin(Thrift.Type.STRING, iter223.length); - for (var iter224 in iter223) { - if (iter223.hasOwnProperty(iter224)) { - iter224 = iter223[iter224]; - output.writeString(iter224); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestamps !== null && this.timestamps !== undefined) { - output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I64, this.timestamps.length); - for (var iter225 in this.timestamps) { - if (this.timestamps.hasOwnProperty(iter225)) { - iter225 = this.timestamps[iter225]; - output.writeI64(iter225); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSInsertStringRecordsReq = module.exports.TSInsertStringRecordsReq = function(args) { - this.sessionId = null; - this.prefixPaths = null; - this.measurementsList = null; - this.valuesList = null; - this.timestamps = null; - this.isAligned = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPaths !== undefined && args.prefixPaths !== null) { - this.prefixPaths = Thrift.copyList(args.prefixPaths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPaths is unset!'); - } - if (args.measurementsList !== undefined && args.measurementsList !== null) { - this.measurementsList = Thrift.copyList(args.measurementsList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurementsList is unset!'); - } - if (args.valuesList !== undefined && args.valuesList !== null) { - this.valuesList = Thrift.copyList(args.valuesList, [Thrift.copyList, null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field valuesList is unset!'); - } - if (args.timestamps !== undefined && args.timestamps !== null) { - this.timestamps = Thrift.copyList(args.timestamps, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestamps is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } - } -}; -TSInsertStringRecordsReq.prototype = {}; -TSInsertStringRecordsReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.prefixPaths = []; - var _rtmp3227 = input.readListBegin(); - var _size226 = _rtmp3227.size || 0; - for (var _i228 = 0; _i228 < _size226; ++_i228) { - var elem229 = null; - elem229 = input.readString(); - this.prefixPaths.push(elem229); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurementsList = []; - var _rtmp3231 = input.readListBegin(); - var _size230 = _rtmp3231.size || 0; - for (var _i232 = 0; _i232 < _size230; ++_i232) { - var elem233 = null; - elem233 = []; - var _rtmp3235 = input.readListBegin(); - var _size234 = _rtmp3235.size || 0; - for (var _i236 = 0; _i236 < _size234; ++_i236) { - var elem237 = null; - elem237 = input.readString(); - elem233.push(elem237); - } - input.readListEnd(); - this.measurementsList.push(elem233); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.valuesList = []; - var _rtmp3239 = input.readListBegin(); - var _size238 = _rtmp3239.size || 0; - for (var _i240 = 0; _i240 < _size238; ++_i240) { - var elem241 = null; - elem241 = []; - var _rtmp3243 = input.readListBegin(); - var _size242 = _rtmp3243.size || 0; - for (var _i244 = 0; _i244 < _size242; ++_i244) { - var elem245 = null; - elem245 = input.readString(); - elem241.push(elem245); - } - input.readListEnd(); - this.valuesList.push(elem241); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.timestamps = []; - var _rtmp3247 = input.readListBegin(); - var _size246 = _rtmp3247.size || 0; - for (var _i248 = 0; _i248 < _size246; ++_i248) { - var elem249 = null; - elem249 = input.readI64(); - this.timestamps.push(elem249); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSInsertStringRecordsReq.prototype.write = function(output) { - output.writeStructBegin('TSInsertStringRecordsReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPaths !== null && this.prefixPaths !== undefined) { - output.writeFieldBegin('prefixPaths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.prefixPaths.length); - for (var iter250 in this.prefixPaths) { - if (this.prefixPaths.hasOwnProperty(iter250)) { - iter250 = this.prefixPaths[iter250]; - output.writeString(iter250); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.measurementsList !== null && this.measurementsList !== undefined) { - output.writeFieldBegin('measurementsList', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.LIST, this.measurementsList.length); - for (var iter251 in this.measurementsList) { - if (this.measurementsList.hasOwnProperty(iter251)) { - iter251 = this.measurementsList[iter251]; - output.writeListBegin(Thrift.Type.STRING, iter251.length); - for (var iter252 in iter251) { - if (iter251.hasOwnProperty(iter252)) { - iter252 = iter251[iter252]; - output.writeString(iter252); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.valuesList !== null && this.valuesList !== undefined) { - output.writeFieldBegin('valuesList', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.LIST, this.valuesList.length); - for (var iter253 in this.valuesList) { - if (this.valuesList.hasOwnProperty(iter253)) { - iter253 = this.valuesList[iter253]; - output.writeListBegin(Thrift.Type.STRING, iter253.length); - for (var iter254 in iter253) { - if (iter253.hasOwnProperty(iter254)) { - iter254 = iter253[iter254]; - output.writeString(iter254); - } - } - output.writeListEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestamps !== null && this.timestamps !== undefined) { - output.writeFieldBegin('timestamps', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I64, this.timestamps.length); - for (var iter255 in this.timestamps) { - if (this.timestamps.hasOwnProperty(iter255)) { - iter255 = this.timestamps[iter255]; - output.writeI64(iter255); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 6); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSDeleteDataReq = module.exports.TSDeleteDataReq = function(args) { - this.sessionId = null; - this.paths = null; - this.startTime = null; - this.endTime = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - if (args.startTime !== undefined && args.startTime !== null) { - this.startTime = args.startTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); - } - if (args.endTime !== undefined && args.endTime !== null) { - this.endTime = args.endTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endTime is unset!'); - } - } -}; -TSDeleteDataReq.prototype = {}; -TSDeleteDataReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp3257 = input.readListBegin(); - var _size256 = _rtmp3257.size || 0; - for (var _i258 = 0; _i258 < _size256; ++_i258) { - var elem259 = null; - elem259 = input.readString(); - this.paths.push(elem259); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I64) { - this.startTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I64) { - this.endTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSDeleteDataReq.prototype.write = function(output) { - output.writeStructBegin('TSDeleteDataReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter260 in this.paths) { - if (this.paths.hasOwnProperty(iter260)) { - iter260 = this.paths[iter260]; - output.writeString(iter260); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.startTime !== null && this.startTime !== undefined) { - output.writeFieldBegin('startTime', Thrift.Type.I64, 3); - output.writeI64(this.startTime); - output.writeFieldEnd(); - } - if (this.endTime !== null && this.endTime !== undefined) { - output.writeFieldBegin('endTime', Thrift.Type.I64, 4); - output.writeI64(this.endTime); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCreateTimeseriesReq = module.exports.TSCreateTimeseriesReq = function(args) { - this.sessionId = null; - this.path = null; - this.dataType = null; - this.encoding = null; - this.compressor = null; - this.props = null; - this.tags = null; - this.attributes = null; - this.measurementAlias = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.path !== undefined && args.path !== null) { - this.path = args.path; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field path is unset!'); - } - if (args.dataType !== undefined && args.dataType !== null) { - this.dataType = args.dataType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataType is unset!'); - } - if (args.encoding !== undefined && args.encoding !== null) { - this.encoding = args.encoding; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encoding is unset!'); - } - if (args.compressor !== undefined && args.compressor !== null) { - this.compressor = args.compressor; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressor is unset!'); - } - if (args.props !== undefined && args.props !== null) { - this.props = Thrift.copyMap(args.props, [null]); - } - if (args.tags !== undefined && args.tags !== null) { - this.tags = Thrift.copyMap(args.tags, [null]); - } - if (args.attributes !== undefined && args.attributes !== null) { - this.attributes = Thrift.copyMap(args.attributes, [null]); - } - if (args.measurementAlias !== undefined && args.measurementAlias !== null) { - this.measurementAlias = args.measurementAlias; - } - } -}; -TSCreateTimeseriesReq.prototype = {}; -TSCreateTimeseriesReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.path = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.dataType = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.encoding = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.compressor = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.MAP) { - this.props = {}; - var _rtmp3262 = input.readMapBegin(); - var _size261 = _rtmp3262.size || 0; - for (var _i263 = 0; _i263 < _size261; ++_i263) { - var key264 = null; - var val265 = null; - key264 = input.readString(); - val265 = input.readString(); - this.props[key264] = val265; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.MAP) { - this.tags = {}; - var _rtmp3267 = input.readMapBegin(); - var _size266 = _rtmp3267.size || 0; - for (var _i268 = 0; _i268 < _size266; ++_i268) { - var key269 = null; - var val270 = null; - key269 = input.readString(); - val270 = input.readString(); - this.tags[key269] = val270; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.MAP) { - this.attributes = {}; - var _rtmp3272 = input.readMapBegin(); - var _size271 = _rtmp3272.size || 0; - for (var _i273 = 0; _i273 < _size271; ++_i273) { - var key274 = null; - var val275 = null; - key274 = input.readString(); - val275 = input.readString(); - this.attributes[key274] = val275; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.STRING) { - this.measurementAlias = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCreateTimeseriesReq.prototype.write = function(output) { - output.writeStructBegin('TSCreateTimeseriesReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.path !== null && this.path !== undefined) { - output.writeFieldBegin('path', Thrift.Type.STRING, 2); - output.writeString(this.path); - output.writeFieldEnd(); - } - if (this.dataType !== null && this.dataType !== undefined) { - output.writeFieldBegin('dataType', Thrift.Type.I32, 3); - output.writeI32(this.dataType); - output.writeFieldEnd(); - } - if (this.encoding !== null && this.encoding !== undefined) { - output.writeFieldBegin('encoding', Thrift.Type.I32, 4); - output.writeI32(this.encoding); - output.writeFieldEnd(); - } - if (this.compressor !== null && this.compressor !== undefined) { - output.writeFieldBegin('compressor', Thrift.Type.I32, 5); - output.writeI32(this.compressor); - output.writeFieldEnd(); - } - if (this.props !== null && this.props !== undefined) { - output.writeFieldBegin('props', Thrift.Type.MAP, 6); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.props)); - for (var kiter276 in this.props) { - if (this.props.hasOwnProperty(kiter276)) { - var viter277 = this.props[kiter276]; - output.writeString(kiter276); - output.writeString(viter277); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.tags !== null && this.tags !== undefined) { - output.writeFieldBegin('tags', Thrift.Type.MAP, 7); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.tags)); - for (var kiter278 in this.tags) { - if (this.tags.hasOwnProperty(kiter278)) { - var viter279 = this.tags[kiter278]; - output.writeString(kiter278); - output.writeString(viter279); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.attributes !== null && this.attributes !== undefined) { - output.writeFieldBegin('attributes', Thrift.Type.MAP, 8); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.attributes)); - for (var kiter280 in this.attributes) { - if (this.attributes.hasOwnProperty(kiter280)) { - var viter281 = this.attributes[kiter280]; - output.writeString(kiter280); - output.writeString(viter281); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.measurementAlias !== null && this.measurementAlias !== undefined) { - output.writeFieldBegin('measurementAlias', Thrift.Type.STRING, 9); - output.writeString(this.measurementAlias); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCreateAlignedTimeseriesReq = module.exports.TSCreateAlignedTimeseriesReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.measurements = null; - this.dataTypes = null; - this.encodings = null; - this.compressors = null; - this.measurementAlias = null; - this.tagsList = null; - this.attributesList = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); - } - if (args.dataTypes !== undefined && args.dataTypes !== null) { - this.dataTypes = Thrift.copyList(args.dataTypes, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); - } - if (args.encodings !== undefined && args.encodings !== null) { - this.encodings = Thrift.copyList(args.encodings, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); - } - if (args.compressors !== undefined && args.compressors !== null) { - this.compressors = Thrift.copyList(args.compressors, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); - } - if (args.measurementAlias !== undefined && args.measurementAlias !== null) { - this.measurementAlias = Thrift.copyList(args.measurementAlias, [null]); - } - if (args.tagsList !== undefined && args.tagsList !== null) { - this.tagsList = Thrift.copyList(args.tagsList, [Thrift.copyMap, null]); - } - if (args.attributesList !== undefined && args.attributesList !== null) { - this.attributesList = Thrift.copyList(args.attributesList, [Thrift.copyMap, null]); - } - } -}; -TSCreateAlignedTimeseriesReq.prototype = {}; -TSCreateAlignedTimeseriesReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp3283 = input.readListBegin(); - var _size282 = _rtmp3283.size || 0; - for (var _i284 = 0; _i284 < _size282; ++_i284) { - var elem285 = null; - elem285 = input.readString(); - this.measurements.push(elem285); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.dataTypes = []; - var _rtmp3287 = input.readListBegin(); - var _size286 = _rtmp3287.size || 0; - for (var _i288 = 0; _i288 < _size286; ++_i288) { - var elem289 = null; - elem289 = input.readI32(); - this.dataTypes.push(elem289); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.encodings = []; - var _rtmp3291 = input.readListBegin(); - var _size290 = _rtmp3291.size || 0; - for (var _i292 = 0; _i292 < _size290; ++_i292) { - var elem293 = null; - elem293 = input.readI32(); - this.encodings.push(elem293); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.compressors = []; - var _rtmp3295 = input.readListBegin(); - var _size294 = _rtmp3295.size || 0; - for (var _i296 = 0; _i296 < _size294; ++_i296) { - var elem297 = null; - elem297 = input.readI32(); - this.compressors.push(elem297); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.LIST) { - this.measurementAlias = []; - var _rtmp3299 = input.readListBegin(); - var _size298 = _rtmp3299.size || 0; - for (var _i300 = 0; _i300 < _size298; ++_i300) { - var elem301 = null; - elem301 = input.readString(); - this.measurementAlias.push(elem301); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.LIST) { - this.tagsList = []; - var _rtmp3303 = input.readListBegin(); - var _size302 = _rtmp3303.size || 0; - for (var _i304 = 0; _i304 < _size302; ++_i304) { - var elem305 = null; - elem305 = {}; - var _rtmp3307 = input.readMapBegin(); - var _size306 = _rtmp3307.size || 0; - for (var _i308 = 0; _i308 < _size306; ++_i308) { - var key309 = null; - var val310 = null; - key309 = input.readString(); - val310 = input.readString(); - elem305[key309] = val310; - } - input.readMapEnd(); - this.tagsList.push(elem305); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.LIST) { - this.attributesList = []; - var _rtmp3312 = input.readListBegin(); - var _size311 = _rtmp3312.size || 0; - for (var _i313 = 0; _i313 < _size311; ++_i313) { - var elem314 = null; - elem314 = {}; - var _rtmp3316 = input.readMapBegin(); - var _size315 = _rtmp3316.size || 0; - for (var _i317 = 0; _i317 < _size315; ++_i317) { - var key318 = null; - var val319 = null; - key318 = input.readString(); - val319 = input.readString(); - elem314[key318] = val319; - } - input.readMapEnd(); - this.attributesList.push(elem314); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCreateAlignedTimeseriesReq.prototype.write = function(output) { - output.writeStructBegin('TSCreateAlignedTimeseriesReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter320 in this.measurements) { - if (this.measurements.hasOwnProperty(iter320)) { - iter320 = this.measurements[iter320]; - output.writeString(iter320); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.dataTypes !== null && this.dataTypes !== undefined) { - output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); - for (var iter321 in this.dataTypes) { - if (this.dataTypes.hasOwnProperty(iter321)) { - iter321 = this.dataTypes[iter321]; - output.writeI32(iter321); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.encodings !== null && this.encodings !== undefined) { - output.writeFieldBegin('encodings', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I32, this.encodings.length); - for (var iter322 in this.encodings) { - if (this.encodings.hasOwnProperty(iter322)) { - iter322 = this.encodings[iter322]; - output.writeI32(iter322); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.compressors !== null && this.compressors !== undefined) { - output.writeFieldBegin('compressors', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.I32, this.compressors.length); - for (var iter323 in this.compressors) { - if (this.compressors.hasOwnProperty(iter323)) { - iter323 = this.compressors[iter323]; - output.writeI32(iter323); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.measurementAlias !== null && this.measurementAlias !== undefined) { - output.writeFieldBegin('measurementAlias', Thrift.Type.LIST, 7); - output.writeListBegin(Thrift.Type.STRING, this.measurementAlias.length); - for (var iter324 in this.measurementAlias) { - if (this.measurementAlias.hasOwnProperty(iter324)) { - iter324 = this.measurementAlias[iter324]; - output.writeString(iter324); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.tagsList !== null && this.tagsList !== undefined) { - output.writeFieldBegin('tagsList', Thrift.Type.LIST, 8); - output.writeListBegin(Thrift.Type.MAP, this.tagsList.length); - for (var iter325 in this.tagsList) { - if (this.tagsList.hasOwnProperty(iter325)) { - iter325 = this.tagsList[iter325]; - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter325)); - for (var kiter326 in iter325) { - if (iter325.hasOwnProperty(kiter326)) { - var viter327 = iter325[kiter326]; - output.writeString(kiter326); - output.writeString(viter327); - } - } - output.writeMapEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.attributesList !== null && this.attributesList !== undefined) { - output.writeFieldBegin('attributesList', Thrift.Type.LIST, 9); - output.writeListBegin(Thrift.Type.MAP, this.attributesList.length); - for (var iter328 in this.attributesList) { - if (this.attributesList.hasOwnProperty(iter328)) { - iter328 = this.attributesList[iter328]; - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter328)); - for (var kiter329 in iter328) { - if (iter328.hasOwnProperty(kiter329)) { - var viter330 = iter328[kiter329]; - output.writeString(kiter329); - output.writeString(viter330); - } - } - output.writeMapEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSRawDataQueryReq = module.exports.TSRawDataQueryReq = function(args) { - this.sessionId = null; - this.paths = null; - this.fetchSize = null; - this.startTime = null; - this.endTime = null; - this.statementId = null; - this.enableRedirectQuery = null; - this.jdbcQuery = null; - this.timeout = null; - this.legalPathNodes = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.startTime !== undefined && args.startTime !== null) { - this.startTime = args.startTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); - } - if (args.endTime !== undefined && args.endTime !== null) { - this.endTime = args.endTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endTime is unset!'); - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { - this.enableRedirectQuery = args.enableRedirectQuery; - } - if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { - this.jdbcQuery = args.jdbcQuery; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { - this.legalPathNodes = args.legalPathNodes; - } - } -}; -TSRawDataQueryReq.prototype = {}; -TSRawDataQueryReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp3332 = input.readListBegin(); - var _size331 = _rtmp3332.size || 0; - for (var _i333 = 0; _i333 < _size331; ++_i333) { - var elem334 = null; - elem334 = input.readString(); - this.paths.push(elem334); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I64) { - this.startTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.endTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.BOOL) { - this.enableRedirectQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.BOOL) { - this.jdbcQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.BOOL) { - this.legalPathNodes = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSRawDataQueryReq.prototype.write = function(output) { - output.writeStructBegin('TSRawDataQueryReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter335 in this.paths) { - if (this.paths.hasOwnProperty(iter335)) { - iter335 = this.paths[iter335]; - output.writeString(iter335); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.startTime !== null && this.startTime !== undefined) { - output.writeFieldBegin('startTime', Thrift.Type.I64, 4); - output.writeI64(this.startTime); - output.writeFieldEnd(); - } - if (this.endTime !== null && this.endTime !== undefined) { - output.writeFieldBegin('endTime', Thrift.Type.I64, 5); - output.writeI64(this.endTime); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 6); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { - output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 7); - output.writeBool(this.enableRedirectQuery); - output.writeFieldEnd(); - } - if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { - output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 8); - output.writeBool(this.jdbcQuery); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 9); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { - output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 10); - output.writeBool(this.legalPathNodes); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSLastDataQueryReq = module.exports.TSLastDataQueryReq = function(args) { - this.sessionId = null; - this.paths = null; - this.fetchSize = null; - this.time = null; - this.statementId = null; - this.enableRedirectQuery = null; - this.jdbcQuery = null; - this.timeout = null; - this.legalPathNodes = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.time !== undefined && args.time !== null) { - this.time = args.time; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field time is unset!'); - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { - this.enableRedirectQuery = args.enableRedirectQuery; - } - if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { - this.jdbcQuery = args.jdbcQuery; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { - this.legalPathNodes = args.legalPathNodes; - } - } -}; -TSLastDataQueryReq.prototype = {}; -TSLastDataQueryReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp3337 = input.readListBegin(); - var _size336 = _rtmp3337.size || 0; - for (var _i338 = 0; _i338 < _size336; ++_i338) { - var elem339 = null; - elem339 = input.readString(); - this.paths.push(elem339); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I64) { - this.time = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.enableRedirectQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.BOOL) { - this.jdbcQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.BOOL) { - this.legalPathNodes = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSLastDataQueryReq.prototype.write = function(output) { - output.writeStructBegin('TSLastDataQueryReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter340 in this.paths) { - if (this.paths.hasOwnProperty(iter340)) { - iter340 = this.paths[iter340]; - output.writeString(iter340); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 3); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.time !== null && this.time !== undefined) { - output.writeFieldBegin('time', Thrift.Type.I64, 4); - output.writeI64(this.time); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 5); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { - output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 6); - output.writeBool(this.enableRedirectQuery); - output.writeFieldEnd(); - } - if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { - output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 7); - output.writeBool(this.jdbcQuery); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 8); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { - output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 9); - output.writeBool(this.legalPathNodes); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSFastLastDataQueryForOneDeviceReq = module.exports.TSFastLastDataQueryForOneDeviceReq = function(args) { - this.sessionId = null; - this.db = null; - this.deviceId = null; - this.sensors = null; - this.fetchSize = null; - this.statementId = null; - this.enableRedirectQuery = null; - this.jdbcQuery = null; - this.timeout = null; - this.legalPathNodes = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.db !== undefined && args.db !== null) { - this.db = args.db; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field db is unset!'); - } - if (args.deviceId !== undefined && args.deviceId !== null) { - this.deviceId = args.deviceId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field deviceId is unset!'); - } - if (args.sensors !== undefined && args.sensors !== null) { - this.sensors = Thrift.copyList(args.sensors, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sensors is unset!'); - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.enableRedirectQuery !== undefined && args.enableRedirectQuery !== null) { - this.enableRedirectQuery = args.enableRedirectQuery; - } - if (args.jdbcQuery !== undefined && args.jdbcQuery !== null) { - this.jdbcQuery = args.jdbcQuery; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { - this.legalPathNodes = args.legalPathNodes; - } - } -}; -TSFastLastDataQueryForOneDeviceReq.prototype = {}; -TSFastLastDataQueryForOneDeviceReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.db = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.deviceId = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.sensors = []; - var _rtmp3342 = input.readListBegin(); - var _size341 = _rtmp3342.size || 0; - for (var _i343 = 0; _i343 < _size341; ++_i343) { - var elem344 = null; - elem344 = input.readString(); - this.sensors.push(elem344); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.BOOL) { - this.enableRedirectQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.BOOL) { - this.jdbcQuery = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.BOOL) { - this.legalPathNodes = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSFastLastDataQueryForOneDeviceReq.prototype.write = function(output) { - output.writeStructBegin('TSFastLastDataQueryForOneDeviceReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.db !== null && this.db !== undefined) { - output.writeFieldBegin('db', Thrift.Type.STRING, 2); - output.writeString(this.db); - output.writeFieldEnd(); - } - if (this.deviceId !== null && this.deviceId !== undefined) { - output.writeFieldBegin('deviceId', Thrift.Type.STRING, 3); - output.writeString(this.deviceId); - output.writeFieldEnd(); - } - if (this.sensors !== null && this.sensors !== undefined) { - output.writeFieldBegin('sensors', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.sensors.length); - for (var iter345 in this.sensors) { - if (this.sensors.hasOwnProperty(iter345)) { - iter345 = this.sensors[iter345]; - output.writeString(iter345); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 5); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 6); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.enableRedirectQuery !== null && this.enableRedirectQuery !== undefined) { - output.writeFieldBegin('enableRedirectQuery', Thrift.Type.BOOL, 7); - output.writeBool(this.enableRedirectQuery); - output.writeFieldEnd(); - } - if (this.jdbcQuery !== null && this.jdbcQuery !== undefined) { - output.writeFieldBegin('jdbcQuery', Thrift.Type.BOOL, 8); - output.writeBool(this.jdbcQuery); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 9); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { - output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 10); - output.writeBool(this.legalPathNodes); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSAggregationQueryReq = module.exports.TSAggregationQueryReq = function(args) { - this.sessionId = null; - this.statementId = null; - this.paths = null; - this.aggregations = null; - this.startTime = null; - this.endTime = null; - this.interval = null; - this.slidingStep = null; - this.fetchSize = null; - this.timeout = null; - this.legalPathNodes = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - if (args.aggregations !== undefined && args.aggregations !== null) { - this.aggregations = Thrift.copyList(args.aggregations, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field aggregations is unset!'); - } - if (args.startTime !== undefined && args.startTime !== null) { - this.startTime = args.startTime; - } - if (args.endTime !== undefined && args.endTime !== null) { - this.endTime = args.endTime; - } - if (args.interval !== undefined && args.interval !== null) { - this.interval = args.interval; - } - if (args.slidingStep !== undefined && args.slidingStep !== null) { - this.slidingStep = args.slidingStep; - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - if (args.legalPathNodes !== undefined && args.legalPathNodes !== null) { - this.legalPathNodes = args.legalPathNodes; - } - } -}; -TSAggregationQueryReq.prototype = {}; -TSAggregationQueryReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp3347 = input.readListBegin(); - var _size346 = _rtmp3347.size || 0; - for (var _i348 = 0; _i348 < _size346; ++_i348) { - var elem349 = null; - elem349 = input.readString(); - this.paths.push(elem349); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.aggregations = []; - var _rtmp3351 = input.readListBegin(); - var _size350 = _rtmp3351.size || 0; - for (var _i352 = 0; _i352 < _size350; ++_i352) { - var elem353 = null; - elem353 = input.readI32(); - this.aggregations.push(elem353); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I64) { - this.startTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I64) { - this.endTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.I64) { - this.interval = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.I64) { - this.slidingStep = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 11: - if (ftype == Thrift.Type.BOOL) { - this.legalPathNodes = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSAggregationQueryReq.prototype.write = function(output) { - output.writeStructBegin('TSAggregationQueryReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 2); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter354 in this.paths) { - if (this.paths.hasOwnProperty(iter354)) { - iter354 = this.paths[iter354]; - output.writeString(iter354); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.aggregations !== null && this.aggregations !== undefined) { - output.writeFieldBegin('aggregations', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.I32, this.aggregations.length); - for (var iter355 in this.aggregations) { - if (this.aggregations.hasOwnProperty(iter355)) { - iter355 = this.aggregations[iter355]; - output.writeI32(iter355); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.startTime !== null && this.startTime !== undefined) { - output.writeFieldBegin('startTime', Thrift.Type.I64, 5); - output.writeI64(this.startTime); - output.writeFieldEnd(); - } - if (this.endTime !== null && this.endTime !== undefined) { - output.writeFieldBegin('endTime', Thrift.Type.I64, 6); - output.writeI64(this.endTime); - output.writeFieldEnd(); - } - if (this.interval !== null && this.interval !== undefined) { - output.writeFieldBegin('interval', Thrift.Type.I64, 7); - output.writeI64(this.interval); - output.writeFieldEnd(); - } - if (this.slidingStep !== null && this.slidingStep !== undefined) { - output.writeFieldBegin('slidingStep', Thrift.Type.I64, 8); - output.writeI64(this.slidingStep); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 9); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 10); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - if (this.legalPathNodes !== null && this.legalPathNodes !== undefined) { - output.writeFieldBegin('legalPathNodes', Thrift.Type.BOOL, 11); - output.writeBool(this.legalPathNodes); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSGroupByQueryIntervalReq = module.exports.TSGroupByQueryIntervalReq = function(args) { - this.sessionId = null; - this.statementId = null; - this.device = null; - this.measurement = null; - this.dataType = null; - this.aggregationType = null; - this.database = null; - this.startTime = null; - this.endTime = null; - this.interval = null; - this.fetchSize = null; - this.timeout = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.statementId !== undefined && args.statementId !== null) { - this.statementId = args.statementId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field statementId is unset!'); - } - if (args.device !== undefined && args.device !== null) { - this.device = args.device; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field device is unset!'); - } - if (args.measurement !== undefined && args.measurement !== null) { - this.measurement = args.measurement; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurement is unset!'); - } - if (args.dataType !== undefined && args.dataType !== null) { - this.dataType = args.dataType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataType is unset!'); - } - if (args.aggregationType !== undefined && args.aggregationType !== null) { - this.aggregationType = args.aggregationType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field aggregationType is unset!'); - } - if (args.database !== undefined && args.database !== null) { - this.database = args.database; - } - if (args.startTime !== undefined && args.startTime !== null) { - this.startTime = args.startTime; - } - if (args.endTime !== undefined && args.endTime !== null) { - this.endTime = args.endTime; - } - if (args.interval !== undefined && args.interval !== null) { - this.interval = args.interval; - } - if (args.fetchSize !== undefined && args.fetchSize !== null) { - this.fetchSize = args.fetchSize; - } - if (args.timeout !== undefined && args.timeout !== null) { - this.timeout = args.timeout; - } - } -}; -TSGroupByQueryIntervalReq.prototype = {}; -TSGroupByQueryIntervalReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.statementId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.device = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.measurement = input.readString(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.dataType = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I32) { - this.aggregationType = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.STRING) { - this.database = input.readString(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.I64) { - this.startTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I64) { - this.endTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 10: - if (ftype == Thrift.Type.I64) { - this.interval = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 11: - if (ftype == Thrift.Type.I32) { - this.fetchSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 12: - if (ftype == Thrift.Type.I64) { - this.timeout = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSGroupByQueryIntervalReq.prototype.write = function(output) { - output.writeStructBegin('TSGroupByQueryIntervalReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.statementId !== null && this.statementId !== undefined) { - output.writeFieldBegin('statementId', Thrift.Type.I64, 2); - output.writeI64(this.statementId); - output.writeFieldEnd(); - } - if (this.device !== null && this.device !== undefined) { - output.writeFieldBegin('device', Thrift.Type.STRING, 3); - output.writeString(this.device); - output.writeFieldEnd(); - } - if (this.measurement !== null && this.measurement !== undefined) { - output.writeFieldBegin('measurement', Thrift.Type.STRING, 4); - output.writeString(this.measurement); - output.writeFieldEnd(); - } - if (this.dataType !== null && this.dataType !== undefined) { - output.writeFieldBegin('dataType', Thrift.Type.I32, 5); - output.writeI32(this.dataType); - output.writeFieldEnd(); - } - if (this.aggregationType !== null && this.aggregationType !== undefined) { - output.writeFieldBegin('aggregationType', Thrift.Type.I32, 6); - output.writeI32(this.aggregationType); - output.writeFieldEnd(); - } - if (this.database !== null && this.database !== undefined) { - output.writeFieldBegin('database', Thrift.Type.STRING, 7); - output.writeString(this.database); - output.writeFieldEnd(); - } - if (this.startTime !== null && this.startTime !== undefined) { - output.writeFieldBegin('startTime', Thrift.Type.I64, 8); - output.writeI64(this.startTime); - output.writeFieldEnd(); - } - if (this.endTime !== null && this.endTime !== undefined) { - output.writeFieldBegin('endTime', Thrift.Type.I64, 9); - output.writeI64(this.endTime); - output.writeFieldEnd(); - } - if (this.interval !== null && this.interval !== undefined) { - output.writeFieldBegin('interval', Thrift.Type.I64, 10); - output.writeI64(this.interval); - output.writeFieldEnd(); - } - if (this.fetchSize !== null && this.fetchSize !== undefined) { - output.writeFieldBegin('fetchSize', Thrift.Type.I32, 11); - output.writeI32(this.fetchSize); - output.writeFieldEnd(); - } - if (this.timeout !== null && this.timeout !== undefined) { - output.writeFieldBegin('timeout', Thrift.Type.I64, 12); - output.writeI64(this.timeout); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCreateMultiTimeseriesReq = module.exports.TSCreateMultiTimeseriesReq = function(args) { - this.sessionId = null; - this.paths = null; - this.dataTypes = null; - this.encodings = null; - this.compressors = null; - this.propsList = null; - this.tagsList = null; - this.attributesList = null; - this.measurementAliasList = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - if (args.dataTypes !== undefined && args.dataTypes !== null) { - this.dataTypes = Thrift.copyList(args.dataTypes, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); - } - if (args.encodings !== undefined && args.encodings !== null) { - this.encodings = Thrift.copyList(args.encodings, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); - } - if (args.compressors !== undefined && args.compressors !== null) { - this.compressors = Thrift.copyList(args.compressors, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); - } - if (args.propsList !== undefined && args.propsList !== null) { - this.propsList = Thrift.copyList(args.propsList, [Thrift.copyMap, null]); - } - if (args.tagsList !== undefined && args.tagsList !== null) { - this.tagsList = Thrift.copyList(args.tagsList, [Thrift.copyMap, null]); - } - if (args.attributesList !== undefined && args.attributesList !== null) { - this.attributesList = Thrift.copyList(args.attributesList, [Thrift.copyMap, null]); - } - if (args.measurementAliasList !== undefined && args.measurementAliasList !== null) { - this.measurementAliasList = Thrift.copyList(args.measurementAliasList, [null]); - } - } -}; -TSCreateMultiTimeseriesReq.prototype = {}; -TSCreateMultiTimeseriesReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp3357 = input.readListBegin(); - var _size356 = _rtmp3357.size || 0; - for (var _i358 = 0; _i358 < _size356; ++_i358) { - var elem359 = null; - elem359 = input.readString(); - this.paths.push(elem359); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.dataTypes = []; - var _rtmp3361 = input.readListBegin(); - var _size360 = _rtmp3361.size || 0; - for (var _i362 = 0; _i362 < _size360; ++_i362) { - var elem363 = null; - elem363 = input.readI32(); - this.dataTypes.push(elem363); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.encodings = []; - var _rtmp3365 = input.readListBegin(); - var _size364 = _rtmp3365.size || 0; - for (var _i366 = 0; _i366 < _size364; ++_i366) { - var elem367 = null; - elem367 = input.readI32(); - this.encodings.push(elem367); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.compressors = []; - var _rtmp3369 = input.readListBegin(); - var _size368 = _rtmp3369.size || 0; - for (var _i370 = 0; _i370 < _size368; ++_i370) { - var elem371 = null; - elem371 = input.readI32(); - this.compressors.push(elem371); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.propsList = []; - var _rtmp3373 = input.readListBegin(); - var _size372 = _rtmp3373.size || 0; - for (var _i374 = 0; _i374 < _size372; ++_i374) { - var elem375 = null; - elem375 = {}; - var _rtmp3377 = input.readMapBegin(); - var _size376 = _rtmp3377.size || 0; - for (var _i378 = 0; _i378 < _size376; ++_i378) { - var key379 = null; - var val380 = null; - key379 = input.readString(); - val380 = input.readString(); - elem375[key379] = val380; - } - input.readMapEnd(); - this.propsList.push(elem375); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.LIST) { - this.tagsList = []; - var _rtmp3382 = input.readListBegin(); - var _size381 = _rtmp3382.size || 0; - for (var _i383 = 0; _i383 < _size381; ++_i383) { - var elem384 = null; - elem384 = {}; - var _rtmp3386 = input.readMapBegin(); - var _size385 = _rtmp3386.size || 0; - for (var _i387 = 0; _i387 < _size385; ++_i387) { - var key388 = null; - var val389 = null; - key388 = input.readString(); - val389 = input.readString(); - elem384[key388] = val389; - } - input.readMapEnd(); - this.tagsList.push(elem384); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.LIST) { - this.attributesList = []; - var _rtmp3391 = input.readListBegin(); - var _size390 = _rtmp3391.size || 0; - for (var _i392 = 0; _i392 < _size390; ++_i392) { - var elem393 = null; - elem393 = {}; - var _rtmp3395 = input.readMapBegin(); - var _size394 = _rtmp3395.size || 0; - for (var _i396 = 0; _i396 < _size394; ++_i396) { - var key397 = null; - var val398 = null; - key397 = input.readString(); - val398 = input.readString(); - elem393[key397] = val398; - } - input.readMapEnd(); - this.attributesList.push(elem393); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.LIST) { - this.measurementAliasList = []; - var _rtmp3400 = input.readListBegin(); - var _size399 = _rtmp3400.size || 0; - for (var _i401 = 0; _i401 < _size399; ++_i401) { - var elem402 = null; - elem402 = input.readString(); - this.measurementAliasList.push(elem402); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCreateMultiTimeseriesReq.prototype.write = function(output) { - output.writeStructBegin('TSCreateMultiTimeseriesReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter403 in this.paths) { - if (this.paths.hasOwnProperty(iter403)) { - iter403 = this.paths[iter403]; - output.writeString(iter403); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.dataTypes !== null && this.dataTypes !== undefined) { - output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); - for (var iter404 in this.dataTypes) { - if (this.dataTypes.hasOwnProperty(iter404)) { - iter404 = this.dataTypes[iter404]; - output.writeI32(iter404); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.encodings !== null && this.encodings !== undefined) { - output.writeFieldBegin('encodings', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.I32, this.encodings.length); - for (var iter405 in this.encodings) { - if (this.encodings.hasOwnProperty(iter405)) { - iter405 = this.encodings[iter405]; - output.writeI32(iter405); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.compressors !== null && this.compressors !== undefined) { - output.writeFieldBegin('compressors', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I32, this.compressors.length); - for (var iter406 in this.compressors) { - if (this.compressors.hasOwnProperty(iter406)) { - iter406 = this.compressors[iter406]; - output.writeI32(iter406); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.propsList !== null && this.propsList !== undefined) { - output.writeFieldBegin('propsList', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.MAP, this.propsList.length); - for (var iter407 in this.propsList) { - if (this.propsList.hasOwnProperty(iter407)) { - iter407 = this.propsList[iter407]; - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter407)); - for (var kiter408 in iter407) { - if (iter407.hasOwnProperty(kiter408)) { - var viter409 = iter407[kiter408]; - output.writeString(kiter408); - output.writeString(viter409); - } - } - output.writeMapEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.tagsList !== null && this.tagsList !== undefined) { - output.writeFieldBegin('tagsList', Thrift.Type.LIST, 7); - output.writeListBegin(Thrift.Type.MAP, this.tagsList.length); - for (var iter410 in this.tagsList) { - if (this.tagsList.hasOwnProperty(iter410)) { - iter410 = this.tagsList[iter410]; - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter410)); - for (var kiter411 in iter410) { - if (iter410.hasOwnProperty(kiter411)) { - var viter412 = iter410[kiter411]; - output.writeString(kiter411); - output.writeString(viter412); - } - } - output.writeMapEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.attributesList !== null && this.attributesList !== undefined) { - output.writeFieldBegin('attributesList', Thrift.Type.LIST, 8); - output.writeListBegin(Thrift.Type.MAP, this.attributesList.length); - for (var iter413 in this.attributesList) { - if (this.attributesList.hasOwnProperty(iter413)) { - iter413 = this.attributesList[iter413]; - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(iter413)); - for (var kiter414 in iter413) { - if (iter413.hasOwnProperty(kiter414)) { - var viter415 = iter413[kiter414]; - output.writeString(kiter414); - output.writeString(viter415); - } - } - output.writeMapEnd(); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.measurementAliasList !== null && this.measurementAliasList !== undefined) { - output.writeFieldBegin('measurementAliasList', Thrift.Type.LIST, 9); - output.writeListBegin(Thrift.Type.STRING, this.measurementAliasList.length); - for (var iter416 in this.measurementAliasList) { - if (this.measurementAliasList.hasOwnProperty(iter416)) { - iter416 = this.measurementAliasList[iter416]; - output.writeString(iter416); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var ServerProperties = module.exports.ServerProperties = function(args) { - this.version = null; - this.supportedTimeAggregationOperations = null; - this.timestampPrecision = null; - this.maxConcurrentClientNum = null; - this.thriftMaxFrameSize = null; - this.isReadOnly = null; - this.buildInfo = null; - this.logo = null; - if (args) { - if (args.version !== undefined && args.version !== null) { - this.version = args.version; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); - } - if (args.supportedTimeAggregationOperations !== undefined && args.supportedTimeAggregationOperations !== null) { - this.supportedTimeAggregationOperations = Thrift.copyList(args.supportedTimeAggregationOperations, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field supportedTimeAggregationOperations is unset!'); - } - if (args.timestampPrecision !== undefined && args.timestampPrecision !== null) { - this.timestampPrecision = args.timestampPrecision; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timestampPrecision is unset!'); - } - if (args.maxConcurrentClientNum !== undefined && args.maxConcurrentClientNum !== null) { - this.maxConcurrentClientNum = args.maxConcurrentClientNum; - } - if (args.thriftMaxFrameSize !== undefined && args.thriftMaxFrameSize !== null) { - this.thriftMaxFrameSize = args.thriftMaxFrameSize; - } - if (args.isReadOnly !== undefined && args.isReadOnly !== null) { - this.isReadOnly = args.isReadOnly; - } - if (args.buildInfo !== undefined && args.buildInfo !== null) { - this.buildInfo = args.buildInfo; - } - if (args.logo !== undefined && args.logo !== null) { - this.logo = args.logo; - } - } -}; -ServerProperties.prototype = {}; -ServerProperties.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.version = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.supportedTimeAggregationOperations = []; - var _rtmp3418 = input.readListBegin(); - var _size417 = _rtmp3418.size || 0; - for (var _i419 = 0; _i419 < _size417; ++_i419) { - var elem420 = null; - elem420 = input.readString(); - this.supportedTimeAggregationOperations.push(elem420); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.timestampPrecision = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.maxConcurrentClientNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.thriftMaxFrameSize = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.BOOL) { - this.isReadOnly = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.STRING) { - this.buildInfo = input.readString(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.STRING) { - this.logo = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -ServerProperties.prototype.write = function(output) { - output.writeStructBegin('ServerProperties'); - if (this.version !== null && this.version !== undefined) { - output.writeFieldBegin('version', Thrift.Type.STRING, 1); - output.writeString(this.version); - output.writeFieldEnd(); - } - if (this.supportedTimeAggregationOperations !== null && this.supportedTimeAggregationOperations !== undefined) { - output.writeFieldBegin('supportedTimeAggregationOperations', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.supportedTimeAggregationOperations.length); - for (var iter421 in this.supportedTimeAggregationOperations) { - if (this.supportedTimeAggregationOperations.hasOwnProperty(iter421)) { - iter421 = this.supportedTimeAggregationOperations[iter421]; - output.writeString(iter421); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.timestampPrecision !== null && this.timestampPrecision !== undefined) { - output.writeFieldBegin('timestampPrecision', Thrift.Type.STRING, 3); - output.writeString(this.timestampPrecision); - output.writeFieldEnd(); - } - if (this.maxConcurrentClientNum !== null && this.maxConcurrentClientNum !== undefined) { - output.writeFieldBegin('maxConcurrentClientNum', Thrift.Type.I32, 4); - output.writeI32(this.maxConcurrentClientNum); - output.writeFieldEnd(); - } - if (this.thriftMaxFrameSize !== null && this.thriftMaxFrameSize !== undefined) { - output.writeFieldBegin('thriftMaxFrameSize', Thrift.Type.I32, 5); - output.writeI32(this.thriftMaxFrameSize); - output.writeFieldEnd(); - } - if (this.isReadOnly !== null && this.isReadOnly !== undefined) { - output.writeFieldBegin('isReadOnly', Thrift.Type.BOOL, 6); - output.writeBool(this.isReadOnly); - output.writeFieldEnd(); - } - if (this.buildInfo !== null && this.buildInfo !== undefined) { - output.writeFieldBegin('buildInfo', Thrift.Type.STRING, 7); - output.writeString(this.buildInfo); - output.writeFieldEnd(); - } - if (this.logo !== null && this.logo !== undefined) { - output.writeFieldBegin('logo', Thrift.Type.STRING, 8); - output.writeString(this.logo); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSSetSchemaTemplateReq = module.exports.TSSetSchemaTemplateReq = function(args) { - this.sessionId = null; - this.templateName = null; - this.prefixPath = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.templateName !== undefined && args.templateName !== null) { - this.templateName = args.templateName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - } -}; -TSSetSchemaTemplateReq.prototype = {}; -TSSetSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.templateName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSSetSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSSetSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.templateName !== null && this.templateName !== undefined) { - output.writeFieldBegin('templateName', Thrift.Type.STRING, 2); - output.writeString(this.templateName); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 3); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSCreateSchemaTemplateReq = module.exports.TSCreateSchemaTemplateReq = function(args) { - this.sessionId = null; - this.name = null; - this.serializedTemplate = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.name !== undefined && args.name !== null) { - this.name = args.name; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); - } - if (args.serializedTemplate !== undefined && args.serializedTemplate !== null) { - this.serializedTemplate = args.serializedTemplate; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serializedTemplate is unset!'); - } - } -}; -TSCreateSchemaTemplateReq.prototype = {}; -TSCreateSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.name = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.serializedTemplate = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSCreateSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSCreateSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.name !== null && this.name !== undefined) { - output.writeFieldBegin('name', Thrift.Type.STRING, 2); - output.writeString(this.name); - output.writeFieldEnd(); - } - if (this.serializedTemplate !== null && this.serializedTemplate !== undefined) { - output.writeFieldBegin('serializedTemplate', Thrift.Type.STRING, 3); - output.writeBinary(this.serializedTemplate); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSAppendSchemaTemplateReq = module.exports.TSAppendSchemaTemplateReq = function(args) { - this.sessionId = null; - this.name = null; - this.isAligned = null; - this.measurements = null; - this.dataTypes = null; - this.encodings = null; - this.compressors = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.name !== undefined && args.name !== null) { - this.name = args.name; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); - } - if (args.isAligned !== undefined && args.isAligned !== null) { - this.isAligned = args.isAligned; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isAligned is unset!'); - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field measurements is unset!'); - } - if (args.dataTypes !== undefined && args.dataTypes !== null) { - this.dataTypes = Thrift.copyList(args.dataTypes, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataTypes is unset!'); - } - if (args.encodings !== undefined && args.encodings !== null) { - this.encodings = Thrift.copyList(args.encodings, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field encodings is unset!'); - } - if (args.compressors !== undefined && args.compressors !== null) { - this.compressors = Thrift.copyList(args.compressors, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field compressors is unset!'); - } - } -}; -TSAppendSchemaTemplateReq.prototype = {}; -TSAppendSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.name = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.BOOL) { - this.isAligned = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp3423 = input.readListBegin(); - var _size422 = _rtmp3423.size || 0; - for (var _i424 = 0; _i424 < _size422; ++_i424) { - var elem425 = null; - elem425 = input.readString(); - this.measurements.push(elem425); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.dataTypes = []; - var _rtmp3427 = input.readListBegin(); - var _size426 = _rtmp3427.size || 0; - for (var _i428 = 0; _i428 < _size426; ++_i428) { - var elem429 = null; - elem429 = input.readI32(); - this.dataTypes.push(elem429); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.LIST) { - this.encodings = []; - var _rtmp3431 = input.readListBegin(); - var _size430 = _rtmp3431.size || 0; - for (var _i432 = 0; _i432 < _size430; ++_i432) { - var elem433 = null; - elem433 = input.readI32(); - this.encodings.push(elem433); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.LIST) { - this.compressors = []; - var _rtmp3435 = input.readListBegin(); - var _size434 = _rtmp3435.size || 0; - for (var _i436 = 0; _i436 < _size434; ++_i436) { - var elem437 = null; - elem437 = input.readI32(); - this.compressors.push(elem437); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSAppendSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSAppendSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.name !== null && this.name !== undefined) { - output.writeFieldBegin('name', Thrift.Type.STRING, 2); - output.writeString(this.name); - output.writeFieldEnd(); - } - if (this.isAligned !== null && this.isAligned !== undefined) { - output.writeFieldBegin('isAligned', Thrift.Type.BOOL, 3); - output.writeBool(this.isAligned); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter438 in this.measurements) { - if (this.measurements.hasOwnProperty(iter438)) { - iter438 = this.measurements[iter438]; - output.writeString(iter438); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.dataTypes !== null && this.dataTypes !== undefined) { - output.writeFieldBegin('dataTypes', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.I32, this.dataTypes.length); - for (var iter439 in this.dataTypes) { - if (this.dataTypes.hasOwnProperty(iter439)) { - iter439 = this.dataTypes[iter439]; - output.writeI32(iter439); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.encodings !== null && this.encodings !== undefined) { - output.writeFieldBegin('encodings', Thrift.Type.LIST, 6); - output.writeListBegin(Thrift.Type.I32, this.encodings.length); - for (var iter440 in this.encodings) { - if (this.encodings.hasOwnProperty(iter440)) { - iter440 = this.encodings[iter440]; - output.writeI32(iter440); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.compressors !== null && this.compressors !== undefined) { - output.writeFieldBegin('compressors', Thrift.Type.LIST, 7); - output.writeListBegin(Thrift.Type.I32, this.compressors.length); - for (var iter441 in this.compressors) { - if (this.compressors.hasOwnProperty(iter441)) { - iter441 = this.compressors[iter441]; - output.writeI32(iter441); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSPruneSchemaTemplateReq = module.exports.TSPruneSchemaTemplateReq = function(args) { - this.sessionId = null; - this.name = null; - this.path = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.name !== undefined && args.name !== null) { - this.name = args.name; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); - } - if (args.path !== undefined && args.path !== null) { - this.path = args.path; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field path is unset!'); - } - } -}; -TSPruneSchemaTemplateReq.prototype = {}; -TSPruneSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.name = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.path = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSPruneSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSPruneSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.name !== null && this.name !== undefined) { - output.writeFieldBegin('name', Thrift.Type.STRING, 2); - output.writeString(this.name); - output.writeFieldEnd(); - } - if (this.path !== null && this.path !== undefined) { - output.writeFieldBegin('path', Thrift.Type.STRING, 3); - output.writeString(this.path); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSQueryTemplateReq = module.exports.TSQueryTemplateReq = function(args) { - this.sessionId = null; - this.name = null; - this.queryType = null; - this.measurement = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.name !== undefined && args.name !== null) { - this.name = args.name; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field name is unset!'); - } - if (args.queryType !== undefined && args.queryType !== null) { - this.queryType = args.queryType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryType is unset!'); - } - if (args.measurement !== undefined && args.measurement !== null) { - this.measurement = args.measurement; - } - } -}; -TSQueryTemplateReq.prototype = {}; -TSQueryTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.name = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.queryType = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.measurement = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSQueryTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSQueryTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.name !== null && this.name !== undefined) { - output.writeFieldBegin('name', Thrift.Type.STRING, 2); - output.writeString(this.name); - output.writeFieldEnd(); - } - if (this.queryType !== null && this.queryType !== undefined) { - output.writeFieldBegin('queryType', Thrift.Type.I32, 3); - output.writeI32(this.queryType); - output.writeFieldEnd(); - } - if (this.measurement !== null && this.measurement !== undefined) { - output.writeFieldBegin('measurement', Thrift.Type.STRING, 4); - output.writeString(this.measurement); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSQueryTemplateResp = module.exports.TSQueryTemplateResp = function(args) { - this.status = null; - this.queryType = null; - this.result = null; - this.count = null; - this.measurements = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.queryType !== undefined && args.queryType !== null) { - this.queryType = args.queryType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field queryType is unset!'); - } - if (args.result !== undefined && args.result !== null) { - this.result = args.result; - } - if (args.count !== undefined && args.count !== null) { - this.count = args.count; - } - if (args.measurements !== undefined && args.measurements !== null) { - this.measurements = Thrift.copyList(args.measurements, [null]); - } - } -}; -TSQueryTemplateResp.prototype = {}; -TSQueryTemplateResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.queryType = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.BOOL) { - this.result = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.count = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.LIST) { - this.measurements = []; - var _rtmp3443 = input.readListBegin(); - var _size442 = _rtmp3443.size || 0; - for (var _i444 = 0; _i444 < _size442; ++_i444) { - var elem445 = null; - elem445 = input.readString(); - this.measurements.push(elem445); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSQueryTemplateResp.prototype.write = function(output) { - output.writeStructBegin('TSQueryTemplateResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.queryType !== null && this.queryType !== undefined) { - output.writeFieldBegin('queryType', Thrift.Type.I32, 2); - output.writeI32(this.queryType); - output.writeFieldEnd(); - } - if (this.result !== null && this.result !== undefined) { - output.writeFieldBegin('result', Thrift.Type.BOOL, 3); - output.writeBool(this.result); - output.writeFieldEnd(); - } - if (this.count !== null && this.count !== undefined) { - output.writeFieldBegin('count', Thrift.Type.I32, 4); - output.writeI32(this.count); - output.writeFieldEnd(); - } - if (this.measurements !== null && this.measurements !== undefined) { - output.writeFieldBegin('measurements', Thrift.Type.LIST, 5); - output.writeListBegin(Thrift.Type.STRING, this.measurements.length); - for (var iter446 in this.measurements) { - if (this.measurements.hasOwnProperty(iter446)) { - iter446 = this.measurements[iter446]; - output.writeString(iter446); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSUnsetSchemaTemplateReq = module.exports.TSUnsetSchemaTemplateReq = function(args) { - this.sessionId = null; - this.prefixPath = null; - this.templateName = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.prefixPath !== undefined && args.prefixPath !== null) { - this.prefixPath = args.prefixPath; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field prefixPath is unset!'); - } - if (args.templateName !== undefined && args.templateName !== null) { - this.templateName = args.templateName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); - } - } -}; -TSUnsetSchemaTemplateReq.prototype = {}; -TSUnsetSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.prefixPath = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.templateName = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSUnsetSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSUnsetSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.prefixPath !== null && this.prefixPath !== undefined) { - output.writeFieldBegin('prefixPath', Thrift.Type.STRING, 2); - output.writeString(this.prefixPath); - output.writeFieldEnd(); - } - if (this.templateName !== null && this.templateName !== undefined) { - output.writeFieldBegin('templateName', Thrift.Type.STRING, 3); - output.writeString(this.templateName); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSDropSchemaTemplateReq = module.exports.TSDropSchemaTemplateReq = function(args) { - this.sessionId = null; - this.templateName = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.templateName !== undefined && args.templateName !== null) { - this.templateName = args.templateName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field templateName is unset!'); - } - } -}; -TSDropSchemaTemplateReq.prototype = {}; -TSDropSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.templateName = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSDropSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TSDropSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.templateName !== null && this.templateName !== undefined) { - output.writeFieldBegin('templateName', Thrift.Type.STRING, 2); - output.writeString(this.templateName); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TCreateTimeseriesUsingSchemaTemplateReq = module.exports.TCreateTimeseriesUsingSchemaTemplateReq = function(args) { - this.sessionId = null; - this.devicePathList = null; - if (args) { - if (args.sessionId !== undefined && args.sessionId !== null) { - this.sessionId = args.sessionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sessionId is unset!'); - } - if (args.devicePathList !== undefined && args.devicePathList !== null) { - this.devicePathList = Thrift.copyList(args.devicePathList, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field devicePathList is unset!'); - } - } -}; -TCreateTimeseriesUsingSchemaTemplateReq.prototype = {}; -TCreateTimeseriesUsingSchemaTemplateReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.sessionId = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.devicePathList = []; - var _rtmp3448 = input.readListBegin(); - var _size447 = _rtmp3448.size || 0; - for (var _i449 = 0; _i449 < _size447; ++_i449) { - var elem450 = null; - elem450 = input.readString(); - this.devicePathList.push(elem450); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TCreateTimeseriesUsingSchemaTemplateReq.prototype.write = function(output) { - output.writeStructBegin('TCreateTimeseriesUsingSchemaTemplateReq'); - if (this.sessionId !== null && this.sessionId !== undefined) { - output.writeFieldBegin('sessionId', Thrift.Type.I64, 1); - output.writeI64(this.sessionId); - output.writeFieldEnd(); - } - if (this.devicePathList !== null && this.devicePathList !== undefined) { - output.writeFieldBegin('devicePathList', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.devicePathList.length); - for (var iter451 in this.devicePathList) { - if (this.devicePathList.hasOwnProperty(iter451)) { - iter451 = this.devicePathList[iter451]; - output.writeString(iter451); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSyncIdentityInfo = module.exports.TSyncIdentityInfo = function(args) { - this.pipeName = null; - this.createTime = null; - this.version = null; - this.database = null; - if (args) { - if (args.pipeName !== undefined && args.pipeName !== null) { - this.pipeName = args.pipeName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pipeName is unset!'); - } - if (args.createTime !== undefined && args.createTime !== null) { - this.createTime = args.createTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field createTime is unset!'); - } - if (args.version !== undefined && args.version !== null) { - this.version = args.version; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); - } - if (args.database !== undefined && args.database !== null) { - this.database = args.database; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field database is unset!'); - } - } -}; -TSyncIdentityInfo.prototype = {}; -TSyncIdentityInfo.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.pipeName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.createTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.version = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.database = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSyncIdentityInfo.prototype.write = function(output) { - output.writeStructBegin('TSyncIdentityInfo'); - if (this.pipeName !== null && this.pipeName !== undefined) { - output.writeFieldBegin('pipeName', Thrift.Type.STRING, 1); - output.writeString(this.pipeName); - output.writeFieldEnd(); - } - if (this.createTime !== null && this.createTime !== undefined) { - output.writeFieldBegin('createTime', Thrift.Type.I64, 2); - output.writeI64(this.createTime); - output.writeFieldEnd(); - } - if (this.version !== null && this.version !== undefined) { - output.writeFieldBegin('version', Thrift.Type.STRING, 3); - output.writeString(this.version); - output.writeFieldEnd(); - } - if (this.database !== null && this.database !== undefined) { - output.writeFieldBegin('database', Thrift.Type.STRING, 4); - output.writeString(this.database); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSyncTransportMetaInfo = module.exports.TSyncTransportMetaInfo = function(args) { - this.fileName = null; - this.startIndex = null; - if (args) { - if (args.fileName !== undefined && args.fileName !== null) { - this.fileName = args.fileName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fileName is unset!'); - } - if (args.startIndex !== undefined && args.startIndex !== null) { - this.startIndex = args.startIndex; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startIndex is unset!'); - } - } -}; -TSyncTransportMetaInfo.prototype = {}; -TSyncTransportMetaInfo.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.fileName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.startIndex = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSyncTransportMetaInfo.prototype.write = function(output) { - output.writeStructBegin('TSyncTransportMetaInfo'); - if (this.fileName !== null && this.fileName !== undefined) { - output.writeFieldBegin('fileName', Thrift.Type.STRING, 1); - output.writeString(this.fileName); - output.writeFieldEnd(); - } - if (this.startIndex !== null && this.startIndex !== undefined) { - output.writeFieldBegin('startIndex', Thrift.Type.I64, 2); - output.writeI64(this.startIndex); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TPipeTransferReq = module.exports.TPipeTransferReq = function(args) { - this.version = null; - this.type = null; - this.body = null; - if (args) { - if (args.version !== undefined && args.version !== null) { - this.version = args.version; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); - } - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - if (args.body !== undefined && args.body !== null) { - this.body = args.body; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field body is unset!'); - } - } -}; -TPipeTransferReq.prototype = {}; -TPipeTransferReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.BYTE) { - this.version = input.readByte(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I16) { - this.type = input.readI16(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.body = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TPipeTransferReq.prototype.write = function(output) { - output.writeStructBegin('TPipeTransferReq'); - if (this.version !== null && this.version !== undefined) { - output.writeFieldBegin('version', Thrift.Type.BYTE, 1); - output.writeByte(this.version); - output.writeFieldEnd(); - } - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.I16, 2); - output.writeI16(this.type); - output.writeFieldEnd(); - } - if (this.body !== null && this.body !== undefined) { - output.writeFieldBegin('body', Thrift.Type.STRING, 3); - output.writeBinary(this.body); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TPipeTransferResp = module.exports.TPipeTransferResp = function(args) { - this.status = null; - this.body = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.body !== undefined && args.body !== null) { - this.body = args.body; - } - } -}; -TPipeTransferResp.prototype = {}; -TPipeTransferResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.body = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TPipeTransferResp.prototype.write = function(output) { - output.writeStructBegin('TPipeTransferResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.body !== null && this.body !== undefined) { - output.writeFieldBegin('body', Thrift.Type.STRING, 2); - output.writeBinary(this.body); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TPipeSubscribeReq = module.exports.TPipeSubscribeReq = function(args) { - this.version = null; - this.type = null; - this.body = null; - if (args) { - if (args.version !== undefined && args.version !== null) { - this.version = args.version; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); - } - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - if (args.body !== undefined && args.body !== null) { - this.body = args.body; - } - } -}; -TPipeSubscribeReq.prototype = {}; -TPipeSubscribeReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.BYTE) { - this.version = input.readByte(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I16) { - this.type = input.readI16(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.body = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TPipeSubscribeReq.prototype.write = function(output) { - output.writeStructBegin('TPipeSubscribeReq'); - if (this.version !== null && this.version !== undefined) { - output.writeFieldBegin('version', Thrift.Type.BYTE, 1); - output.writeByte(this.version); - output.writeFieldEnd(); - } - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.I16, 2); - output.writeI16(this.type); - output.writeFieldEnd(); - } - if (this.body !== null && this.body !== undefined) { - output.writeFieldBegin('body', Thrift.Type.STRING, 3); - output.writeBinary(this.body); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TPipeSubscribeResp = module.exports.TPipeSubscribeResp = function(args) { - this.status = null; - this.version = null; - this.type = null; - this.body = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.version !== undefined && args.version !== null) { - this.version = args.version; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field version is unset!'); - } - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - if (args.body !== undefined && args.body !== null) { - this.body = Thrift.copyList(args.body, [null]); - } - } -}; -TPipeSubscribeResp.prototype = {}; -TPipeSubscribeResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.BYTE) { - this.version = input.readByte(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I16) { - this.type = input.readI16(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.LIST) { - this.body = []; - var _rtmp3453 = input.readListBegin(); - var _size452 = _rtmp3453.size || 0; - for (var _i454 = 0; _i454 < _size452; ++_i454) { - var elem455 = null; - elem455 = input.readBinary(); - this.body.push(elem455); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TPipeSubscribeResp.prototype.write = function(output) { - output.writeStructBegin('TPipeSubscribeResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.version !== null && this.version !== undefined) { - output.writeFieldBegin('version', Thrift.Type.BYTE, 2); - output.writeByte(this.version); - output.writeFieldEnd(); - } - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.I16, 3); - output.writeI16(this.type); - output.writeFieldEnd(); - } - if (this.body !== null && this.body !== undefined) { - output.writeFieldBegin('body', Thrift.Type.LIST, 4); - output.writeListBegin(Thrift.Type.STRING, this.body.length); - for (var iter456 in this.body) { - if (this.body.hasOwnProperty(iter456)) { - iter456 = this.body[iter456]; - output.writeBinary(iter456); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSBackupConfigurationResp = module.exports.TSBackupConfigurationResp = function(args) { - this.status = null; - this.enableOperationSync = null; - this.secondaryAddress = null; - this.secondaryPort = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new common_ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.enableOperationSync !== undefined && args.enableOperationSync !== null) { - this.enableOperationSync = args.enableOperationSync; - } - if (args.secondaryAddress !== undefined && args.secondaryAddress !== null) { - this.secondaryAddress = args.secondaryAddress; - } - if (args.secondaryPort !== undefined && args.secondaryPort !== null) { - this.secondaryPort = args.secondaryPort; - } - } -}; -TSBackupConfigurationResp.prototype = {}; -TSBackupConfigurationResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new common_ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.BOOL) { - this.enableOperationSync = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.secondaryAddress = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.secondaryPort = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSBackupConfigurationResp.prototype.write = function(output) { - output.writeStructBegin('TSBackupConfigurationResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.enableOperationSync !== null && this.enableOperationSync !== undefined) { - output.writeFieldBegin('enableOperationSync', Thrift.Type.BOOL, 2); - output.writeBool(this.enableOperationSync); - output.writeFieldEnd(); - } - if (this.secondaryAddress !== null && this.secondaryAddress !== undefined) { - output.writeFieldBegin('secondaryAddress', Thrift.Type.STRING, 3); - output.writeString(this.secondaryAddress); - output.writeFieldEnd(); - } - if (this.secondaryPort !== null && this.secondaryPort !== undefined) { - output.writeFieldBegin('secondaryPort', Thrift.Type.I32, 4); - output.writeI32(this.secondaryPort); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSConnectionInfo = module.exports.TSConnectionInfo = function(args) { - this.userName = null; - this.logInTime = null; - this.connectionId = null; - this.type = null; - if (args) { - if (args.userName !== undefined && args.userName !== null) { - this.userName = args.userName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field userName is unset!'); - } - if (args.logInTime !== undefined && args.logInTime !== null) { - this.logInTime = args.logInTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field logInTime is unset!'); - } - if (args.connectionId !== undefined && args.connectionId !== null) { - this.connectionId = args.connectionId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field connectionId is unset!'); - } - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - } -}; -TSConnectionInfo.prototype = {}; -TSConnectionInfo.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.userName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.logInTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRING) { - this.connectionId = input.readString(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I32) { - this.type = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSConnectionInfo.prototype.write = function(output) { - output.writeStructBegin('TSConnectionInfo'); - if (this.userName !== null && this.userName !== undefined) { - output.writeFieldBegin('userName', Thrift.Type.STRING, 1); - output.writeString(this.userName); - output.writeFieldEnd(); - } - if (this.logInTime !== null && this.logInTime !== undefined) { - output.writeFieldBegin('logInTime', Thrift.Type.I64, 2); - output.writeI64(this.logInTime); - output.writeFieldEnd(); - } - if (this.connectionId !== null && this.connectionId !== undefined) { - output.writeFieldBegin('connectionId', Thrift.Type.STRING, 3); - output.writeString(this.connectionId); - output.writeFieldEnd(); - } - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.I32, 4); - output.writeI32(this.type); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSConnectionInfoResp = module.exports.TSConnectionInfoResp = function(args) { - this.connectionInfoList = null; - if (args) { - if (args.connectionInfoList !== undefined && args.connectionInfoList !== null) { - this.connectionInfoList = Thrift.copyList(args.connectionInfoList, [ttypes.TSConnectionInfo]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field connectionInfoList is unset!'); - } - } -}; -TSConnectionInfoResp.prototype = {}; -TSConnectionInfoResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.connectionInfoList = []; - var _rtmp3458 = input.readListBegin(); - var _size457 = _rtmp3458.size || 0; - for (var _i459 = 0; _i459 < _size457; ++_i459) { - var elem460 = null; - elem460 = new ttypes.TSConnectionInfo(); - elem460.read(input); - this.connectionInfoList.push(elem460); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSConnectionInfoResp.prototype.write = function(output) { - output.writeStructBegin('TSConnectionInfoResp'); - if (this.connectionInfoList !== null && this.connectionInfoList !== undefined) { - output.writeFieldBegin('connectionInfoList', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRUCT, this.connectionInfoList.length); - for (var iter461 in this.connectionInfoList) { - if (this.connectionInfoList.hasOwnProperty(iter461)) { - iter461 = this.connectionInfoList[iter461]; - iter461.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - diff --git a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js b/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js deleted file mode 100644 index 26ba413..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/gen-nodejs/common_types.js +++ /dev/null @@ -1,2627 +0,0 @@ -// -// Autogenerated by Thrift Compiler (0.14.1) -// -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING -// -"use strict"; - -var thrift = require('thrift'); -var Thrift = thrift.Thrift; -var Q = thrift.Q; -var Int64 = require('node-int64'); - - -var ttypes = module.exports = {}; -ttypes.TConsensusGroupType = { - 'ConfigRegion' : 0, - 'DataRegion' : 1, - 'SchemaRegion' : 2 -}; -ttypes.TRegionMigrateFailedType = { - 'AddPeerFailed' : 0, - 'RemovePeerFailed' : 1, - 'RemoveConsensusGroupFailed' : 2, - 'DeleteRegionFailed' : 3, - 'CreateRegionFailed' : 4, - 'Disconnect' : 5 -}; -ttypes.TRegionMaintainTaskStatus = { - 'TASK_NOT_EXIST' : 0, - 'PROCESSING' : 1, - 'SUCCESS' : 2, - 'FAIL' : 3 -}; -ttypes.ThrottleType = { - 'REQUEST_NUMBER' : 0, - 'REQUEST_SIZE' : 1, - 'WRITE_NUMBER' : 2, - 'WRITE_SIZE' : 3, - 'READ_NUMBER' : 4, - 'READ_SIZE' : 5 -}; -ttypes.TServiceType = { - 'ConfigNodeInternalService' : 0, - 'DataNodeInternalService' : 1, - 'DataNodeMPPService' : 2, - 'DataNodeExternalService' : 3 -}; -ttypes.TAggregationType = { - 'COUNT' : 0, - 'AVG' : 1, - 'SUM' : 2, - 'FIRST_VALUE' : 3, - 'LAST_VALUE' : 4, - 'MAX_TIME' : 5, - 'MIN_TIME' : 6, - 'MAX_VALUE' : 7, - 'MIN_VALUE' : 8, - 'EXTREME' : 9, - 'COUNT_IF' : 10, - 'TIME_DURATION' : 11, - 'MODE' : 12, - 'COUNT_TIME' : 13, - 'STDDEV' : 14, - 'STDDEV_POP' : 15, - 'STDDEV_SAMP' : 16, - 'VARIANCE' : 17, - 'VAR_POP' : 18, - 'VAR_SAMP' : 19, - 'MAX_BY' : 20, - 'MIN_BY' : 21, - 'UDAF' : 22 -}; -var TEndPoint = module.exports.TEndPoint = function(args) { - this.ip = null; - this.port = null; - if (args) { - if (args.ip !== undefined && args.ip !== null) { - this.ip = args.ip; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field ip is unset!'); - } - if (args.port !== undefined && args.port !== null) { - this.port = args.port; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field port is unset!'); - } - } -}; -TEndPoint.prototype = {}; -TEndPoint.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.ip = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.port = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TEndPoint.prototype.write = function(output) { - output.writeStructBegin('TEndPoint'); - if (this.ip !== null && this.ip !== undefined) { - output.writeFieldBegin('ip', Thrift.Type.STRING, 1); - output.writeString(this.ip); - output.writeFieldEnd(); - } - if (this.port !== null && this.port !== undefined) { - output.writeFieldBegin('port', Thrift.Type.I32, 2); - output.writeI32(this.port); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSStatus = module.exports.TSStatus = function(args) { - this.code = null; - this.message = null; - this.subStatus = null; - this.redirectNode = null; - this.needRetry = null; - if (args) { - if (args.code !== undefined && args.code !== null) { - this.code = args.code; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field code is unset!'); - } - if (args.message !== undefined && args.message !== null) { - this.message = args.message; - } - if (args.subStatus !== undefined && args.subStatus !== null) { - this.subStatus = Thrift.copyList(args.subStatus, [null]); - } - if (args.redirectNode !== undefined && args.redirectNode !== null) { - this.redirectNode = new ttypes.TEndPoint(args.redirectNode); - } - if (args.needRetry !== undefined && args.needRetry !== null) { - this.needRetry = args.needRetry; - } - } -}; -TSStatus.prototype = {}; -TSStatus.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.code = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.message = input.readString(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.LIST) { - this.subStatus = []; - var _rtmp31 = input.readListBegin(); - var _size0 = _rtmp31.size || 0; - for (var _i2 = 0; _i2 < _size0; ++_i2) { - var elem3 = null; - elem3 = new ttypes.TSStatus(); - elem3.read(input); - this.subStatus.push(elem3); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRUCT) { - this.redirectNode = new ttypes.TEndPoint(); - this.redirectNode.read(input); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.BOOL) { - this.needRetry = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSStatus.prototype.write = function(output) { - output.writeStructBegin('TSStatus'); - if (this.code !== null && this.code !== undefined) { - output.writeFieldBegin('code', Thrift.Type.I32, 1); - output.writeI32(this.code); - output.writeFieldEnd(); - } - if (this.message !== null && this.message !== undefined) { - output.writeFieldBegin('message', Thrift.Type.STRING, 2); - output.writeString(this.message); - output.writeFieldEnd(); - } - if (this.subStatus !== null && this.subStatus !== undefined) { - output.writeFieldBegin('subStatus', Thrift.Type.LIST, 3); - output.writeListBegin(Thrift.Type.STRUCT, this.subStatus.length); - for (var iter4 in this.subStatus) { - if (this.subStatus.hasOwnProperty(iter4)) { - iter4 = this.subStatus[iter4]; - iter4.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.redirectNode !== null && this.redirectNode !== undefined) { - output.writeFieldBegin('redirectNode', Thrift.Type.STRUCT, 4); - this.redirectNode.write(output); - output.writeFieldEnd(); - } - if (this.needRetry !== null && this.needRetry !== undefined) { - output.writeFieldBegin('needRetry', Thrift.Type.BOOL, 5); - output.writeBool(this.needRetry); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TConsensusGroupId = module.exports.TConsensusGroupId = function(args) { - this.type = null; - this.id = null; - if (args) { - if (args.type !== undefined && args.type !== null) { - this.type = args.type; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field type is unset!'); - } - if (args.id !== undefined && args.id !== null) { - this.id = args.id; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field id is unset!'); - } - } -}; -TConsensusGroupId.prototype = {}; -TConsensusGroupId.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.type = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.id = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TConsensusGroupId.prototype.write = function(output) { - output.writeStructBegin('TConsensusGroupId'); - if (this.type !== null && this.type !== undefined) { - output.writeFieldBegin('type', Thrift.Type.I32, 1); - output.writeI32(this.type); - output.writeFieldEnd(); - } - if (this.id !== null && this.id !== undefined) { - output.writeFieldBegin('id', Thrift.Type.I32, 2); - output.writeI32(this.id); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSeriesPartitionSlot = module.exports.TSeriesPartitionSlot = function(args) { - this.slotId = null; - if (args) { - if (args.slotId !== undefined && args.slotId !== null) { - this.slotId = args.slotId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field slotId is unset!'); - } - } -}; -TSeriesPartitionSlot.prototype = {}; -TSeriesPartitionSlot.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.slotId = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSeriesPartitionSlot.prototype.write = function(output) { - output.writeStructBegin('TSeriesPartitionSlot'); - if (this.slotId !== null && this.slotId !== undefined) { - output.writeFieldBegin('slotId', Thrift.Type.I32, 1); - output.writeI32(this.slotId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TTimePartitionSlot = module.exports.TTimePartitionSlot = function(args) { - this.startTime = null; - if (args) { - if (args.startTime !== undefined && args.startTime !== null) { - this.startTime = args.startTime; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field startTime is unset!'); - } - } -}; -TTimePartitionSlot.prototype = {}; -TTimePartitionSlot.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.startTime = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TTimePartitionSlot.prototype.write = function(output) { - output.writeStructBegin('TTimePartitionSlot'); - if (this.startTime !== null && this.startTime !== undefined) { - output.writeFieldBegin('startTime', Thrift.Type.I64, 1); - output.writeI64(this.startTime); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TRegionReplicaSet = module.exports.TRegionReplicaSet = function(args) { - this.regionId = null; - this.dataNodeLocations = null; - if (args) { - if (args.regionId !== undefined && args.regionId !== null) { - this.regionId = new ttypes.TConsensusGroupId(args.regionId); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field regionId is unset!'); - } - if (args.dataNodeLocations !== undefined && args.dataNodeLocations !== null) { - this.dataNodeLocations = Thrift.copyList(args.dataNodeLocations, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeLocations is unset!'); - } - } -}; -TRegionReplicaSet.prototype = {}; -TRegionReplicaSet.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.regionId = new ttypes.TConsensusGroupId(); - this.regionId.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.dataNodeLocations = []; - var _rtmp36 = input.readListBegin(); - var _size5 = _rtmp36.size || 0; - for (var _i7 = 0; _i7 < _size5; ++_i7) { - var elem8 = null; - elem8 = new ttypes.TDataNodeLocation(); - elem8.read(input); - this.dataNodeLocations.push(elem8); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TRegionReplicaSet.prototype.write = function(output) { - output.writeStructBegin('TRegionReplicaSet'); - if (this.regionId !== null && this.regionId !== undefined) { - output.writeFieldBegin('regionId', Thrift.Type.STRUCT, 1); - this.regionId.write(output); - output.writeFieldEnd(); - } - if (this.dataNodeLocations !== null && this.dataNodeLocations !== undefined) { - output.writeFieldBegin('dataNodeLocations', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRUCT, this.dataNodeLocations.length); - for (var iter9 in this.dataNodeLocations) { - if (this.dataNodeLocations.hasOwnProperty(iter9)) { - iter9 = this.dataNodeLocations[iter9]; - iter9.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TNodeResource = module.exports.TNodeResource = function(args) { - this.cpuCoreNum = null; - this.maxMemory = null; - if (args) { - if (args.cpuCoreNum !== undefined && args.cpuCoreNum !== null) { - this.cpuCoreNum = args.cpuCoreNum; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field cpuCoreNum is unset!'); - } - if (args.maxMemory !== undefined && args.maxMemory !== null) { - this.maxMemory = args.maxMemory; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field maxMemory is unset!'); - } - } -}; -TNodeResource.prototype = {}; -TNodeResource.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.cpuCoreNum = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.maxMemory = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TNodeResource.prototype.write = function(output) { - output.writeStructBegin('TNodeResource'); - if (this.cpuCoreNum !== null && this.cpuCoreNum !== undefined) { - output.writeFieldBegin('cpuCoreNum', Thrift.Type.I32, 1); - output.writeI32(this.cpuCoreNum); - output.writeFieldEnd(); - } - if (this.maxMemory !== null && this.maxMemory !== undefined) { - output.writeFieldBegin('maxMemory', Thrift.Type.I64, 2); - output.writeI64(this.maxMemory); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TConfigNodeLocation = module.exports.TConfigNodeLocation = function(args) { - this.configNodeId = null; - this.internalEndPoint = null; - this.consensusEndPoint = null; - if (args) { - if (args.configNodeId !== undefined && args.configNodeId !== null) { - this.configNodeId = args.configNodeId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field configNodeId is unset!'); - } - if (args.internalEndPoint !== undefined && args.internalEndPoint !== null) { - this.internalEndPoint = new ttypes.TEndPoint(args.internalEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field internalEndPoint is unset!'); - } - if (args.consensusEndPoint !== undefined && args.consensusEndPoint !== null) { - this.consensusEndPoint = new ttypes.TEndPoint(args.consensusEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field consensusEndPoint is unset!'); - } - } -}; -TConfigNodeLocation.prototype = {}; -TConfigNodeLocation.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.configNodeId = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.internalEndPoint = new ttypes.TEndPoint(); - this.internalEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRUCT) { - this.consensusEndPoint = new ttypes.TEndPoint(); - this.consensusEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TConfigNodeLocation.prototype.write = function(output) { - output.writeStructBegin('TConfigNodeLocation'); - if (this.configNodeId !== null && this.configNodeId !== undefined) { - output.writeFieldBegin('configNodeId', Thrift.Type.I32, 1); - output.writeI32(this.configNodeId); - output.writeFieldEnd(); - } - if (this.internalEndPoint !== null && this.internalEndPoint !== undefined) { - output.writeFieldBegin('internalEndPoint', Thrift.Type.STRUCT, 2); - this.internalEndPoint.write(output); - output.writeFieldEnd(); - } - if (this.consensusEndPoint !== null && this.consensusEndPoint !== undefined) { - output.writeFieldBegin('consensusEndPoint', Thrift.Type.STRUCT, 3); - this.consensusEndPoint.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TDataNodeLocation = module.exports.TDataNodeLocation = function(args) { - this.dataNodeId = null; - this.clientRpcEndPoint = null; - this.internalEndPoint = null; - this.mPPDataExchangeEndPoint = null; - this.dataRegionConsensusEndPoint = null; - this.schemaRegionConsensusEndPoint = null; - if (args) { - if (args.dataNodeId !== undefined && args.dataNodeId !== null) { - this.dataNodeId = args.dataNodeId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeId is unset!'); - } - if (args.clientRpcEndPoint !== undefined && args.clientRpcEndPoint !== null) { - this.clientRpcEndPoint = new ttypes.TEndPoint(args.clientRpcEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field clientRpcEndPoint is unset!'); - } - if (args.internalEndPoint !== undefined && args.internalEndPoint !== null) { - this.internalEndPoint = new ttypes.TEndPoint(args.internalEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field internalEndPoint is unset!'); - } - if (args.mPPDataExchangeEndPoint !== undefined && args.mPPDataExchangeEndPoint !== null) { - this.mPPDataExchangeEndPoint = new ttypes.TEndPoint(args.mPPDataExchangeEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field mPPDataExchangeEndPoint is unset!'); - } - if (args.dataRegionConsensusEndPoint !== undefined && args.dataRegionConsensusEndPoint !== null) { - this.dataRegionConsensusEndPoint = new ttypes.TEndPoint(args.dataRegionConsensusEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataRegionConsensusEndPoint is unset!'); - } - if (args.schemaRegionConsensusEndPoint !== undefined && args.schemaRegionConsensusEndPoint !== null) { - this.schemaRegionConsensusEndPoint = new ttypes.TEndPoint(args.schemaRegionConsensusEndPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field schemaRegionConsensusEndPoint is unset!'); - } - } -}; -TDataNodeLocation.prototype = {}; -TDataNodeLocation.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I32) { - this.dataNodeId = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.clientRpcEndPoint = new ttypes.TEndPoint(); - this.clientRpcEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.STRUCT) { - this.internalEndPoint = new ttypes.TEndPoint(); - this.internalEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRUCT) { - this.mPPDataExchangeEndPoint = new ttypes.TEndPoint(); - this.mPPDataExchangeEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.STRUCT) { - this.dataRegionConsensusEndPoint = new ttypes.TEndPoint(); - this.dataRegionConsensusEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.STRUCT) { - this.schemaRegionConsensusEndPoint = new ttypes.TEndPoint(); - this.schemaRegionConsensusEndPoint.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TDataNodeLocation.prototype.write = function(output) { - output.writeStructBegin('TDataNodeLocation'); - if (this.dataNodeId !== null && this.dataNodeId !== undefined) { - output.writeFieldBegin('dataNodeId', Thrift.Type.I32, 1); - output.writeI32(this.dataNodeId); - output.writeFieldEnd(); - } - if (this.clientRpcEndPoint !== null && this.clientRpcEndPoint !== undefined) { - output.writeFieldBegin('clientRpcEndPoint', Thrift.Type.STRUCT, 2); - this.clientRpcEndPoint.write(output); - output.writeFieldEnd(); - } - if (this.internalEndPoint !== null && this.internalEndPoint !== undefined) { - output.writeFieldBegin('internalEndPoint', Thrift.Type.STRUCT, 3); - this.internalEndPoint.write(output); - output.writeFieldEnd(); - } - if (this.mPPDataExchangeEndPoint !== null && this.mPPDataExchangeEndPoint !== undefined) { - output.writeFieldBegin('mPPDataExchangeEndPoint', Thrift.Type.STRUCT, 4); - this.mPPDataExchangeEndPoint.write(output); - output.writeFieldEnd(); - } - if (this.dataRegionConsensusEndPoint !== null && this.dataRegionConsensusEndPoint !== undefined) { - output.writeFieldBegin('dataRegionConsensusEndPoint', Thrift.Type.STRUCT, 5); - this.dataRegionConsensusEndPoint.write(output); - output.writeFieldEnd(); - } - if (this.schemaRegionConsensusEndPoint !== null && this.schemaRegionConsensusEndPoint !== undefined) { - output.writeFieldBegin('schemaRegionConsensusEndPoint', Thrift.Type.STRUCT, 6); - this.schemaRegionConsensusEndPoint.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TDataNodeConfiguration = module.exports.TDataNodeConfiguration = function(args) { - this.location = null; - this.resource = null; - if (args) { - if (args.location !== undefined && args.location !== null) { - this.location = new ttypes.TDataNodeLocation(args.location); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field location is unset!'); - } - if (args.resource !== undefined && args.resource !== null) { - this.resource = new ttypes.TNodeResource(args.resource); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field resource is unset!'); - } - } -}; -TDataNodeConfiguration.prototype = {}; -TDataNodeConfiguration.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.location = new ttypes.TDataNodeLocation(); - this.location.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.resource = new ttypes.TNodeResource(); - this.resource.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TDataNodeConfiguration.prototype.write = function(output) { - output.writeStructBegin('TDataNodeConfiguration'); - if (this.location !== null && this.location !== undefined) { - output.writeFieldBegin('location', Thrift.Type.STRUCT, 1); - this.location.write(output); - output.writeFieldEnd(); - } - if (this.resource !== null && this.resource !== undefined) { - output.writeFieldBegin('resource', Thrift.Type.STRUCT, 2); - this.resource.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TFlushReq = module.exports.TFlushReq = function(args) { - this.isSeq = null; - this.storageGroups = null; - if (args) { - if (args.isSeq !== undefined && args.isSeq !== null) { - this.isSeq = args.isSeq; - } - if (args.storageGroups !== undefined && args.storageGroups !== null) { - this.storageGroups = Thrift.copyList(args.storageGroups, [null]); - } - } -}; -TFlushReq.prototype = {}; -TFlushReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.isSeq = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.storageGroups = []; - var _rtmp311 = input.readListBegin(); - var _size10 = _rtmp311.size || 0; - for (var _i12 = 0; _i12 < _size10; ++_i12) { - var elem13 = null; - elem13 = input.readString(); - this.storageGroups.push(elem13); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TFlushReq.prototype.write = function(output) { - output.writeStructBegin('TFlushReq'); - if (this.isSeq !== null && this.isSeq !== undefined) { - output.writeFieldBegin('isSeq', Thrift.Type.STRING, 1); - output.writeString(this.isSeq); - output.writeFieldEnd(); - } - if (this.storageGroups !== null && this.storageGroups !== undefined) { - output.writeFieldBegin('storageGroups', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRING, this.storageGroups.length); - for (var iter14 in this.storageGroups) { - if (this.storageGroups.hasOwnProperty(iter14)) { - iter14 = this.storageGroups[iter14]; - output.writeString(iter14); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSettleReq = module.exports.TSettleReq = function(args) { - this.paths = null; - if (args) { - if (args.paths !== undefined && args.paths !== null) { - this.paths = Thrift.copyList(args.paths, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field paths is unset!'); - } - } -}; -TSettleReq.prototype = {}; -TSettleReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.paths = []; - var _rtmp316 = input.readListBegin(); - var _size15 = _rtmp316.size || 0; - for (var _i17 = 0; _i17 < _size15; ++_i17) { - var elem18 = null; - elem18 = input.readString(); - this.paths.push(elem18); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSettleReq.prototype.write = function(output) { - output.writeStructBegin('TSettleReq'); - if (this.paths !== null && this.paths !== undefined) { - output.writeFieldBegin('paths', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.paths.length); - for (var iter19 in this.paths) { - if (this.paths.hasOwnProperty(iter19)) { - iter19 = this.paths[iter19]; - output.writeString(iter19); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSchemaNode = module.exports.TSchemaNode = function(args) { - this.nodeName = null; - this.nodeType = null; - if (args) { - if (args.nodeName !== undefined && args.nodeName !== null) { - this.nodeName = args.nodeName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeName is unset!'); - } - if (args.nodeType !== undefined && args.nodeType !== null) { - this.nodeType = args.nodeType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeType is unset!'); - } - } -}; -TSchemaNode.prototype = {}; -TSchemaNode.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.nodeName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.BYTE) { - this.nodeType = input.readByte(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSchemaNode.prototype.write = function(output) { - output.writeStructBegin('TSchemaNode'); - if (this.nodeName !== null && this.nodeName !== undefined) { - output.writeFieldBegin('nodeName', Thrift.Type.STRING, 1); - output.writeString(this.nodeName); - output.writeFieldEnd(); - } - if (this.nodeType !== null && this.nodeType !== undefined) { - output.writeFieldBegin('nodeType', Thrift.Type.BYTE, 2); - output.writeByte(this.nodeType); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSetConfigurationReq = module.exports.TSetConfigurationReq = function(args) { - this.configs = null; - this.nodeId = null; - if (args) { - if (args.configs !== undefined && args.configs !== null) { - this.configs = Thrift.copyMap(args.configs, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field configs is unset!'); - } - if (args.nodeId !== undefined && args.nodeId !== null) { - this.nodeId = args.nodeId; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field nodeId is unset!'); - } - } -}; -TSetConfigurationReq.prototype = {}; -TSetConfigurationReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.MAP) { - this.configs = {}; - var _rtmp321 = input.readMapBegin(); - var _size20 = _rtmp321.size || 0; - for (var _i22 = 0; _i22 < _size20; ++_i22) { - var key23 = null; - var val24 = null; - key23 = input.readString(); - val24 = input.readString(); - this.configs[key23] = val24; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.nodeId = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSetConfigurationReq.prototype.write = function(output) { - output.writeStructBegin('TSetConfigurationReq'); - if (this.configs !== null && this.configs !== undefined) { - output.writeFieldBegin('configs', Thrift.Type.MAP, 1); - output.writeMapBegin(Thrift.Type.STRING, Thrift.Type.STRING, Thrift.objectLength(this.configs)); - for (var kiter25 in this.configs) { - if (this.configs.hasOwnProperty(kiter25)) { - var viter26 = this.configs[kiter25]; - output.writeString(kiter25); - output.writeString(viter26); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.nodeId !== null && this.nodeId !== undefined) { - output.writeFieldBegin('nodeId', Thrift.Type.I32, 2); - output.writeI32(this.nodeId); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSetTTLReq = module.exports.TSetTTLReq = function(args) { - this.pathPattern = null; - this.TTL = null; - this.isDataBase = null; - if (args) { - if (args.pathPattern !== undefined && args.pathPattern !== null) { - this.pathPattern = Thrift.copyList(args.pathPattern, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pathPattern is unset!'); - } - if (args.TTL !== undefined && args.TTL !== null) { - this.TTL = args.TTL; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field TTL is unset!'); - } - if (args.isDataBase !== undefined && args.isDataBase !== null) { - this.isDataBase = args.isDataBase; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field isDataBase is unset!'); - } - } -}; -TSetTTLReq.prototype = {}; -TSetTTLReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.pathPattern = []; - var _rtmp328 = input.readListBegin(); - var _size27 = _rtmp328.size || 0; - for (var _i29 = 0; _i29 < _size27; ++_i29) { - var elem30 = null; - elem30 = input.readString(); - this.pathPattern.push(elem30); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.TTL = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.BOOL) { - this.isDataBase = input.readBool(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSetTTLReq.prototype.write = function(output) { - output.writeStructBegin('TSetTTLReq'); - if (this.pathPattern !== null && this.pathPattern !== undefined) { - output.writeFieldBegin('pathPattern', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.pathPattern.length); - for (var iter31 in this.pathPattern) { - if (this.pathPattern.hasOwnProperty(iter31)) { - iter31 = this.pathPattern[iter31]; - output.writeString(iter31); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.TTL !== null && this.TTL !== undefined) { - output.writeFieldBegin('TTL', Thrift.Type.I64, 2); - output.writeI64(this.TTL); - output.writeFieldEnd(); - } - if (this.isDataBase !== null && this.isDataBase !== undefined) { - output.writeFieldBegin('isDataBase', Thrift.Type.BOOL, 3); - output.writeBool(this.isDataBase); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TShowTTLReq = module.exports.TShowTTLReq = function(args) { - this.pathPattern = null; - if (args) { - if (args.pathPattern !== undefined && args.pathPattern !== null) { - this.pathPattern = Thrift.copyList(args.pathPattern, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field pathPattern is unset!'); - } - } -}; -TShowTTLReq.prototype = {}; -TShowTTLReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.pathPattern = []; - var _rtmp333 = input.readListBegin(); - var _size32 = _rtmp333.size || 0; - for (var _i34 = 0; _i34 < _size32; ++_i34) { - var elem35 = null; - elem35 = input.readString(); - this.pathPattern.push(elem35); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 0: - input.skip(ftype); - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TShowTTLReq.prototype.write = function(output) { - output.writeStructBegin('TShowTTLReq'); - if (this.pathPattern !== null && this.pathPattern !== undefined) { - output.writeFieldBegin('pathPattern', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.pathPattern.length); - for (var iter36 in this.pathPattern) { - if (this.pathPattern.hasOwnProperty(iter36)) { - iter36 = this.pathPattern[iter36]; - output.writeString(iter36); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TFile = module.exports.TFile = function(args) { - this.fileName = null; - this.file = null; - if (args) { - if (args.fileName !== undefined && args.fileName !== null) { - this.fileName = args.fileName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field fileName is unset!'); - } - if (args.file !== undefined && args.file !== null) { - this.file = args.file; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field file is unset!'); - } - } -}; -TFile.prototype = {}; -TFile.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.fileName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.file = input.readBinary(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TFile.prototype.write = function(output) { - output.writeStructBegin('TFile'); - if (this.fileName !== null && this.fileName !== undefined) { - output.writeFieldBegin('fileName', Thrift.Type.STRING, 1); - output.writeString(this.fileName); - output.writeFieldEnd(); - } - if (this.file !== null && this.file !== undefined) { - output.writeFieldBegin('file', Thrift.Type.STRING, 2); - output.writeBinary(this.file); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TFilesResp = module.exports.TFilesResp = function(args) { - this.status = null; - this.files = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.files !== undefined && args.files !== null) { - this.files = Thrift.copyList(args.files, [ttypes.TFile]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field files is unset!'); - } - } -}; -TFilesResp.prototype = {}; -TFilesResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.files = []; - var _rtmp338 = input.readListBegin(); - var _size37 = _rtmp338.size || 0; - for (var _i39 = 0; _i39 < _size37; ++_i39) { - var elem40 = null; - elem40 = new ttypes.TFile(); - elem40.read(input); - this.files.push(elem40); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TFilesResp.prototype.write = function(output) { - output.writeStructBegin('TFilesResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.files !== null && this.files !== undefined) { - output.writeFieldBegin('files', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRUCT, this.files.length); - for (var iter41 in this.files) { - if (this.files.hasOwnProperty(iter41)) { - iter41 = this.files[iter41]; - iter41.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSpaceQuota = module.exports.TSpaceQuota = function(args) { - this.diskSize = null; - this.deviceNum = null; - this.timeserieNum = null; - if (args) { - if (args.diskSize !== undefined && args.diskSize !== null) { - this.diskSize = args.diskSize; - } - if (args.deviceNum !== undefined && args.deviceNum !== null) { - this.deviceNum = args.deviceNum; - } - if (args.timeserieNum !== undefined && args.timeserieNum !== null) { - this.timeserieNum = args.timeserieNum; - } - } -}; -TSpaceQuota.prototype = {}; -TSpaceQuota.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.diskSize = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.deviceNum = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I64) { - this.timeserieNum = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSpaceQuota.prototype.write = function(output) { - output.writeStructBegin('TSpaceQuota'); - if (this.diskSize !== null && this.diskSize !== undefined) { - output.writeFieldBegin('diskSize', Thrift.Type.I64, 1); - output.writeI64(this.diskSize); - output.writeFieldEnd(); - } - if (this.deviceNum !== null && this.deviceNum !== undefined) { - output.writeFieldBegin('deviceNum', Thrift.Type.I64, 2); - output.writeI64(this.deviceNum); - output.writeFieldEnd(); - } - if (this.timeserieNum !== null && this.timeserieNum !== undefined) { - output.writeFieldBegin('timeserieNum', Thrift.Type.I64, 3); - output.writeI64(this.timeserieNum); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TTimedQuota = module.exports.TTimedQuota = function(args) { - this.timeUnit = null; - this.softLimit = null; - if (args) { - if (args.timeUnit !== undefined && args.timeUnit !== null) { - this.timeUnit = args.timeUnit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field timeUnit is unset!'); - } - if (args.softLimit !== undefined && args.softLimit !== null) { - this.softLimit = args.softLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field softLimit is unset!'); - } - } -}; -TTimedQuota.prototype = {}; -TTimedQuota.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.timeUnit = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.softLimit = input.readI64(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TTimedQuota.prototype.write = function(output) { - output.writeStructBegin('TTimedQuota'); - if (this.timeUnit !== null && this.timeUnit !== undefined) { - output.writeFieldBegin('timeUnit', Thrift.Type.I64, 1); - output.writeI64(this.timeUnit); - output.writeFieldEnd(); - } - if (this.softLimit !== null && this.softLimit !== undefined) { - output.writeFieldBegin('softLimit', Thrift.Type.I64, 2); - output.writeI64(this.softLimit); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TThrottleQuota = module.exports.TThrottleQuota = function(args) { - this.throttleLimit = null; - this.memLimit = null; - this.cpuLimit = null; - if (args) { - if (args.throttleLimit !== undefined && args.throttleLimit !== null) { - this.throttleLimit = Thrift.copyMap(args.throttleLimit, [ttypes.TTimedQuota]); - } - if (args.memLimit !== undefined && args.memLimit !== null) { - this.memLimit = args.memLimit; - } - if (args.cpuLimit !== undefined && args.cpuLimit !== null) { - this.cpuLimit = args.cpuLimit; - } - } -}; -TThrottleQuota.prototype = {}; -TThrottleQuota.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.MAP) { - this.throttleLimit = {}; - var _rtmp343 = input.readMapBegin(); - var _size42 = _rtmp343.size || 0; - for (var _i44 = 0; _i44 < _size42; ++_i44) { - var key45 = null; - var val46 = null; - key45 = input.readI32(); - val46 = new ttypes.TTimedQuota(); - val46.read(input); - this.throttleLimit[key45] = val46; - } - input.readMapEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.memLimit = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.I32) { - this.cpuLimit = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TThrottleQuota.prototype.write = function(output) { - output.writeStructBegin('TThrottleQuota'); - if (this.throttleLimit !== null && this.throttleLimit !== undefined) { - output.writeFieldBegin('throttleLimit', Thrift.Type.MAP, 1); - output.writeMapBegin(Thrift.Type.I32, Thrift.Type.STRUCT, Thrift.objectLength(this.throttleLimit)); - for (var kiter47 in this.throttleLimit) { - if (this.throttleLimit.hasOwnProperty(kiter47)) { - var viter48 = this.throttleLimit[kiter47]; - output.writeI32(kiter47); - viter48.write(output); - } - } - output.writeMapEnd(); - output.writeFieldEnd(); - } - if (this.memLimit !== null && this.memLimit !== undefined) { - output.writeFieldBegin('memLimit', Thrift.Type.I64, 2); - output.writeI64(this.memLimit); - output.writeFieldEnd(); - } - if (this.cpuLimit !== null && this.cpuLimit !== undefined) { - output.writeFieldBegin('cpuLimit', Thrift.Type.I32, 3); - output.writeI32(this.cpuLimit); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSetSpaceQuotaReq = module.exports.TSetSpaceQuotaReq = function(args) { - this.database = null; - this.spaceLimit = null; - if (args) { - if (args.database !== undefined && args.database !== null) { - this.database = Thrift.copyList(args.database, [null]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field database is unset!'); - } - if (args.spaceLimit !== undefined && args.spaceLimit !== null) { - this.spaceLimit = new ttypes.TSpaceQuota(args.spaceLimit); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field spaceLimit is unset!'); - } - } -}; -TSetSpaceQuotaReq.prototype = {}; -TSetSpaceQuotaReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.database = []; - var _rtmp350 = input.readListBegin(); - var _size49 = _rtmp350.size || 0; - for (var _i51 = 0; _i51 < _size49; ++_i51) { - var elem52 = null; - elem52 = input.readString(); - this.database.push(elem52); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.spaceLimit = new ttypes.TSpaceQuota(); - this.spaceLimit.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSetSpaceQuotaReq.prototype.write = function(output) { - output.writeStructBegin('TSetSpaceQuotaReq'); - if (this.database !== null && this.database !== undefined) { - output.writeFieldBegin('database', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRING, this.database.length); - for (var iter53 in this.database) { - if (this.database.hasOwnProperty(iter53)) { - iter53 = this.database[iter53]; - output.writeString(iter53); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.spaceLimit !== null && this.spaceLimit !== undefined) { - output.writeFieldBegin('spaceLimit', Thrift.Type.STRUCT, 2); - this.spaceLimit.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSetThrottleQuotaReq = module.exports.TSetThrottleQuotaReq = function(args) { - this.userName = null; - this.throttleQuota = null; - if (args) { - if (args.userName !== undefined && args.userName !== null) { - this.userName = args.userName; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field userName is unset!'); - } - if (args.throttleQuota !== undefined && args.throttleQuota !== null) { - this.throttleQuota = new ttypes.TThrottleQuota(args.throttleQuota); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field throttleQuota is unset!'); - } - } -}; -TSetThrottleQuotaReq.prototype = {}; -TSetThrottleQuotaReq.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRING) { - this.userName = input.readString(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.throttleQuota = new ttypes.TThrottleQuota(); - this.throttleQuota.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSetThrottleQuotaReq.prototype.write = function(output) { - output.writeStructBegin('TSetThrottleQuotaReq'); - if (this.userName !== null && this.userName !== undefined) { - output.writeFieldBegin('userName', Thrift.Type.STRING, 1); - output.writeString(this.userName); - output.writeFieldEnd(); - } - if (this.throttleQuota !== null && this.throttleQuota !== undefined) { - output.writeFieldBegin('throttleQuota', Thrift.Type.STRUCT, 2); - this.throttleQuota.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TLicense = module.exports.TLicense = function(args) { - this.licenseIssueTimestamp = null; - this.expireTimestamp = null; - this.dataNodeNumLimit = null; - this.cpuCoreNumLimit = null; - this.deviceNumLimit = null; - this.sensorNumLimit = null; - this.disconnectionFromActiveNodeTimeLimit = null; - this.mlNodeNumLimit = null; - if (args) { - if (args.licenseIssueTimestamp !== undefined && args.licenseIssueTimestamp !== null) { - this.licenseIssueTimestamp = args.licenseIssueTimestamp; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field licenseIssueTimestamp is unset!'); - } - if (args.expireTimestamp !== undefined && args.expireTimestamp !== null) { - this.expireTimestamp = args.expireTimestamp; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field expireTimestamp is unset!'); - } - if (args.dataNodeNumLimit !== undefined && args.dataNodeNumLimit !== null) { - this.dataNodeNumLimit = args.dataNodeNumLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field dataNodeNumLimit is unset!'); - } - if (args.cpuCoreNumLimit !== undefined && args.cpuCoreNumLimit !== null) { - this.cpuCoreNumLimit = args.cpuCoreNumLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field cpuCoreNumLimit is unset!'); - } - if (args.deviceNumLimit !== undefined && args.deviceNumLimit !== null) { - this.deviceNumLimit = args.deviceNumLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field deviceNumLimit is unset!'); - } - if (args.sensorNumLimit !== undefined && args.sensorNumLimit !== null) { - this.sensorNumLimit = args.sensorNumLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sensorNumLimit is unset!'); - } - if (args.disconnectionFromActiveNodeTimeLimit !== undefined && args.disconnectionFromActiveNodeTimeLimit !== null) { - this.disconnectionFromActiveNodeTimeLimit = args.disconnectionFromActiveNodeTimeLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field disconnectionFromActiveNodeTimeLimit is unset!'); - } - if (args.mlNodeNumLimit !== undefined && args.mlNodeNumLimit !== null) { - this.mlNodeNumLimit = args.mlNodeNumLimit; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field mlNodeNumLimit is unset!'); - } - } -}; -TLicense.prototype = {}; -TLicense.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.I64) { - this.licenseIssueTimestamp = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I64) { - this.expireTimestamp = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.I16) { - this.dataNodeNumLimit = input.readI16(); - } else { - input.skip(ftype); - } - break; - case 5: - if (ftype == Thrift.Type.I32) { - this.cpuCoreNumLimit = input.readI32(); - } else { - input.skip(ftype); - } - break; - case 6: - if (ftype == Thrift.Type.I64) { - this.deviceNumLimit = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 7: - if (ftype == Thrift.Type.I64) { - this.sensorNumLimit = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 8: - if (ftype == Thrift.Type.I64) { - this.disconnectionFromActiveNodeTimeLimit = input.readI64(); - } else { - input.skip(ftype); - } - break; - case 9: - if (ftype == Thrift.Type.I16) { - this.mlNodeNumLimit = input.readI16(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TLicense.prototype.write = function(output) { - output.writeStructBegin('TLicense'); - if (this.licenseIssueTimestamp !== null && this.licenseIssueTimestamp !== undefined) { - output.writeFieldBegin('licenseIssueTimestamp', Thrift.Type.I64, 1); - output.writeI64(this.licenseIssueTimestamp); - output.writeFieldEnd(); - } - if (this.expireTimestamp !== null && this.expireTimestamp !== undefined) { - output.writeFieldBegin('expireTimestamp', Thrift.Type.I64, 2); - output.writeI64(this.expireTimestamp); - output.writeFieldEnd(); - } - if (this.dataNodeNumLimit !== null && this.dataNodeNumLimit !== undefined) { - output.writeFieldBegin('dataNodeNumLimit', Thrift.Type.I16, 4); - output.writeI16(this.dataNodeNumLimit); - output.writeFieldEnd(); - } - if (this.cpuCoreNumLimit !== null && this.cpuCoreNumLimit !== undefined) { - output.writeFieldBegin('cpuCoreNumLimit', Thrift.Type.I32, 5); - output.writeI32(this.cpuCoreNumLimit); - output.writeFieldEnd(); - } - if (this.deviceNumLimit !== null && this.deviceNumLimit !== undefined) { - output.writeFieldBegin('deviceNumLimit', Thrift.Type.I64, 6); - output.writeI64(this.deviceNumLimit); - output.writeFieldEnd(); - } - if (this.sensorNumLimit !== null && this.sensorNumLimit !== undefined) { - output.writeFieldBegin('sensorNumLimit', Thrift.Type.I64, 7); - output.writeI64(this.sensorNumLimit); - output.writeFieldEnd(); - } - if (this.disconnectionFromActiveNodeTimeLimit !== null && this.disconnectionFromActiveNodeTimeLimit !== undefined) { - output.writeFieldBegin('disconnectionFromActiveNodeTimeLimit', Thrift.Type.I64, 8); - output.writeI64(this.disconnectionFromActiveNodeTimeLimit); - output.writeFieldEnd(); - } - if (this.mlNodeNumLimit !== null && this.mlNodeNumLimit !== undefined) { - output.writeFieldBegin('mlNodeNumLimit', Thrift.Type.I16, 9); - output.writeI16(this.mlNodeNumLimit); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TServiceProvider = module.exports.TServiceProvider = function(args) { - this.endPoint = null; - this.serviceType = null; - if (args) { - if (args.endPoint !== undefined && args.endPoint !== null) { - this.endPoint = new ttypes.TEndPoint(args.endPoint); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field endPoint is unset!'); - } - if (args.serviceType !== undefined && args.serviceType !== null) { - this.serviceType = args.serviceType; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serviceType is unset!'); - } - } -}; -TServiceProvider.prototype = {}; -TServiceProvider.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.endPoint = new ttypes.TEndPoint(); - this.endPoint.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.I32) { - this.serviceType = input.readI32(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TServiceProvider.prototype.write = function(output) { - output.writeStructBegin('TServiceProvider'); - if (this.endPoint !== null && this.endPoint !== undefined) { - output.writeFieldBegin('endPoint', Thrift.Type.STRUCT, 1); - this.endPoint.write(output); - output.writeFieldEnd(); - } - if (this.serviceType !== null && this.serviceType !== undefined) { - output.writeFieldBegin('serviceType', Thrift.Type.I32, 2); - output.writeI32(this.serviceType); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TSender = module.exports.TSender = function(args) { - this.dataNodeLocation = null; - this.configNodeLocation = null; - if (args) { - if (args.dataNodeLocation !== undefined && args.dataNodeLocation !== null) { - this.dataNodeLocation = new ttypes.TDataNodeLocation(args.dataNodeLocation); - } - if (args.configNodeLocation !== undefined && args.configNodeLocation !== null) { - this.configNodeLocation = new ttypes.TConfigNodeLocation(args.configNodeLocation); - } - } -}; -TSender.prototype = {}; -TSender.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.dataNodeLocation = new ttypes.TDataNodeLocation(); - this.dataNodeLocation.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.configNodeLocation = new ttypes.TConfigNodeLocation(); - this.configNodeLocation.read(input); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TSender.prototype.write = function(output) { - output.writeStructBegin('TSender'); - if (this.dataNodeLocation !== null && this.dataNodeLocation !== undefined) { - output.writeFieldBegin('dataNodeLocation', Thrift.Type.STRUCT, 1); - this.dataNodeLocation.write(output); - output.writeFieldEnd(); - } - if (this.configNodeLocation !== null && this.configNodeLocation !== undefined) { - output.writeFieldBegin('configNodeLocation', Thrift.Type.STRUCT, 2); - this.configNodeLocation.write(output); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TTestConnectionResult = module.exports.TTestConnectionResult = function(args) { - this.serviceProvider = null; - this.sender = null; - this.success = null; - this.reason = null; - if (args) { - if (args.serviceProvider !== undefined && args.serviceProvider !== null) { - this.serviceProvider = new ttypes.TServiceProvider(args.serviceProvider); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field serviceProvider is unset!'); - } - if (args.sender !== undefined && args.sender !== null) { - this.sender = new ttypes.TSender(args.sender); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field sender is unset!'); - } - if (args.success !== undefined && args.success !== null) { - this.success = args.success; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field success is unset!'); - } - if (args.reason !== undefined && args.reason !== null) { - this.reason = args.reason; - } - } -}; -TTestConnectionResult.prototype = {}; -TTestConnectionResult.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.serviceProvider = new ttypes.TServiceProvider(); - this.serviceProvider.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRUCT) { - this.sender = new ttypes.TSender(); - this.sender.read(input); - } else { - input.skip(ftype); - } - break; - case 3: - if (ftype == Thrift.Type.BOOL) { - this.success = input.readBool(); - } else { - input.skip(ftype); - } - break; - case 4: - if (ftype == Thrift.Type.STRING) { - this.reason = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TTestConnectionResult.prototype.write = function(output) { - output.writeStructBegin('TTestConnectionResult'); - if (this.serviceProvider !== null && this.serviceProvider !== undefined) { - output.writeFieldBegin('serviceProvider', Thrift.Type.STRUCT, 1); - this.serviceProvider.write(output); - output.writeFieldEnd(); - } - if (this.sender !== null && this.sender !== undefined) { - output.writeFieldBegin('sender', Thrift.Type.STRUCT, 2); - this.sender.write(output); - output.writeFieldEnd(); - } - if (this.success !== null && this.success !== undefined) { - output.writeFieldBegin('success', Thrift.Type.BOOL, 3); - output.writeBool(this.success); - output.writeFieldEnd(); - } - if (this.reason !== null && this.reason !== undefined) { - output.writeFieldBegin('reason', Thrift.Type.STRING, 4); - output.writeString(this.reason); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TTestConnectionResp = module.exports.TTestConnectionResp = function(args) { - this.status = null; - this.resultList = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.resultList !== undefined && args.resultList !== null) { - this.resultList = Thrift.copyList(args.resultList, [ttypes.TTestConnectionResult]); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field resultList is unset!'); - } - } -}; -TTestConnectionResp.prototype = {}; -TTestConnectionResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.resultList = []; - var _rtmp355 = input.readListBegin(); - var _size54 = _rtmp355.size || 0; - for (var _i56 = 0; _i56 < _size54; ++_i56) { - var elem57 = null; - elem57 = new ttypes.TTestConnectionResult(); - elem57.read(input); - this.resultList.push(elem57); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TTestConnectionResp.prototype.write = function(output) { - output.writeStructBegin('TTestConnectionResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.resultList !== null && this.resultList !== undefined) { - output.writeFieldBegin('resultList', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRUCT, this.resultList.length); - for (var iter58 in this.resultList) { - if (this.resultList.hasOwnProperty(iter58)) { - iter58 = this.resultList[iter58]; - iter58.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TNodeLocations = module.exports.TNodeLocations = function(args) { - this.configNodeLocations = null; - this.dataNodeLocations = null; - if (args) { - if (args.configNodeLocations !== undefined && args.configNodeLocations !== null) { - this.configNodeLocations = Thrift.copyList(args.configNodeLocations, [ttypes.TConfigNodeLocation]); - } - if (args.dataNodeLocations !== undefined && args.dataNodeLocations !== null) { - this.dataNodeLocations = Thrift.copyList(args.dataNodeLocations, [ttypes.TDataNodeLocation]); - } - } -}; -TNodeLocations.prototype = {}; -TNodeLocations.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.LIST) { - this.configNodeLocations = []; - var _rtmp360 = input.readListBegin(); - var _size59 = _rtmp360.size || 0; - for (var _i61 = 0; _i61 < _size59; ++_i61) { - var elem62 = null; - elem62 = new ttypes.TConfigNodeLocation(); - elem62.read(input); - this.configNodeLocations.push(elem62); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.LIST) { - this.dataNodeLocations = []; - var _rtmp364 = input.readListBegin(); - var _size63 = _rtmp364.size || 0; - for (var _i65 = 0; _i65 < _size63; ++_i65) { - var elem66 = null; - elem66 = new ttypes.TDataNodeLocation(); - elem66.read(input); - this.dataNodeLocations.push(elem66); - } - input.readListEnd(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TNodeLocations.prototype.write = function(output) { - output.writeStructBegin('TNodeLocations'); - if (this.configNodeLocations !== null && this.configNodeLocations !== undefined) { - output.writeFieldBegin('configNodeLocations', Thrift.Type.LIST, 1); - output.writeListBegin(Thrift.Type.STRUCT, this.configNodeLocations.length); - for (var iter67 in this.configNodeLocations) { - if (this.configNodeLocations.hasOwnProperty(iter67)) { - iter67 = this.configNodeLocations[iter67]; - iter67.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - if (this.dataNodeLocations !== null && this.dataNodeLocations !== undefined) { - output.writeFieldBegin('dataNodeLocations', Thrift.Type.LIST, 2); - output.writeListBegin(Thrift.Type.STRUCT, this.dataNodeLocations.length); - for (var iter68 in this.dataNodeLocations) { - if (this.dataNodeLocations.hasOwnProperty(iter68)) { - iter68 = this.dataNodeLocations[iter68]; - iter68.write(output); - } - } - output.writeListEnd(); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TShowConfigurationTemplateResp = module.exports.TShowConfigurationTemplateResp = function(args) { - this.status = null; - this.content = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.content !== undefined && args.content !== null) { - this.content = args.content; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field content is unset!'); - } - } -}; -TShowConfigurationTemplateResp.prototype = {}; -TShowConfigurationTemplateResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.content = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TShowConfigurationTemplateResp.prototype.write = function(output) { - output.writeStructBegin('TShowConfigurationTemplateResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.content !== null && this.content !== undefined) { - output.writeFieldBegin('content', Thrift.Type.STRING, 2); - output.writeString(this.content); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - -var TShowConfigurationResp = module.exports.TShowConfigurationResp = function(args) { - this.status = null; - this.content = null; - if (args) { - if (args.status !== undefined && args.status !== null) { - this.status = new ttypes.TSStatus(args.status); - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field status is unset!'); - } - if (args.content !== undefined && args.content !== null) { - this.content = args.content; - } else { - throw new Thrift.TProtocolException(Thrift.TProtocolExceptionType.UNKNOWN, 'Required field content is unset!'); - } - } -}; -TShowConfigurationResp.prototype = {}; -TShowConfigurationResp.prototype.read = function(input) { - input.readStructBegin(); - while (true) { - var ret = input.readFieldBegin(); - var ftype = ret.ftype; - var fid = ret.fid; - if (ftype == Thrift.Type.STOP) { - break; - } - switch (fid) { - case 1: - if (ftype == Thrift.Type.STRUCT) { - this.status = new ttypes.TSStatus(); - this.status.read(input); - } else { - input.skip(ftype); - } - break; - case 2: - if (ftype == Thrift.Type.STRING) { - this.content = input.readString(); - } else { - input.skip(ftype); - } - break; - default: - input.skip(ftype); - } - input.readFieldEnd(); - } - input.readStructEnd(); - return; -}; - -TShowConfigurationResp.prototype.write = function(output) { - output.writeStructBegin('TShowConfigurationResp'); - if (this.status !== null && this.status !== undefined) { - output.writeFieldBegin('status', Thrift.Type.STRUCT, 1); - this.status.write(output); - output.writeFieldEnd(); - } - if (this.content !== null && this.content !== undefined) { - output.writeFieldBegin('content', Thrift.Type.STRING, 2); - output.writeString(this.content); - output.writeFieldEnd(); - } - output.writeFieldStop(); - output.writeStructEnd(); - return; -}; - diff --git a/cdsp/information-layer/handlers/src/iotdb/package.json b/cdsp/information-layer/handlers/src/iotdb/package.json deleted file mode 100644 index 0b68fe0..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "iotdb-handler", - "version": "1.0.0", - "description": "IoT database handler", - "main": "iotdb-handler.js", - "dependencies": { - "thrift": "^0.20.0", - "uuid": "^9.0.1" - } -} diff --git a/cdsp/information-layer/handlers/src/iotdb/src/IoTDBHandler.ts b/cdsp/information-layer/handlers/src/iotdb/src/IoTDBHandler.ts new file mode 100644 index 0000000..3ede2fb --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/src/IoTDBHandler.ts @@ -0,0 +1,553 @@ +import { SupportedMessageDataTypes } from "./../utils/iotdb-constants"; +import { Client as ThriftClient } from "../gen-nodejs/IClientRPCService"; +import { + TSExecuteStatementReq, + TSOpenSessionReq, + TSOpenSessionResp, + TSProtocolVersion, + TSCloseSessionReq, + TSInsertRecordReq, + Int64, +} from "../gen-nodejs/IClientRPCService_types"; +import thrift from "thrift"; +import { IotDBInt64 } from "../utils/Int64"; +import { HandlerBase } from "../../HandlerBase"; +import { SessionDataSet } from "../utils/SessionDataSet"; +import { IoTDBDataInterpreter } from "../utils/IoTDBDataInterpreter"; +import { + createDataPointsSchema, + isSupportedDataPoint, + SupportedDataPoints, +} from "../config/iotdb-config"; +import { databaseParams, databaseConfig } from "../config/database-params"; +import { + logMessage, + logError, + logErrorStr, + logWithColor, + MessageType, + COLORS, +} from "../../../../utils/logger"; +import { createErrorMessage } from "../../../../utils/error-message-helper"; +import { WebSocket, Message, STATUS_ERRORS } from "../../../utils/data_types"; + +export class IoTDBHandler extends HandlerBase { + private client: ThriftClient | null; + private sendMessageToClients: + | ((ws: WebSocket, message: Message) => void) + | null; + private sessionId: Int64 | undefined; + private readonly protocolVersion: number; + private statementId: Int64 | undefined; + private readonly fetchSize: number; + private dataPointsSchema: SupportedDataPoints; + + constructor() { + super(); + if (!databaseConfig) { + throw new Error("Invalid database configuration."); + } + + this.client = null; + this.sendMessageToClients = null; + this.sessionId = undefined; + this.protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3; + this.statementId = undefined; + this.fetchSize = databaseConfig.fetchSize; + this.dataPointsSchema = {}; + } + + async authenticateAndConnect( + sendMessageToClients: (ws: WebSocket, message: Message) => void + ): Promise { + try { + this.sendMessageToClients = sendMessageToClients; + + const connection = thrift.createConnection( + databaseConfig!.iotdbHost, + databaseConfig!.iotdbPort!, + { + transport: thrift.TFramedTransport, + protocol: thrift.TBinaryProtocol, + } + ); + + logMessage( + `Connect to IoTDB, host: ${databaseConfig!.iotdbHost} port: ${databaseConfig!.iotdbPort}` + ); + + this.client = thrift.createClient(ThriftClient, connection); + + connection.on("error", (error: Error) => { + logError("thrift connection error", error); + }); + + const supportedDataPoint: SupportedDataPoints = + this.getSupportedDataPoints() as SupportedDataPoints; + this.dataPointsSchema = createDataPointsSchema(supportedDataPoint); + + logMessage("Successfully connected to IoTDB using thrift"); + } catch (error: unknown) { + logError("Failed to authenticate with IoTDB", error); + } + } + + protected async read(message: Message, ws: WebSocket): Promise { + if (this.areNodesValid(message, ws)) { + try { + await this.openSessionIfNeeded(); + const responseNodes = await this.queryLastFields(message, ws); + if (responseNodes.length > 0) { + const responseMessage = this.createUpdateMessage( + message, + responseNodes + ); + this.sendMessageToClient(ws, responseMessage); + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "read", + STATUS_ERRORS.NOT_FOUND, + `No data found with the Id: ${message.id}` + ) + ); + } + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + this.sendMessageToClient( + ws, + createErrorMessage("read", STATUS_ERRORS.NOT_FOUND, errMsg) + ); + } finally { + await this.closeSessionIfNeeded(); + } + } + } + + protected async write(message: Message, ws: WebSocket): Promise { + if (this.areNodesValid(message, ws)) { + try { + await this.openSessionIfNeeded(); + const data = this.createObjectToInsert(message); + let measurements: string[] = []; + let dataTypes: string[] = []; + let values: any[] = []; + + for (const [key, value] of Object.entries(data)) { + measurements.push(key); + dataTypes.push(this.dataPointsSchema[key]); + values.push(value); + } + + const tree = message.tree as keyof typeof databaseParams; + if (!tree || !databaseParams[tree]) { + throw new Error(`Invalid tree specified: ${message.tree}`); + } + + const deviceId = databaseParams[tree].databaseName; + const status = await this.insertRecord( + deviceId, + measurements, + dataTypes, + values + ); + + logWithColor( + `Record inserted to device ${deviceId}, status code: `.concat( + JSON.stringify(status) + ), + COLORS.GREY + ); + + const responseNodes = await this.queryLastFields(message, ws); + + if (responseNodes.length) { + const responseMessage = this.createUpdateMessage( + message, + responseNodes + ); + this.sendMessageToClient(ws, responseMessage); + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "write", + STATUS_ERRORS.NOT_FOUND, + `No data found with the Id: ${message.id}` + ) + ); + } + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + this.sendMessageToClient( + ws, + createErrorMessage( + "write", + STATUS_ERRORS.SERVICE_UNAVAILABLE, + `Failed writing data. ${errMsg}` + ) + ); + } finally { + await this.closeSessionIfNeeded(); + } + } + } + + /** + * Opens a session with the IoTDB server using the provided credentials and configuration. + */ + private async openSession(): Promise { + if (this.sessionId) { + logMessage("The session is already opened."); + return; + } + + const openSessionReq = new TSOpenSessionReq({ + username: databaseConfig!.iotdbUser, + password: databaseConfig!.iotdbPassword, + client_protocol: this.protocolVersion, + zoneId: databaseConfig!.timeZoneId, + configuration: new Map([["version", "V_0_13"]]), + }); + + try { + if (!this.client) { + throw new Error("Client is not initialized"); + } + const resp: TSOpenSessionResp = + await this.client.openSession(openSessionReq); + + if (this.protocolVersion !== resp.serverProtocolVersion) { + logMessage( + "Protocol differ, Client version is " + + this.protocolVersion + + ", but Server version is " + + resp.serverProtocolVersion + ); + // version is less than 0.10 + if (resp.serverProtocolVersion === 0) { + throw new Error("Protocol not supported."); + } + } + + this.sessionId = resp.sessionId; + if (this.sessionId) { + this.statementId = await this.client?.requestStatementId( + this.sessionId + ); + } else { + throw new Error( + "Session ID is undefined, cannot request statement ID." + ); + } + logMessage("Session started!"); + } catch (error: unknown) { + logError("Failed starting session with IoTDB", error); + } + } + + /** + * Closes the current session if it is not already closed. + */ + private async closeSession(): Promise { + if (!this.sessionId) { + logMessage("Session is already closed."); + return; + } + + const req = new TSCloseSessionReq({ sessionId: this.sessionId! }); + + try { + await this.client?.closeSession(req); + } catch (error: unknown) { + logError( + "Error occurs when closing session at server. Maybe server is down. Error message", + error + ); + } finally { + this.sessionId = undefined; + logMessage("Session closed!"); + } + } + + private async openSessionIfNeeded(): Promise { + if (!this.sessionId) { + await this.openSession(); + } + } + + private async closeSessionIfNeeded(): Promise { + if (this.sessionId) { + this.closeSession(); + } + } + + /** + * Validates the nodes in a message against the schema of a media element. + * + * @param message - The message object containing details for the request. + * @param ws - The WebSocket object for communication. + * @returns - Returns true if all nodes are valid against the schema, otherwise false. + */ + private areNodesValid(message: Message, ws: WebSocket): boolean { + const { type } = message; + + const errorData = this.validateNodesAgainstSchema( + message, + this.dataPointsSchema + ); + + if (errorData) { + logErrorStr( + `Error validating message nodes against schema: ${JSON.stringify(errorData)}` + ); + this.sendMessageToClient( + ws, + createErrorMessage( + `${type}`, + STATUS_ERRORS.NOT_FOUND, + JSON.stringify(errorData) + ) + ); + + return false; + } + return true; + } + + /** + * Queries the last fields from the database based on the provided message and sends the response to the client. + * + * @param message - The message object containing the query details. + * @param ws - The WebSocket connection to send the response to. + */ + private async queryLastFields( + message: Message, + ws: WebSocket + ): Promise> { + const { id: objectId, tree } = message; + + if (!tree || !(tree in databaseParams)) { + const errorMsg = `Invalid or undefined tree provided: ${tree}`; + logErrorStr(errorMsg); + this.sendMessageToClient( + ws, + createErrorMessage("read", STATUS_ERRORS.NOT_FOUND, errorMsg) + ); + return []; + } + const { databaseName, dataPointId } = + databaseParams[tree as keyof typeof databaseParams]; + const fieldsToSearch = this.extractDataPointsFromNodes(message).join(", "); + const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${dataPointId} = '${objectId}' ORDER BY Time ASC`; + + try { + const sessionDataSet = await this.executeQueryStatement(sql); + + // Check if sessionDataSet is not an instance of SessionDataSet, and handle the error + if (!(sessionDataSet instanceof SessionDataSet)) { + throw new Error( + "Failed to retrieve session data. Invalid session dataset." + ); + } + + const mediaElements: any[] = []; + while (sessionDataSet.hasNext()) { + mediaElements.push(sessionDataSet.next()); + } + + const latestValues: Record = {}; + mediaElements.forEach((mediaElement) => { + const transformedMediaElement = Object.fromEntries( + Object.entries(mediaElement).map(([key, value]) => { + const newKey = this.transformDataPointsWithDots(key); + return [newKey, value]; + }) + ); + + const transformedObject = + IoTDBDataInterpreter.extractNodesFromTimeseries( + transformedMediaElement, + databaseName + ); + + Object.entries(transformedObject).forEach(([key, value]) => { + if (value !== null && !isNaN(value)) { + latestValues[key] = value; + } + }); + }); + + return Object.entries(latestValues).map(([name, value]) => ({ + name, + value, + })); + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + this.sendMessageToClient( + ws, + createErrorMessage("read", STATUS_ERRORS.SERVICE_UNAVAILABLE, errMsg) + ); + return []; + } + } + + /** + * Executes a SQL query statement asynchronously. + * + * @param sql - The SQL query statement to be executed. + * @returns - Returns a SessionDataSet object if the query is successful, + * otherwise returns an empty object. + * @throws - Throws an error if the session is not open. + */ + private async executeQueryStatement(sql: string): Promise { + try { + if (!this.sessionId) { + throw new Error("Session is not open. Please authenticate first."); + } + if (!this.statementId) { + throw new Error("Missing statement ID"); + } + + const request = new TSExecuteStatementReq({ + sessionId: this.sessionId, + statement: sql, + statementId: this.statementId, + fetchSize: this.fetchSize, + timeout: 0, + }); + + const resp = await this.client?.executeQueryStatement(request); + if (!resp || !resp.queryDataSet || !resp.queryDataSet.valueList) { + throw new Error("Failed to execute query or retrieve valid data."); + } + return new SessionDataSet( + resp.columns ?? [], + resp.dataTypeList ?? [], + resp.columnNameIndexMap + ? Object.fromEntries(resp.columnNameIndexMap) + : {}, + resp.queryId ?? new IotDBInt64(-1), + this.client!, + this.statementId!, + this.sessionId!, + resp.queryDataSet, + resp.ignoreTimeStamp ?? false + ); + } catch (error: unknown) { + logError("Failed executing query statement", error); + throw error; + } + } + + /** + * Inserts a record into the time series database. + * @param deviceId - The ID of the device. + * @param timestamp - The timestamp of the record. + * @param measurements - Array of measurement names. + * @param dataTypes - Array of data types for each value. + * @param values - Array of values to be inserted. + * @param isAligned - Flag indicating if the data is aligned. + * @returns - A promise that resolves with the result of the insertion. + * @throws - Throws an error if lengths of data types, values, and measurements do not match. + */ + private async insertRecord( + deviceId: string, + measurements: string[], + dataTypes: string[], + values: any[], + isAligned = false + ): Promise { + if (!this.sessionId) { + throw new Error("Session is not open. Please authenticate first."); + } + if ( + values.length !== dataTypes.length || + values.length !== measurements.length + ) { + throw "Length of data types does not equal to length of values!"; + } + + // Validate the dataTypes before using them + const validatedDataTypes: (keyof typeof SupportedMessageDataTypes)[] = []; + + dataTypes.forEach((dataType) => { + if (isSupportedDataPoint(dataType)) { + validatedDataTypes.push(dataType); // Add valid data types + } else { + throw new Error(`Unsupported data type: ${dataType}`); + } + }); + + const valuesInBytes = IoTDBDataInterpreter.serializeValues( + validatedDataTypes, + values + ); + + const request = new TSInsertRecordReq({ + sessionId: this.sessionId!, + prefixPath: deviceId, + measurements: measurements, + values: valuesInBytes, + timestamp: new IotDBInt64(Date.now()), + isAligned: isAligned, + }); + + return await this.client?.insertRecord(request); + } + + /** + * Extracts data point names from the given message. + * + * This function checks if the message has a single node or multiple nodes and + * extracts the names accordingly. + * + * @param message - The message containing node(s). + * @returns An array of data point names. + */ + private extractDataPointsFromNodes(message: Message): string[] { + let dataPoints: string[] = []; + + if (message.node) { + dataPoints.push( + this.transformDataPointsWithUnderscores(message.node.name) + ); + } else if (message.nodes) { + dataPoints = message.nodes.map((node) => + this.transformDataPointsWithUnderscores(node.name) + ); + } + return dataPoints; + } + + /** + * Creates an object to be inserted into the database based on the provided message. + * The object is constructed using the message's ID and its associated nodes. + * + * @param message - The message object containing the ID, tree, and nodes. + * @returns An object representing the data to be inserted. + * @throws Will throw an error if the tree is invalid or undefined. + */ + private createObjectToInsert(message: Message): Record { + const { id, tree } = message; + + if (!tree || !(tree in databaseParams)) { + throw new Error(`Invalid or undefined tree provided: ${tree}`); + } + const { dataPointId } = databaseParams[tree as keyof typeof databaseParams]; + const data: Record = { [dataPointId]: id }; + + if (message.node) { + data[this.transformDataPointsWithUnderscores(message.node.name)] = + message.node.value; + } else if (message.nodes) { + message.nodes.forEach((node) => { + data[this.transformDataPointsWithUnderscores(node.name)] = node.value; + }); + } + return data; + } +} + +export default IoTDBHandler; diff --git a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js b/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js deleted file mode 100644 index b7aa035..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/src/iotdb-handler.js +++ /dev/null @@ -1,473 +0,0 @@ -const Client = require("../gen-nodejs/IClientRPCService"); -const { - TSExecuteStatementReq, - TSOpenSessionReq, - TSProtocolVersion, - TSCloseSessionReq, - TSInsertRecordReq, -} = require("../gen-nodejs/client_types"); -const thrift = require("thrift"); -const Handler = require("../../handler"); -const SessionDataSet = require("../utils/session-data-set"); -const { IoTDBDataInterpreter } = require("../utils/iotdb-data-interpreter"); -const { createDataPointsSchema } = require("../config/data-points-type"); -const { databaseParams, databaseConfig } = require("../config/database-params"); -const { - logMessage, - logWithColor, - MessageType, - COLORS, -} = require("../../../../utils/logger"); -const { - createErrorMessage, -} = require("../../../../utils/error-message-helper"); - -class IoTDBHandler extends Handler { - constructor() { - super(); - this.client = null; - this._sendMessageToClients = null; - this.sessionId = null; - this.protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V3; - this.statementId = null; - this.zoneId = databaseConfig.timeZoneId; - this.fetchSize = databaseConfig.fetchSize; - this.isSessionClosed = true; - this.dataPointsSchema = null; - } - - async authenticateAndConnect(sendMessageToClients) { - try { - this._sendMessageToClients = sendMessageToClients; - - const connection = thrift.createConnection( - databaseConfig.iotdbHost, - databaseConfig.iotdbPort, - { - transport: thrift.TFramedTransport, - protocol: thrift.TBinaryProtocol, - }, - ); - - this.client = thrift.createClient(Client, connection); - - connection.on("error", (error) => { - logMessage( - "thrift connection error: ".concat(error), - MessageType.ERROR, - ); - }); - - const supportedDataPoint = this._getSupportedDataPoints(); - this.dataPointsSchema = createDataPointsSchema(supportedDataPoint); - - console.info("Successfully connected to IoTDB using thrift"); - } catch (error) { - logMessage( - "Failed to authenticate with IoTDB: ".concat(error), - MessageType.ERROR, - ); - } - } - - async read(message, ws) { - if (this.#areNodesValid(message, ws)) { - try { - await this.#openSessionIfNeeded(); - const responseNodes = await this.#queryLastFields(message, ws); - if (responseNodes.length > 0) { - const responseMessage = this._createUpdateMessage( - message, - responseNodes, - ); - this._sendMessageToClient(ws, responseMessage); - } else { - this._sendMessageToClient( - ws, - createErrorMessage( - "read", - 404, - `No data found with the Id: ${message.id}`, - ), - ); - } - } catch (error) { - this._sendMessageToClient( - ws, - createErrorMessage("read", 404, error.message), - ); - } finally { - await this.#closeSessionIfNeeded(); - } - } - } - - async write(message, ws) { - if (this.#areNodesValid(message, ws)) { - try { - await this.#openSessionIfNeeded(); - const data = this.#createObjectToInsert(message); - let measurements = []; - let dataTypes = []; - let values = []; - - for (const [key, value] of Object.entries(data)) { - measurements.push(key); - dataTypes.push(this.dataPointsSchema[key]); - values.push(value); - } - - const timestamp = new Date().getTime(); - const deviceId = databaseParams[message.tree].databaseName; - const status = await this.#insertRecord( - deviceId, - timestamp, - measurements, - dataTypes, - values, - ); - - logWithColor( - `Record inserted to device ${deviceId}, status code: `.concat( - JSON.stringify(status), - ), - COLORS.GREY, - ); - - const responseNodes = await this.#queryLastFields(message, ws); - - if (responseNodes.length) { - const responseMessage = this._createUpdateMessage( - message, - responseNodes, - ); - this._sendMessageToClient(ws, responseMessage); - } else { - this._sendMessageToClient( - ws, - createErrorMessage( - "write", - 404, - `No data found with the Id: ${message.id}`, - ), - ); - } - } catch (error) { - this._sendMessageToClient( - ws, - createErrorMessage("write", 503, `Failed writing data. ${error}`), - ); - } finally { - await this.#closeSessionIfNeeded(); - } - } - } - - /** - * Opens a session with the IoTDB server using the provided credentials and configuration. - */ - async #openSession() { - if (!this.isSessionClosed) { - console.info("The session is already opened."); - return; - } - - const openSessionReq = new TSOpenSessionReq({ - username: databaseConfig.iotdbUser, - password: databaseConfig.iotdbPassword, - client_protocol: this.protocolVersion, - zoneId: databaseConfig.timeZoneId, - configuration: { version: "V_0_13" }, - }); - - try { - const resp = await this.client.openSession(openSessionReq); - - if (this.protocolVersion !== resp.serverProtocolVersion) { - console.info( - "Protocol differ, Client version is " + - this.protocolVersion + - ", but Server version is " + - resp.serverProtocolVersion, - ); - // version is less than 0.10 - if (resp.serverProtocolVersion === 0) { - throw new Error("Protocol not supported."); - } - } - - this.sessionId = resp.sessionId; - this.statementId = await this.client.requestStatementId(this.sessionId); - this.isSessionClosed = false; - console.info("Session started!"); - } catch (error) { - logMessage( - "Failed starting session with IoTDB: ".concat(error), - MessageType.ERROR, - ); - } - } - - /** - * Closes the current session if it is not already closed. - */ - #closeSession() { - if (this.isSessionClosed) { - console.info("Session is already closed."); - return; - } - - let req = new TSCloseSessionReq({ - sessionId: this.sessionId, - }); - - try { - this.client.closeSession(req); - } catch (error) { - logMessage( - "Error occurs when closing session at server. Maybe server is down. Error message: ".concat( - error, - ), - MessageType.ERROR, - ); - } finally { - this.isSessionClosed = true; - console.info("Session closed!"); - } - } - - async #openSessionIfNeeded() { - if (this.isSessionClosed) { - await this.#openSession(); - } - } - - async #closeSessionIfNeeded() { - if (!this.isSessionClosed) { - this.#closeSession(); - } - } - - /** - * Validates the nodes in a message against the schema of a media element. - * - * @param {Object} message - The message object containing details for the request. - * @param {WebSocket} ws - The WebSocket object for communication. - * @returns {boolean} - Returns true if all nodes are valid against the schema, otherwise false. - */ - #areNodesValid(message, ws) { - const { type } = message; - - const errorData = this._validateNodesAgainstSchema( - message, - this.dataPointsSchema, - ); - - if (errorData) { - logMessage( - `Error validating message nodes against schema: ${JSON.stringify(errorData)}`, - MessageType.ERROR, - ); - this._sendMessageToClient( - ws, - createErrorMessage(`${type}`, 404, errorData), - ); - - return false; - } - return true; - } - - /** - * Executes a SQL query statement asynchronously. - * - * @param {string} sql - The SQL query statement to be executed. - * @returns {Promise} - Returns a SessionDataSet object if the query is successful, - * otherwise returns an empty object. - * @throws {Error} - Throws an error if the session is not open. - */ - async #executeQueryStatement(sql) { - try { - if (!this.sessionId) { - throw new Error("Session is not open. Please authenticate first."); - } - - const request = new TSExecuteStatementReq({ - sessionId: this.sessionId, - statement: sql, - statementId: this.statementId, - fetchSize: this.fetchSize, - timeout: 0, - }); - - const resp = await this.client.executeQueryStatement(request); - if (!resp || !resp.queryDataSet || !resp.queryDataSet.valueList) { - return {}; - } else { - return new SessionDataSet( - resp.columns, - resp.dataTypeList, - resp.columnNameIndexMap, - resp.queryId, - this.client, - this.statementId, - this.sessionId, - resp.queryDataSet, - resp.ignoreTimeStamp, - ); - } - } catch (error) { - logMessage( - "Failed executing query statement: ".concat(error), - MessageType.ERROR, - ); - } - } - - /** - * Inserts a record into the time series database. - * @param {string} deviceId - The ID of the device. - * @param {number} timestamp - The timestamp of the record. - * @param {string[]} measurements - Array of measurement names. - * @param {string[]} dataTypes - Array of data types for each value. - * @param {any[]} values - Array of values to be inserted. - * @param {boolean} isAligned - Flag indicating if the data is aligned. - * @returns {Promise} - A promise that resolves with the result of the insertion. - * @throws {string} - Throws an error if lengths of data types, values, and measurements do not match. - */ - async #insertRecord( - deviceId, - timestamp, - measurements, - dataTypes, - values, - isAligned = false, - ) { - if ( - values.length !== dataTypes.length || - values.length !== measurements.length - ) { - throw "length of data types does not equal to length of values!"; - } - const valuesInBytes = IoTDBDataInterpreter.serializeValues( - dataTypes, - values, - ); - - let request = new TSInsertRecordReq({ - sessionId: this.sessionId, - prefixPath: deviceId, - measurements: measurements, - values: valuesInBytes, - timestamp: timestamp, - isAligned: isAligned, - }); - return await this.client.insertRecord(request); - } - - /** - * Queries the last fields from the database based on the provided message and sends the response to the client. - * - * @param {Object} message - The message object containing the query details. - * @param {WebSocket} ws - The WebSocket connection to send the response to. - * @private - */ - async #queryLastFields(message, ws) { - const { id: objectId, tree } = message; - const { databaseName, dataPointId } = databaseParams[tree]; - const fieldsToSearch = this.#extractDataPointsFromNodes(message).join(", "); - const sql = `SELECT ${fieldsToSearch} FROM ${databaseName} WHERE ${dataPointId} = '${objectId}' ORDER BY Time ASC`; - - try { - const sessionDataSet = await this.#executeQueryStatement(sql); - - if (!sessionDataSet || Object.keys(sessionDataSet).length === 0) { - throw new Error("Internal error constructing read object."); - } - - const mediaElements = []; - while (sessionDataSet.hasNext()) { - mediaElements.push(sessionDataSet.next()); - } - - let latestValues = {}; - mediaElements.forEach((mediaElement) => { - // extract underscores from media element key - const transformedMediaElement = Object.fromEntries( - Object.entries(mediaElement).map(([key, value]) => { - const newKey = this._transformDataPointsWithDots(key); - return [newKey, value]; - }), - ); - - const transformedObject = - IoTDBDataInterpreter.extractNodesFromTimeseries( - transformedMediaElement, - databaseName, - ); - - Object.entries(transformedObject).forEach(([key, value]) => { - if (value !== null && !isNaN(value)) { - latestValues[key] = value; - } - }); - }); - - return Object.entries(latestValues).map(([name, value]) => ({ - name, - value, - })); - } catch (error) { - this._sendMessageToClient( - ws, - createErrorMessage("read", 503, error.message), - ); - } - } - - /** - * Extracts data point names from the given message. - * - * This function checks if the message has a single node or multiple nodes and - * extracts the names accordingly. - * - * @param {Object} message - The message containing node(s). - * @returns {Array} An array of data point names. - */ - #extractDataPointsFromNodes(message) { - let dataPoints = []; - - if (message.node) { - dataPoints.push( - this._transformDataPointsWithUnderscores(message.node.name), - ); - } else if (message.nodes) { - dataPoints = message.nodes.map((node) => - this._transformDataPointsWithUnderscores(node.name), - ); - } - return dataPoints; - } - - /** - * Creates an object to insert data in IoTDB based on the provided message. - * - * @param {Object} message - The message containing data to be inserted. - * @returns {Object} The data object to be inserted. - */ - #createObjectToInsert(message) { - const { id, tree } = message; - const data = { [databaseParams[tree].dataPointId]: id }; - if (message.node) { - data[this._transformDataPointsWithUnderscores(message.node.name)] = - message.node.value; - } else if (message.nodes) { - message.nodes.forEach((node) => { - data[this._transformDataPointsWithUnderscores(node.name)] = node.value; - }); - } - return data; - } -} - -module.exports = IoTDBHandler; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/Int64.ts b/cdsp/information-layer/handlers/src/iotdb/utils/Int64.ts new file mode 100644 index 0000000..9f8b6a6 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/utils/Int64.ts @@ -0,0 +1,44 @@ +// Implementing Int64 class that matches the structure expected by Thrift +import { Int64 } from "../gen-nodejs/IClientRPCService_types"; + +/** + * Represents a 64-bit integer for IoT applications. + * Implements the Int64 interface. + */ +export class IotDBInt64 implements Int64 { + private value: bigint; // Holds the 64-bit integer value + + /** + * Constructs an instance of IotDBInt64. + * @param input - An optional number or string to initialize the 64-bit integer. + * If no input is provided, it defaults to 0. + */ + constructor(input?: number | string) { + this.value = BigInt(input ?? 0); // Handle input as either number or string + } + + /** + * A placeholder constructor method that is not implemented. + * @param o - An optional number or string parameter. + * @throws {Error} Throws an error indicating that the method is not implemented. + */ + ["constructor"](o?: number | string): this { + throw new Error("Method not implemented."); + } + + /** + * Converts the 64-bit integer to its string representation. + * @returns {string} The string representation of the 64-bit integer. + */ + toString(): string { + return this.value.toString(); + } + + /** + * Converts the 64-bit integer to its JSON representation. + * @returns {string} The JSON representation of the 64-bit integer. + */ + toJson(): string { + return this.toString(); // You can customize this if needed + } +} diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.ts similarity index 58% rename from cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js rename to cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.ts index 7a52b4f..d8a7e74 100644 --- a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-data-interpreter.js +++ b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBDataInterpreter.ts @@ -1,52 +1,52 @@ -const { - IoTDBDataType, - SupportedMessageDataTypes, -} = require("./iotdb-constants"); +import { IoTDBDataType, SupportedMessageDataTypes } from "./iotdb-constants"; -class IotdbDataInterpreter { +export class IoTDBDataInterpreter { /** * Serializes values based on the specified data types. - * @param {Array} dataTypes - Array of data types to serialize the values as. - * @param {Array} values - Array of values to be serialized. - * @returns {Buffer} - Serialized values as a Buffer. + * @param dataTypes - Array of data types to serialize the values as. + * @param values - Array of values to be serialized. + * @returns Serialized values as a Buffer. */ - static serializeValues(dataTypes, values) { - function serializeBoolean(value) { + static serializeValues( + dataTypes: (keyof typeof SupportedMessageDataTypes)[], + values: any[], + ): Buffer { + function serializeBoolean(value: boolean): (number | boolean)[] { return [IoTDBDataType.BOOLEAN, value]; } - function serializeInt32(value) { + function serializeInt32(value: number): (number | Uint8Array)[] { const int32 = new Int32Array([value]); const uint8 = new Uint8Array(int32.buffer).reverse(); return [IoTDBDataType.INT32, ...uint8]; } - function serializeInt64(value) { + function serializeInt64(value: bigint): (number | Uint8Array)[] { const bigint64 = new BigInt64Array([value]); const uint8 = new Uint8Array(bigint64.buffer).reverse(); return [IoTDBDataType.INT64, ...uint8]; } - function serializeFloat(value) { + function serializeFloat(value: number): (number | Uint8Array)[] { const float32 = new Float32Array([value]); const uint8 = new Uint8Array(float32.buffer).reverse(); return [IoTDBDataType.FLOAT, ...uint8]; } - function serializeDouble(value) { + function serializeDouble(value: number): (number | Uint8Array)[] { const float64 = new Float64Array([value]); const uint8 = new Uint8Array(float64.buffer).reverse(); return [IoTDBDataType.DOUBLE, ...uint8]; } - function serializeText(value) { + function serializeText(value: string): (number | Uint8Array)[] { const utf8arr = Buffer.from(value); const int32 = new Uint32Array([utf8arr.length]); const uint8 = new Uint8Array(int32.buffer).reverse(); return [IoTDBDataType.TEXT, ...uint8, ...utf8arr]; } - const serializedValues = []; + const serializedValues: (number | Uint8Array | boolean)[] = []; for (let i = 0; i < dataTypes.length; i++) { switch (dataTypes[i]) { @@ -75,33 +75,43 @@ class IotdbDataInterpreter { throw new Error(`Unsupported data type: ${dataTypes[i]}`); } } - return Buffer.from(serializedValues); + // Convert to Uint8Array and pass it to Buffer.from + const flattenedValues = new Uint8Array( + serializedValues.flat().map((val) => Number(val)), + ); + return Buffer.from(flattenedValues); } /** * Extracts and transforms timeseries nodes from the given object with the required message format. * - * @param {Object} obj - The object containing timeseries data. - * @param {string} databaseName - The database name to match and remove from the keys. - * @returns {Object} - A new object with transformed keys and their corresponding values. + * @param obj - The object containing timeseries data. + * @param databaseName - The database name to match and remove from the keys. + * @returns A new object with transformed keys and their corresponding values. */ - static extractNodesFromTimeseries(obj, databaseName) { - return Object.entries(obj).reduce((acc, [key, value]) => { - if (key.startsWith(databaseName)) { - const newKey = key.replace(`${databaseName}.`, ""); - acc[newKey] = value; - } - return acc; - }, {}); + static extractNodesFromTimeseries( + obj: Record, + databaseName: string, + ): Record { + return Object.entries(obj).reduce( + (acc: Record, [key, value]) => { + if (key.startsWith(databaseName)) { + const newKey = key.replace(`${databaseName}.`, ""); + acc[newKey] = value; + } + return acc; + }, + {}, + ); } /** * This function converts a buffer to a BigInt64Array and extracts the timestamp. * - * @param {Buffer} buffer - The buffer containing the timestamp. - * @returns {{ timestamp: BigInt }} An object containing the extracted timestamp. + * @param buffer - The buffer containing the timestamp. + * @returns An object containing the extracted timestamp. */ - static extractTimestamp(buffer) { + static extractTimestamp(buffer: Buffer): { timestamp: bigint } { const reverseBuffer = Buffer.from(buffer.subarray(0, 8).reverse()); const uinit8Buffer = new Uint8Array(reverseBuffer).buffer; const timestamp = new BigInt64Array(uinit8Buffer)[0]; @@ -109,5 +119,3 @@ class IotdbDataInterpreter { return { timestamp }; } } - -module.exports = { IoTDBDataInterpreter: IotdbDataInterpreter }; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSet.ts b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSet.ts new file mode 100644 index 0000000..de8a98a --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/utils/IoTDBRpcDataSet.ts @@ -0,0 +1,223 @@ +import { IoTDBDataType } from "./iotdb-constants"; +import { Int64 } from "../gen-nodejs/IClientRPCService_types"; + +export class IoTDBRpcDataSet { + // Static properties + static TIMESTAMP_STR = "Time"; + static START_INDEX = 2; + static FLAG = 0x80; + + // Private fields + private sql: string | null = null; + private columnNameList: string[]; + private columnTypeList: IoTDBDataType[]; + private queryId: Int64; + private client: any; + private statementId: Int64; + private sessionId: Int64; + private queryDataSet: any; + private ignoreTimestamp: boolean; + private fetchSize: number; + private columnOrdinalDict: Map; + private columnTypeDeduplicatedList: (IoTDBDataType | null)[]; + private timeBytes: Buffer; + private currentBitmap: Buffer[]; + private hasCachedRecord: boolean; + private value: (Buffer | null)[]; + private emptyResultSet: boolean; + private rowsIndex: number; + private columnSize: number; + + constructor( + columnNameList: string[], + columnTypeList: IoTDBDataType[], + columnNameIndex: { [key: string]: number } | null, + queryId: Int64, + client: any, + statementId: Int64, + sessionId: Int64, + queryDataSet: any, + ignoreTimestamp: boolean, + fetchSize: number + ) { + this.columnNameList = []; + this.columnTypeList = []; + this.queryId = queryId; + this.client = client; + this.statementId = statementId; + this.sessionId = sessionId; + this.queryDataSet = queryDataSet; + this.ignoreTimestamp = ignoreTimestamp; + this.fetchSize = fetchSize; + this.columnSize = columnNameList.length; + this.columnOrdinalDict = new Map(); + this.columnTypeDeduplicatedList = []; + this.hasCachedRecord = false; + this.emptyResultSet = false; + this.rowsIndex = 0; + + if (!ignoreTimestamp) { + this.columnNameList.push(IoTDBRpcDataSet.TIMESTAMP_STR); + this.columnTypeList.push(IoTDBDataType.INT64); + this.columnOrdinalDict.set(IoTDBRpcDataSet.TIMESTAMP_STR, 1); + } + + if (columnNameIndex !== null) { + for (let j = 0; j < columnNameIndex.length; j++) { + this.columnTypeDeduplicatedList.push(null); + } + + for (let i = 0; i < columnNameList.length; i++) { + const name = columnNameList[i]; + this.columnNameList.push(name); + this.columnTypeList.push(columnTypeList[i]); + if (!this.columnOrdinalDict.has(name)) { + const index = columnNameIndex[name]; + this.columnOrdinalDict.set(name, index + IoTDBRpcDataSet.START_INDEX); + this.columnTypeDeduplicatedList[index] = columnTypeList[i]; + } + } + } + + this.timeBytes = Buffer.alloc(0); + this.currentBitmap = Array(this.columnTypeDeduplicatedList.length).fill( + Buffer.alloc(0) + ); + this.value = Array(this.columnTypeDeduplicatedList.length).fill(null); + } + + next(): boolean { + if (this.hasCachedResult()) { + this.constructOneRow(); + return true; + } + if (this.emptyResultSet) { + return true; + } + this.fetchResults(); + if (this.hasCachedResult()) { + this.constructOneRow(); + return true; + } + return false; + } + + getHasCachedRecord(): boolean { + return this.hasCachedRecord; + } + + setHasCachedRecord(value: boolean): void { + this.hasCachedRecord = value; + } + + getTimeBytes(): Buffer { + return this.timeBytes; + } + + getColumnSize(): number { + return this.columnSize; + } + + getIgnoreTimestamp(): boolean { + return this.ignoreTimestamp; + } + + getColumnNames(): string[] { + return this.columnNameList; + } + + getColumnOrdinalDict(): Map { + return this.columnOrdinalDict; + } + + isNullByIndex(columnIndex: number): boolean { + const index = + this.columnOrdinalDict.get(this.findColumnNameByIndex(columnIndex))! - + IoTDBRpcDataSet.START_INDEX; + if (index < 0) { + return true; + } + return this.isNull(index, this.rowsIndex - 1); + } + + getValues(): (Buffer | null)[] { + return this.value; + } + + getColumnTypeDeduplicatedList(): (IoTDBDataType | null)[] { + return this.columnTypeDeduplicatedList; + } + + findColumnNameByIndex(columnIndex: number): string { + if (columnIndex <= 0 || columnIndex > this.columnNameList.length) { + throw new Error("Column index out of range"); + } + return this.columnNameList[columnIndex - 1]; + } + + private hasCachedResult(): boolean { + return this.queryDataSet !== null && this.queryDataSet.time.length !== 0; + } + + private constructOneRow(): void { + this.timeBytes = this.queryDataSet.time.slice(0, 8); + this.queryDataSet.time = this.queryDataSet.time.slice(8); + + for (let i = 0; i < this.queryDataSet.bitmapList.length; i++) { + const bitmapBuffer = this.queryDataSet.bitmapList[i]; + + if (this.rowsIndex % 8 === 0) { + this.currentBitmap[i] = bitmapBuffer[0]; + this.queryDataSet.bitmapList[i] = bitmapBuffer.slice(1); + } + + if (!this.isNull(i, this.rowsIndex)) { + const valueBuffer = this.queryDataSet.valueList[i]; + const dataType = this.columnTypeDeduplicatedList[i]; + + switch (dataType) { + case IoTDBDataType.BOOLEAN: + this.value[i] = valueBuffer.slice(0, 1); + this.queryDataSet.valueList[i] = valueBuffer.slice(1); + break; + case IoTDBDataType.INT32: + this.value[i] = valueBuffer.slice(0, 4); + this.queryDataSet.valueList[i] = valueBuffer.slice(4); + break; + case IoTDBDataType.INT64: + this.value[i] = valueBuffer.slice(0, 8); + this.queryDataSet.valueList[i] = valueBuffer.slice(8); + break; + case IoTDBDataType.FLOAT: + this.value[i] = valueBuffer.slice(0, 4); + this.queryDataSet.valueList[i] = valueBuffer.slice(4); + break; + case IoTDBDataType.DOUBLE: + this.value[i] = valueBuffer.slice(0, 8); + this.queryDataSet.valueList[i] = valueBuffer.slice(8); + break; + case IoTDBDataType.TEXT: + const length = valueBuffer.readInt32BE(0); + this.value[i] = valueBuffer.slice(4, 4 + length); + this.queryDataSet.valueList[i] = valueBuffer.slice(4 + length); + break; + default: + throw new Error(`Unsupported data type: ${dataType}`); + } + } + } + this.rowsIndex += 1; + this.hasCachedRecord = true; + } + + private isNull(index: number, rowNum: number): boolean { + const bitmap = this.currentBitmap[index]; + const shift = rowNum % 8; + const bitmapValue = bitmap.readUInt8(0); // Read the first byte as an unsigned integer + return ((IoTDBRpcDataSet.FLAG >> shift) & (bitmapValue & 0xff)) === 0; + } + + private fetchResults(): void { + this.rowsIndex = 0; + } +} diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.ts b/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.ts new file mode 100644 index 0000000..364fdc2 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/utils/SessionDataSet.ts @@ -0,0 +1,111 @@ +import { IoTDBDataType } from "./iotdb-constants"; +import { IoTDBRpcDataSet } from "./IoTDBRpcDataSet"; +import { IoTDBDataInterpreter } from "./IoTDBDataInterpreter"; +import { Int64 } from "../gen-nodejs/IClientRPCService_types"; + +// Define the dataTypeProcessors map with specific function types +const dataTypeProcessors: { + [key in IoTDBDataType]: ( + bytes: Uint8Array | Buffer, + ) => number | bigint | string; +} = { + [IoTDBDataType.BOOLEAN]: (bytes) => + new Int8Array(new Uint8Array(bytes.slice(0, 1).reverse()).buffer)[0], + [IoTDBDataType.INT32]: (bytes) => + new Int32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], + [IoTDBDataType.INT64]: (bytes) => + new BigInt64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], + [IoTDBDataType.FLOAT]: (bytes) => + new Float32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], + [IoTDBDataType.DOUBLE]: (bytes) => + new Float64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], + [IoTDBDataType.TEXT]: (bytes) => bytes.toString(), +}; + +export class SessionDataSet { + private iotdbRpcDataSet: IoTDBRpcDataSet; + + constructor( + columnNameList: string[], + columnTypeList: IoTDBDataType[], + columnNameIndex: { [key: string]: number }, + queryId: Int64, + client: any, + statementId: Int64, + sessionId: Int64, + queryDataSet: any, + ignoreTimestamp: boolean, + ) { + this.iotdbRpcDataSet = new IoTDBRpcDataSet( + columnNameList, + columnTypeList, + columnNameIndex, + queryId, + client, + statementId, + sessionId, + queryDataSet, + ignoreTimestamp, + 1024, // Buffer size or default value + ); + } + + hasNext(): boolean { + return this.iotdbRpcDataSet.next(); + } + + next(): { [key: string]: any } | null { + if (!this.iotdbRpcDataSet.getHasCachedRecord()) { + if (!this.hasNext()) { + return null; + } + } + this.iotdbRpcDataSet.setHasCachedRecord(false); + return this.constructRowRecordFromValueArray(); + } + + private constructRowRecordFromValueArray(): { [key: string]: any } { + const time64 = IoTDBDataInterpreter.extractTimestamp( + this.iotdbRpcDataSet.getTimeBytes(), + ); + const obj: { [key: string]: any } = { timestamp: time64 }; + + for (let i = 0; i < this.iotdbRpcDataSet.getColumnSize(); ++i) { + let index = i + 1; + let dataSetColumnIndex = i + IoTDBRpcDataSet.START_INDEX; + + if (this.iotdbRpcDataSet.getIgnoreTimestamp()) { + index -= 1; + dataSetColumnIndex -= 1; + } + + const columnName = this.iotdbRpcDataSet.getColumnNames()[index]; + const location = + this.iotdbRpcDataSet.getColumnOrdinalDict().get(columnName)! - + IoTDBRpcDataSet.START_INDEX; + + if (!this.iotdbRpcDataSet.isNullByIndex(dataSetColumnIndex)) { + const valueBytes = this.iotdbRpcDataSet.getValues()[location]; + const dataType = + this.iotdbRpcDataSet.getColumnTypeDeduplicatedList()[location]; + const tsName = + this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); + + if (dataType !== null && valueBytes !== null) { + if (dataTypeProcessors[dataType]) { + obj[tsName] = dataTypeProcessors[dataType](valueBytes); + } else { + throw new Error(`Unsupported data type: ${dataType}`); + } + } else { + obj[tsName] = null; + } + } else { + const tsName = + this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); + obj[tsName] = null; + } + } + return obj; + } +} diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js deleted file mode 100644 index 152f176..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.js +++ /dev/null @@ -1,21 +0,0 @@ -const IoTDBDataType = Object.freeze({ - BOOLEAN: 0, - INT32: 1, - INT64: 2, - FLOAT: 3, - DOUBLE: 4, - TEXT: 5, -}); - -const SupportedMessageDataTypes = Object.freeze({ - boolean: "boolean", - string: "string", - float: "float", - double: "double", - int8: "int8", - int16: "int16", - uint8: "uint8", - uint16: "uint16", -}); - -module.exports = { IoTDBDataType, SupportedMessageDataTypes }; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.ts b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.ts new file mode 100644 index 0000000..f2cebd2 --- /dev/null +++ b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-constants.ts @@ -0,0 +1,21 @@ +// Define IoTDBDataType as an enum for better type safety +export enum IoTDBDataType { + BOOLEAN = 0, + INT32 = 1, + INT64 = 2, + FLOAT = 3, + DOUBLE = 4, + TEXT = 5, +} + +// Define SupportedMessageDataTypes as a frozen object with a string-to-string mapping +export const SupportedMessageDataTypes = { + boolean: "boolean", + string: "string", + float: "float", + double: "double", + int8: "int8", + int16: "int16", + uint8: "uint8", + uint16: "uint16", +} as const; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js b/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js deleted file mode 100644 index 18a3745..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/utils/iotdb-rpc-data-sets.js +++ /dev/null @@ -1,271 +0,0 @@ -const { IoTDBDataType } = require("./iotdb-constants"); -class IoTDBRpcDataSet { - // Static properties - static TIMESTAMP_STR = "Time"; - static START_INDEX = 2; - static FLAG = 0x80; - - // Private fields - #sql; - #columnNameList; - #columnTypeList; - #queryId; - #client; - #statementId; - #sessionId; - #queryDataSet; - #ignoreTimestamp; - #fetchSize; - #columnOrdinalDict; - #columnTypeDeduplicatedList; - #timeBytes; - #currentBitmap; - #hasCachedRecord; - #value; - #emptyResultSet; - #rowsIndex; - #columnSize; - - constructor( - columnNameList, - columnTypeList, - columnNameIndex, - queryId, - client, - statementId, - sessionId, - queryDataSet, - ignoreTimestamp, - fetchSize, - ) { - this.#columnNameList = []; - this.#columnTypeList = []; - this.#queryId = queryId; - this.#client = client; - this.#statementId = statementId; - this.#sessionId = sessionId; - this.#queryDataSet = queryDataSet; - this.#ignoreTimestamp = ignoreTimestamp; - this.#fetchSize = fetchSize; - this.#columnSize = columnNameList.length; - this.#columnOrdinalDict = new Map(); - this.#columnTypeDeduplicatedList = []; - this.#hasCachedRecord = false; - this.#emptyResultSet = false; - this.#rowsIndex = 0; - - if (!ignoreTimestamp) { - this.#columnNameList.push(IoTDBRpcDataSet.TIMESTAMP_STR); - this.#columnTypeList.push(IoTDBDataType.INT64); - this.#columnOrdinalDict.set(IoTDBRpcDataSet.TIMESTAMP_STR, 1); - } - - if (columnNameIndex !== null) { - // Initialize deduplicated list - for (let j = 0; j < columnNameIndex.length; j++) { - this.#columnTypeDeduplicatedList.push(null); - } - - // Populate column_name_list and column_type_list - for (let i = 0; i < columnNameList.length; i++) { - const name = columnNameList[i]; - this.#columnNameList.push(name); - this.#columnTypeList.push(IoTDBDataType[columnTypeList[i]]); - if (!this.#columnOrdinalDict.has(name)) { - let index = columnNameIndex[name]; - this.#columnOrdinalDict.set( - name, - index + IoTDBRpcDataSet.START_INDEX, - ); - this.#columnTypeDeduplicatedList[index] = - IoTDBDataType[columnTypeList[i]]; - } - } - } - - this.#timeBytes = Buffer.alloc(0); - this.#currentBitmap = Array(this.#columnTypeDeduplicatedList.length).fill( - Buffer.alloc(0), - ); - this.#value = Array(this.#columnTypeDeduplicatedList.length).fill(null); - } - - /** - * Advances the cursor to the next row in the result set. - * - * @returns {boolean} - Returns true if the cursor was successfully advanced to the next row, - * or if there are no more rows in the result set. Returns false if - * there are no more rows and no cached results. - */ - next() { - if (this.#hasCachedResult()) { - this.#constructOneRow(); - return true; - } - if (this.#emptyResultSet) { - return true; - } - if (this.#fetchResults()) { - this.#constructOneRow(); - return true; - } - return false; - } - - getHasCachedRecord() { - return this.#hasCachedRecord; - } - - setHasCachedRecord(value) { - this.#hasCachedRecord = value; - } - - getTimeBytes() { - return this.#timeBytes; - } - - getColumnSize() { - return this.#columnSize; - } - - getIgnoreTimestamp() { - return this.#ignoreTimestamp; - } - - getColumnNames() { - return this.#columnNameList; - } - - getColumnOrdinalDict() { - return this.#columnOrdinalDict; - } - - /** - * Checks if the value at the specified column index is null. - * - * @param {number} columnIndex - The index of the column to check. - * @returns {boolean} - Returns true if the value at the specified column index is null, otherwise false. - */ - isNullByIndex(columnIndex) { - let index = - this.#columnOrdinalDict.get(this.findColumnNameByIndex(columnIndex)) - - IoTDBRpcDataSet.START_INDEX; - - // time column will never be null - if (index < 0) { - return true; - } - return this.#isNull(index, this.#rowsIndex - 1); - } - - getValues() { - return this.#value; - } - - getColumnTypeDeduplicatedList() { - return this.#columnTypeDeduplicatedList; - } - - /** - * Finds the column name by its index. - * @param {number} columnIndex - The index of the column (starting from 1). - * @returns {string} The name of the column corresponding to the index. - * @throws {Error} If the column index is less than or equal to 0 or greater than the number of columns. - */ - findColumnNameByIndex(columnIndex) { - if (columnIndex <= 0) { - throw new Error("Column index should start from 1"); - } - if (columnIndex > this.#columnNameList.length) { - throw new Error("Column index out of range"); - } - return this.#columnNameList[columnIndex - 1]; - } - - /** - * Checks if there is a cached result available. - * - * @returns {boolean} True if there is a cached result, otherwise false. - */ - #hasCachedResult() { - return this.#queryDataSet !== null && this.#queryDataSet.time.length !== 0; - } - - /** - * Constructs one row of data by reading from the dataset buffers. - * This method updates the internal state of the object by reading - * time, bitmap, and value buffers, and discarding the bytes that have been read. - */ - #constructOneRow() { - // Simulating buffer, read 8 bytes from data set and discard first 8 bytes which have been read. - this.#timeBytes = this.#queryDataSet.time.slice(0, 8); - this.#queryDataSet.time = this.#queryDataSet.time.slice(8); - - for (let i = 0; i < this.#queryDataSet.bitmapList.length; i++) { - let bitmapBuffer = this.#queryDataSet.bitmapList[i]; - - // Another 8 new rows, should move the bitmap buffer position to next byte. - if (this.#rowsIndex % 8 === 0) { - this.#currentBitmap[i] = bitmapBuffer[0]; - this.#queryDataSet.bitmapList[i] = bitmapBuffer.slice(1); - } - - if (!this.#isNull(i, this.#rowsIndex)) { - let valueBuffer = this.#queryDataSet.valueList[i]; - let dataType = this.#columnTypeDeduplicatedList[i]; - - // Simulating buffer based on data type. - switch (dataType) { - case IoTDBDataType.BOOLEAN: - this.#value[i] = valueBuffer.slice(0, 1); - this.#queryDataSet.valueList[i] = valueBuffer.slice(1); - break; - case IoTDBDataType.INT32: - this.#value[i] = valueBuffer.slice(0, 4); - this.#queryDataSet.valueList[i] = valueBuffer.slice(4); - break; - case IoTDBDataType.INT64: - this.#value[i] = valueBuffer.slice(0, 8); - this.#queryDataSet.valueList[i] = valueBuffer.slice(8); - break; - case IoTDBDataType.FLOAT: - this.#value[i] = valueBuffer.slice(0, 4); - this.#queryDataSet.valueList[i] = valueBuffer.slice(4); - break; - case IoTDBDataType.DOUBLE: - this.#value[i] = valueBuffer.slice(0, 8); - this.#queryDataSet.valueList[i] = valueBuffer.slice(8); - break; - case IoTDBDataType.TEXT: - let length = valueBuffer.readInt32BE(0); - this.#value[i] = valueBuffer.slice(4, 4 + length); - this.#queryDataSet.valueList[i] = valueBuffer.slice(4 + length); - break; - default: - throw new Error(`Unsupported data type: ${dataType}`); - } - } - } - this.#rowsIndex += 1; - this.#hasCachedRecord = true; - } - - /** - * Checks if the value at the specified index and row number is null. - * - * @param {number} index - The index in the bitmap array. - * @param {number} rowNum - The row number to check. - * @returns {boolean} - Returns true if the value is null, otherwise false. - */ - #isNull(index, rowNum) { - let bitmap = this.#currentBitmap[index]; - let shift = rowNum % 8; - return ((IoTDBRpcDataSet.FLAG >> shift) & (bitmap & 0xff)) === 0; - } - - #fetchResults() { - this.#rowsIndex = 0; - } -} - -module.exports = IoTDBRpcDataSet; diff --git a/cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js b/cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js deleted file mode 100644 index 6bf0cb5..0000000 --- a/cdsp/information-layer/handlers/src/iotdb/utils/session-data-set.js +++ /dev/null @@ -1,135 +0,0 @@ -const { IoTDBDataType } = require("./iotdb-constants"); -const IoTDBRpcDataSet = require("./iotdb-rpc-data-sets"); -const { IoTDBDataInterpreter } = require("./iotdb-data-interpreter"); - -const dataTypeProcessors = { - [IoTDBDataType.BOOLEAN]: (bytes) => - new Int8Array(new Uint8Array(bytes.slice(0, 1).reverse()).buffer)[0], - [IoTDBDataType.INT32]: (bytes) => - new Int32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], - [IoTDBDataType.INT64]: (bytes) => - new BigInt64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], - [IoTDBDataType.FLOAT]: (bytes) => - new Float32Array(new Uint8Array(bytes.slice(0, 4).reverse()).buffer)[0], - [IoTDBDataType.DOUBLE]: (bytes) => - new Float64Array(new Uint8Array(bytes.slice(0, 8).reverse()).buffer)[0], - [IoTDBDataType.TEXT]: (bytes) => bytes.toString(), -}; - -class SessionDataSet { - /** - * Constructor for initializing the class with the provided parameters. - * - * @param {Array} columnNameList - List of column names. - * @param {Array} columnTypeList - List of column types. - * @param {Object} columnNameIndex - Index mapping of column names. - * @param {string} queryId - Unique identifier for the query. - * @param {Object} client - Client instance for database connection. - * @param {string} statementId - Unique identifier for the statement. - * @param {string} sessionId - Unique identifier for the session. - * @param {Object} queryDataSet - Data set returned from the query. - * @param {boolean} ignoreTimestamp - Flag to determine if timestamps should be ignored. - */ - constructor( - columnNameList, - columnTypeList, - columnNameIndex, - queryId, - client, - statementId, - sessionId, - queryDataSet, - ignoreTimestamp, - ) { - this.iotdbRpcDataSet = new IoTDBRpcDataSet( - columnNameList, - columnTypeList, - columnNameIndex, - queryId, - client, - statementId, - sessionId, - queryDataSet, - ignoreTimestamp, - 1024, // Buffer size or default value - ); - } - - /** - * Checks if there is a next element in the IoTDB RPC DataSet. - * - * @returns {boolean} True if there is a next element, otherwise false. - */ - hasNext() { - return this.iotdbRpcDataSet.next(); - } - - /** - * Retrieves the next row record from the dataset. - * If there is no cached record, checks if there is a next record available. - * If there is no next record available, returns null. - * Resets the cached record flag after retrieving the record. - * @returns {Object|null} The next row record or null if no more records are available. - */ - next() { - if (!this.iotdbRpcDataSet.getHasCachedRecord()) { - if (!this.hasNext()) { - return null; - } - } - this.iotdbRpcDataSet.setHasCachedRecord(false); - - return this.constructRowRecordFromValueArray(); - } - - /** - * Constructs a row record from a value array. - * - * This function processes the IoTDB RPC dataset to extract and convert - * the timestamp and column values into a structured object. - * - * @returns {Object} The constructed row record with timestamp and column values. - */ - constructRowRecordFromValueArray() { - let time64 = IoTDBDataInterpreter.extractTimestamp( - this.iotdbRpcDataSet.getTimeBytes(), - ); - let obj = { timestamp: time64 }; - - for (let i = 0; i < this.iotdbRpcDataSet.getColumnSize(); ++i) { - let index = i + 1; - let dataSetColumnIndex = i + IoTDBRpcDataSet.START_INDEX; - - if (this.iotdbRpcDataSet.getIgnoreTimestamp()) { - index -= 1; - dataSetColumnIndex -= 1; - } - - let columnName = this.iotdbRpcDataSet.getColumnNames()[index]; - let location = - this.iotdbRpcDataSet.getColumnOrdinalDict().get(columnName) - - IoTDBRpcDataSet.START_INDEX; - - if (!this.iotdbRpcDataSet.isNullByIndex(dataSetColumnIndex)) { - let valueBytes = this.iotdbRpcDataSet.getValues()[location]; - let dataType = - this.iotdbRpcDataSet.getColumnTypeDeduplicatedList()[location]; - let tsName = - this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); - - if (dataTypeProcessors[dataType]) { - obj[tsName] = dataTypeProcessors[dataType](valueBytes); - } else { - throw new Error(`Unsupported data type: ${dataType}`); - } - } else { - let tsName = - this.iotdbRpcDataSet.findColumnNameByIndex(dataSetColumnIndex); - obj[tsName] = null; - } - } - return obj; - } -} - -module.exports = SessionDataSet; diff --git a/cdsp/information-layer/handlers/src/package.json b/cdsp/information-layer/handlers/src/package.json deleted file mode 100644 index 40ea91b..0000000 --- a/cdsp/information-layer/handlers/src/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "handlers", - "version": "1.0.0", - "description": "Database handlers", - "dependencies": { - "js-yaml": "^4.1.0" - } -} diff --git a/cdsp/information-layer/handlers/src/realmdb/.gitignore b/cdsp/information-layer/handlers/src/realmdb/.gitignore deleted file mode 100644 index 645f5bd..0000000 --- a/cdsp/information-layer/handlers/src/realmdb/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Node.js -node_modules/ -package-lock.json \ No newline at end of file diff --git a/cdsp/information-layer/handlers/src/realmdb/config/database-params.js b/cdsp/information-layer/handlers/src/realmdb/config/database-params.js deleted file mode 100644 index c9d585b..0000000 --- a/cdsp/information-layer/handlers/src/realmdb/config/database-params.js +++ /dev/null @@ -1,46 +0,0 @@ -const { getEnvValue } = require("../../../config/config"); - -/* - * Contains the definition of the database name and its identifier data point for each catalog. - */ -const mediaElementsParams = Object.freeze({ - VSS: { - databaseName: "Vehicles", // name of the configured RealmDB for the VSS database - dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID - }, -}); - -/** - * Retrieves the database configuration. - * - * This function fetches the Realm application ID and API key from the environment variables. - * If either of these values is not found, it throws an error. - * - * @throws {Error} If the REALMDB_APP_ID is not set in the environment variables. - * @throws {Error} If the REALMDB_API_KEY is not set in the environment variables. - * - * @returns {Object} The database configuration object containing: - * - storePath: The path to the Realm database file. - * - realmAppId: The Realm application ID. - * - realmApiKey: The Realm API key. - */ -const getDatabaseConfig = () => { - const realmAppId = getEnvValue("REALMDB_APP_ID"); - const realmApiKey = getEnvValue("REALMDB_API_KEY"); - if (!realmAppId) { - throw new Error("REALMDB_APP_ID is required, any default has been set"); - } else if (!realmApiKey) { - throw new Error("REALMDB_API_KEY is required, any default has been set"); - } - - return Object.freeze({ - storePath: "myrealm12.realm", - realmAppId: realmAppId, - realmApiKey: realmApiKey, - }); -}; - -const databaseConfig = - getEnvValue("HANDLER_TYPE") === "realmdb" ? getDatabaseConfig() : {}; - -module.exports = { mediaElementsParams, databaseConfig }; diff --git a/cdsp/information-layer/handlers/src/realmdb/config/database-params.ts b/cdsp/information-layer/handlers/src/realmdb/config/database-params.ts new file mode 100644 index 0000000..f1c5e64 --- /dev/null +++ b/cdsp/information-layer/handlers/src/realmdb/config/database-params.ts @@ -0,0 +1,51 @@ +import { getEnvValue } from "../../../config/config"; +import { DatabaseParamsRecord } from "../../../utils/data_types"; + +interface RealmDBConfig { + storePath: string; + realmAppId: string; + realmApiKey: string; +} + +/** + * Contains the definition of the database name and its identifier data point for each catalog. + */ +export const mediaElementsParams: Readonly = { + VSS: { + databaseName: "Vehicles", // name of the configured RealmDB for the VSS database + dataPointId: "Vehicle_VehicleIdentification_VIN", // data point used as element ID + }, +}; + +/** + * Retrieves the database configuration as a read-only object. + * + * This function fetches the Realm application ID and API key from the environment variables. + * It ensures that both values are present, throwing an error if either is missing. + * + * @returns The database configuration object containing the store path, Realm app ID, and API key. + * + * @throws If the REALMDB_APP_ID or REALMDB_API_KEY environment variables are not set. + */ +const getDatabaseConfig = (): Readonly => { + const realmAppId = getEnvValue("REALMDB_APP_ID"); + const realmApiKey = getEnvValue("REALMDB_API_KEY"); + + if (!realmAppId) { + throw new Error("REALMDB_APP_ID is required, but no default has been set"); + } else if (!realmApiKey) { + throw new Error("REALMDB_API_KEY is required, but no default has been set"); + } + + return { + storePath: "myrealm12.realm", + realmAppId, + realmApiKey, + }; +}; + +/** + * Exports the database configuration depending on the handler type. + */ +export const databaseConfig = + getEnvValue("HANDLER_TYPE") === "realmdb" ? getDatabaseConfig() : undefined; diff --git a/cdsp/information-layer/handlers/src/realmdb/config/realm-config.ts b/cdsp/information-layer/handlers/src/realmdb/config/realm-config.ts new file mode 100644 index 0000000..f61616b --- /dev/null +++ b/cdsp/information-layer/handlers/src/realmdb/config/realm-config.ts @@ -0,0 +1,113 @@ +import { mediaElementsParams, databaseConfig } from "./database-params"; +import { getEnvValue } from "../../../config/config"; +import { User, Configuration, SyncConfiguration } from "realm"; // Import Realm SDK types +import { logError } from "../../../../utils/logger"; + +// Define the type for supported data points +export interface SupportedDataPoints { + [key: string]: + | "boolean" + | "string" + | "float" + | "double" + | "int8" + | "int16" + | "uint8" + | "uint16"; +} + +// Define the Realm schema structure +interface RealmSchema { + primaryKey: string; + name: string; + properties: Record; +} + +/** + * Creates a Realm schema for media elements based on the supported endpoints. + * + * @param supportedEndpoints - An object representing the data points + * that are supported, where keys are the property names and values are their data types. + * @returns The constructed Realm schema object containing the primary key, + * name of the schema, and properties with their corresponding data types. + * @throws Throws an error if an unsupported data type is encountered in the + * provided supportedEndpoints. + */ +function createMediaElementSchema( + supportedEndpoints: SupportedDataPoints, +): RealmSchema { + const properties: Record = { _id: "string" }; + + Object.entries(supportedEndpoints).forEach(([key, value]) => { + switch (value) { + case "boolean": + properties[key] = "bool"; + break; + case "string": + case "float": + case "double": + properties[key] = value; + break; + case "int8": + case "int16": + case "uint8": + case "uint16": + properties[key] = "int"; + break; + default: + throw new Error( + `The initialized data points contain an unsupported data type: ${value}`, + ); + } + }); + + return { + primaryKey: "_id", + name: mediaElementsParams.VSS.databaseName, // Assuming mediaElementsParams contains 'VSS' + properties: properties, + }; +} + +// Get the schema version from environment variables +const getSchemaVersion = (): number => { + const schemaVersion = parseInt( + getEnvValue("VERSION_REALMDB_SCHEMA") ?? "", + 10, + ); + if (isNaN(schemaVersion)) { + throw new Error( + "Version must be specified as an ENV variable and it must be 0 or a positive integer", + ); + } + return schemaVersion; +}; + +/** + * Configures the Realm database settings. + * + * @param user - The user object for authentication. + * @param supportedEndpoints - List of supported endpoints for the media element schema. + * @return The configuration object for the Realm database. + */ +export function realmConfig( + user: User, + supportedDataPoints: SupportedDataPoints, +): Configuration { + const mediaElementSchema = createMediaElementSchema(supportedDataPoints); + + return { + schema: [mediaElementSchema], + path: databaseConfig!.storePath, + sync: { + user: user, + flexible: true, + error: (error: Error) => { + logError("Realm sync error:", error); + }, + } as SyncConfiguration, // Cast sync as SyncConfiguration + schemaVersion: getSchemaVersion(), + // migration: (oldRealm: any, newRealm: any) => { + // // Migration logic here + // }, + }; +} diff --git a/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js b/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js deleted file mode 100644 index 26912dd..0000000 --- a/cdsp/information-layer/handlers/src/realmdb/config/realm-configuration.js +++ /dev/null @@ -1,78 +0,0 @@ -const { mediaElementsParams, databaseConfig } = require("./database-params"); -const { getEnvValue } = require("../../../config/config"); - -/** - * Configures the Realm database settings. - * - * @param {Object} user - The user object for authentication. - * @param {Array} supportedEndpoints - List of supported endpoints for the media element schema. - * @returns {Object} - The configuration object for the Realm database. - */ -function realmConfig(user, supportedDataPoints) { - const mediaElementSchema = createMediaElementSchema(supportedDataPoints); - return { - schema: [mediaElementSchema], - path: databaseConfig.storePath, - sync: { - user: user, - flexible: true, - error: (error) => { - console.error("Realm sync error:", error); - }, - }, - // `schemaVersion` is by default 0, it can be incremented when the schema changes, - // but you need to write the logic to migrate existing data to the new schema. - // See: https://www.mongodb.com/docs/atlas/device-sdks/sdk/node/model-data/modify-an-object-schema/ - schemaVersion: getSchemaVersion(), - migration: (oldRealm, newRealm) => { - // Perform migration logic here - }, - }; -} - -const getSchemaVersion = () => { - const schemaVersion = parseInt(getEnvValue("VERSION_REALMDB_SCHEMA"), 10); - if (isNaN(schemaVersion)) { - throw new Error( - "Version must be specified as an ENV variable and it must be 0 or a positive integer", - ); - } - return schemaVersion; -}; - -function createMediaElementSchema(supportedEndpoints) { - const properties = { _id: "string" }; - - Object.entries(supportedEndpoints).forEach(([key, value]) => { - switch (value) { - case "boolean": - properties[key] = "bool"; - break; - case "string": - case "float": - case "double": - properties[key] = value; - break; - case "int8": - case "int16": - case "uint8": - case "uint16": - properties[key] = "int"; - break; - default: - throw new Error( - `The initialized data points contains an unsupported data type: ${value}`, - ); - } - }); - - const mediaElementSchema = { - primaryKey: "_id", - name: mediaElementsParams.VSS.databaseName, - properties: properties, - }; - - return mediaElementSchema; -} - -module.exports = realmConfig; diff --git a/cdsp/information-layer/handlers/src/realmdb/package.json b/cdsp/information-layer/handlers/src/realmdb/package.json deleted file mode 100644 index 71a4504..0000000 --- a/cdsp/information-layer/handlers/src/realmdb/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "realmdb-handler", - "version": "1.0.0", - "description": "Realm database handler", - "main": "realmdb-handler.js", - "dependencies": { - "realm": "^12.13.1", - "uuid": "^9.0.1" - } -} diff --git a/cdsp/information-layer/handlers/src/realmdb/src/RealmDbHandler.ts b/cdsp/information-layer/handlers/src/realmdb/src/RealmDbHandler.ts new file mode 100644 index 0000000..37e3c46 --- /dev/null +++ b/cdsp/information-layer/handlers/src/realmdb/src/RealmDbHandler.ts @@ -0,0 +1,463 @@ +import Realm from "realm"; +import { v4 as uuidv4 } from "uuid"; +import { HandlerBase } from "../../../../handlers/src/HandlerBase"; +import { mediaElementsParams, databaseConfig } from "../config/database-params"; +import { realmConfig, SupportedDataPoints } from "../config/realm-config"; +import { + logMessage, + logError, + logWithColor, + MessageType, + COLORS, + logErrorStr, +} from "../../../../utils/logger"; +import { createErrorMessage } from "../../../../utils/error-message-helper"; +import { WebSocket, Message, STATUS_ERRORS } from "../../../utils/data_types"; + +// Define a type for changes +interface Changes { + deleted: boolean; + changedProperties: string[]; +} + +/** + * Parses the response from a media element change event. + * + * @param changes - The object containing the changed properties. + * @param mediaElement - The media element object with updated properties. + * @returns An array of objects, each containing the name and value of a changed property. + */ +function parseOnMediaElementChangeResponse( + changes: Changes, + mediaElement: any +) { + return changes.changedProperties.map((prop) => ({ + name: prop, + value: mediaElement[prop], + })); +} + +export class RealmDBHandler extends HandlerBase { + private realm: Realm | null; + private sendMessageToClients: + | ((ws: WebSocket, message: Message) => void) + | null; + private listeners: Map>; + + constructor() { + super(); + if (!databaseConfig) { + throw new Error("Invalid database configuration."); + } + this.realm = null; + this.sendMessageToClients = null; + this.listeners = new Map(); + } + + async authenticateAndConnect( + sendMessageToClients: (ws: WebSocket, message: Message) => void + ): Promise { + try { + this.sendMessageToClients = sendMessageToClients; + + const app = new Realm.App({ id: databaseConfig!.realmAppId }); + const credentials = Realm.Credentials.apiKey(databaseConfig!.realmApiKey); + const user = await app.logIn(credentials); + logMessage("Successfully authenticated to RealmDB"); + + const supportedDataPoints = + this.getSupportedDataPoints() as SupportedDataPoints; + const realmConfigObj = realmConfig(user, supportedDataPoints); + this.realm = await Realm.open(realmConfigObj); + logMessage("Connection established successfully"); + + for (const [key, value] of Object.entries(mediaElementsParams)) { + try { + const databaseName = value.databaseName; + await this.realm.objects(databaseName).subscribe(); + logMessage(`Subscribed to the database ${key}: ${databaseName}`); + } catch (error: unknown) { + logError("Error subscribing databases", error); + } + } + } catch (error: unknown) { + logError("Failed to authenticate with Realm", error); + } + } + + protected async read(message: Message, ws: WebSocket): Promise { + if (this.areNodesValid(message, ws)) { + try { + const updateMessage = await this.getMessageData(message); + this.sendMessageToClient(ws, updateMessage); + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + logError("Error reading object from Realm", error); + this.sendMessageToClient( + ws, + createErrorMessage("read", STATUS_ERRORS.NOT_FOUND, errMsg) + ); + } + } + } + + protected async write(message: Message, ws: WebSocket): Promise { + if (this.areNodesValid(message, ws)) { + try { + const mediaElement = await this.getMediaElement(message); + const nodes = message.node ? [message.node] : message.nodes; + + const transformAndAssign = (element: any, nodes: any[]) => { + nodes.forEach(({ name, value }) => { + const prop = this.transformDataPointsWithUnderscores(name); + element[prop] = value; + }); + }; + + this.realm?.write(() => { + if (mediaElement) { + transformAndAssign(mediaElement, nodes ?? []); + } else { + if (!message.tree || !mediaElementsParams[message.tree]) { + const errorMessage = + "Tree is undefined or does not exist in mediaElementsParams"; + logErrorStr(errorMessage); + this.sendMessageToClient( + ws, + createErrorMessage( + "write", + STATUS_ERRORS.NOT_FOUND, + errorMessage + ) + ); + return; + } + + const dataPointId = mediaElementsParams[message.tree].dataPointId; + const document = { _id: uuidv4(), [dataPointId]: message.id }; + transformAndAssign(document, nodes ?? []); + const databaseName = mediaElementsParams[message.tree].databaseName; + this.realm?.create(databaseName, document); + } + }); + + await this.read(message, ws); + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + const errorMessage = `Schema is not compatible for that media element: ${errMsg}`; + logErrorStr(errorMessage); + this.sendMessageToClient( + ws, + createErrorMessage("write", STATUS_ERRORS.NOT_FOUND, errorMessage) + ); + } + } + } + + protected async subscribe(message: Message, ws: WebSocket): Promise { + try { + const mediaElement = await this.getMediaElement(message); + + if (mediaElement) { + const objectId = mediaElement._id; + const { id, tree, uuid } = message; + if (!id || !tree || !mediaElementsParams[tree]) { + const errorMessage = + "Tree or id is undefined or does not exist in mediaElementsParams"; + logErrorStr(errorMessage); + this.sendMessageToClient( + ws, + createErrorMessage("write", STATUS_ERRORS.NOT_FOUND, errorMessage) + ); + return; + } + + const { databaseName, dataPointId } = mediaElementsParams[tree]; + + if (!this.listeners.has(ws)) { + this.listeners.set(ws, new Map()); + } + + if (!this.listeners.get(ws)?.has(id)) { + logWithColor( + `Subscribing element for user '${uuid}': Object ID: ${objectId} with ${dataPointId}: '${id}' on ${databaseName}`, + COLORS.GREY + ); + + const listener = (mediaElement: any, changes: Changes) => + this.onMediaElementChange( + mediaElement, + changes, + { id, tree, uuid }, + ws + ); + + mediaElement.addListener(listener); + + this.listeners.get(ws)?.set(id, { + objectId: objectId, + mediaElement: mediaElement, + listener: listener, + }); + + this.sendMessageToClient( + ws, + this.createSubscribeMessage("subscribe", message, "succeed") + ); + + logWithColor( + `Subscription added! Amount Clients: ${this.listeners.size}`, + COLORS.GREY + ); + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "subscribe", + STATUS_ERRORS.BAD_REQUEST, + `Subscription already done to ${dataPointId}: '${id}'` + ) + ); + } + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "subscribe", + STATUS_ERRORS.BAD_REQUEST, + "Object not found" + ) + ); + } + } catch (error: unknown) { + const errMsg = error instanceof Error ? error.message : "Unknown error"; + this.sendMessageToClient( + ws, + createErrorMessage( + "subscribe", + STATUS_ERRORS.SERVICE_UNAVAILABLE, + `Subscription process could not finish, try again: ${errMsg}` + ) + ); + } + } + + protected async unsubscribe(message: Message, ws: WebSocket): Promise { + const { id, tree, uuid } = message; + if (!id || !tree || !mediaElementsParams[tree]) { + const errorMessage = + "Tree or id is undefined or does not exist in mediaElementsParams"; + logErrorStr(errorMessage); + this.sendMessageToClient( + ws, + createErrorMessage("write", STATUS_ERRORS.NOT_FOUND, errorMessage) + ); + return; + } + + const { databaseName, dataPointId } = mediaElementsParams[tree]; + + if (this.listeners.has(ws)) { + const wsListeners = this.listeners.get(ws); + if (wsListeners?.has(id)) { + const listener = wsListeners.get(id); + logWithColor( + `Unsubscribing element for user '${uuid}': Object ID: ${listener.objectId} with ${dataPointId}: '${id}' on ${databaseName}`, + COLORS.GREY + ); + listener.mediaElement.removeListener(listener.listener); + wsListeners.delete(id); + + if (wsListeners.size === 0) { + this.listeners.delete(ws); + } + + this.sendMessageToClient( + ws, + this.createSubscribeMessage("unsubscribe", message, "succeed") + ); + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "unsubscribe", + STATUS_ERRORS.BAD_REQUEST, + `No subscription found for VIN: ${id}` + ) + ); + } + } else { + this.sendMessageToClient( + ws, + createErrorMessage( + "unsubscribe", + STATUS_ERRORS.BAD_REQUEST, + `No subscription found for this client` + ) + ); + } + logWithColor( + `Subscription removed! Amount Clients: ${this.listeners.size}`, + COLORS.GREY + ); + } + + async unsubscribe_client(ws: WebSocket): Promise { + this.listeners.delete(ws); + logWithColor( + `All client subscriptions removed! Amount Clients: ${this.listeners.size}`, + COLORS.GREY + ); + } + + /** + * Validates the nodes in a message against the schema of a media element. + * + * @param message - The message object containing details for the request. + * @param ws - The WebSocket object for communication. + * @returns - Returns true if all nodes are valid against the schema, otherwise false. + */ + private areNodesValid(message: Message, ws: WebSocket): boolean { + const { type, tree } = message; + if (!tree || !mediaElementsParams[tree]) { + logErrorStr("Tree is undefined or does not exist in mediaElementsParams"); + return false; + } + + const { databaseName } = mediaElementsParams[tree]; + + const mediaElementSchema = this.realm?.schema.find( + (schema) => schema.name === databaseName + ); + + const errorData = this.validateNodesAgainstSchema( + message, + mediaElementSchema?.properties ?? {} + ); + + if (errorData) { + logErrorStr( + `Error validating message nodes against schema: ${JSON.stringify(errorData)}` + ); + this.sendMessageToClient( + ws, + createErrorMessage( + `${type}`, + STATUS_ERRORS.NOT_FOUND, + JSON.stringify(errorData) + ) + ); + return false; + } + return true; + } + + /** + * Asynchronously processes a message to fetch and handle media data. + * + * @param message - The message object containing details for the request. + * @returns Returns a promise that resolves to an updated message object. + * @throws Throws an error if no media element for the message ID is found. + * @private + */ + private async getMessageData(message: Message): Promise { + const mediaElement = await this.getMediaElement(message); + + if (!mediaElement) { + throw new Error(`No data found with the Id: ${message.id}`); + } + + logWithColor( + `Media Element: \n ${JSON.stringify(mediaElement)}`, + COLORS.GREY + ); + + const responseNodes = this.parseReadResponse(message, mediaElement); + return this.createUpdateMessage(message, responseNodes); + } + + /** + * Parses the response from a read event. + * + * @param message - The message object containing node or nodes information. + * @param queryResponseObj - The query response object containing values to be mapped. + * @returns - A data object with keys from the message nodes and values from the query response. + * @private + */ + private parseReadResponse( + message: Message, + queryResponseObj: any + ): { name: string; value: any }[] { + const data: { name: string; value: any }[] = []; + const nodes = message.node ? [message.node] : message.nodes; + nodes?.forEach((node: any) => { + const prop = this.transformDataPointsWithUnderscores(node.name); + data.push({ + name: node.name, + value: queryResponseObj[prop], + }); + }); + return data; + } + + /** + * Asynchronously retrieves a media element from the database based on the provided message. + * + * @param message - The message containing the id and tree information. + * @returns - The media element object from the database. + * @private + */ + private async getMediaElement(message: Message): Promise { + try { + const { id, tree } = message; + if (!tree || !mediaElementsParams[tree]) { + logErrorStr( + "Tree is undefined or does not exist in mediaElementsParams" + ); + return false; + } + + const { databaseName, dataPointId } = mediaElementsParams[tree]; + return await this.realm + ?.objects(databaseName) + .filtered(`${dataPointId} = '${id}'`)[0]; + } catch (error: unknown) { + logError("Error trying to get media element from Realm", error); + } + } + + /** + * Handles changes to a media element and sends update messages to clients. + * @param mediaElement - The media element that has changed. + * @param changes - An object containing information about the changes. + * @param messageHeader - The header information for the message. + * @param ws - The WebSocket object for communication. + */ + private onMediaElementChange( + mediaElement: any, + changes: Changes, + messageHeader: Pick, + ws: WebSocket + ): void { + logMessage( + "Media element changed", + MessageType.RECEIVED, + `Web-Socket Connection Event Received` + ); + if (changes.deleted) { + logWithColor("MediaElement is deleted", COLORS.YELLOW); + } else { + if (changes.changedProperties.length > 0) { + const responseNodes = parseOnMediaElementChangeResponse( + changes, + mediaElement + ); + const updateMessage = this.createUpdateMessage( + messageHeader, + responseNodes + ); + this.sendMessageToClient(ws, updateMessage); + } + } + } +} diff --git a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js b/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js deleted file mode 100644 index 0ff5e83..0000000 --- a/cdsp/information-layer/handlers/src/realmdb/src/realmdb-handler.js +++ /dev/null @@ -1,402 +0,0 @@ -const Realm = require("realm"); -const Handler = require("../../handler"); -const { - mediaElementsParams, - databaseConfig, -} = require("../config/database-params"); -const realmConfig = require("../config/realm-configuration"); -const { v4: uuidv4 } = require("uuid"); -const { - logMessage, - logWithColor, - MessageType, - COLORS, -} = require("../../../../utils/logger"); -const { - createErrorMessage, -} = require("../../../../utils/error-message-helper"); - -/** - * Parses the response from a media element change event. - * - * @param {Object} changes - The object containing the changed properties. - * @param {Object} mediaElement - The media element object with updated properties. - * @returns {Array} An array of objects, each containing the name and value of a changed property. - */ -function parseOnMediaElementChangeResponse(changes, mediaElement) { - return changes.changedProperties.map((prop) => ({ - name: prop, - value: mediaElement[prop], - })); -} - -class RealmDBHandler extends Handler { - constructor() { - super(); - this.realm = null; - this._sendMessageToClients = null; - this.listeners = new Map(); - } - - async authenticateAndConnect(sendMessageToClients) { - try { - this._sendMessageToClients = sendMessageToClients; - - const app = new Realm.App({ id: databaseConfig.realmAppId }); - const credentials = Realm.Credentials.apiKey(databaseConfig.realmApiKey); - const user = await app.logIn(credentials); - console.info("Successfully authenticated to RealmDB"); - - const supportedDataPoints = this._getSupportedDataPoints(); - const realmConfigObj = realmConfig(user, supportedDataPoints); - this.realm = await Realm.open(realmConfigObj); - console.info("Connection established successfully"); - - for (const [key, value] of Object.entries(mediaElementsParams)) { - try { - const databaseName = value.databaseName; - await this.realm.objects(databaseName).subscribe(); - console.info(`Subscribed to the database ${key}: ${databaseName}`); - } catch (error) { - logMessage( - "Error subscribing databases: ".concat(error), - MessageType.ERROR, - ); - } - } - } catch (error) { - logMessage( - "Failed to authenticate with Realm: ".concat(error), - MessageType.ERROR, - ); - } - } - - async read(message, ws) { - if (this.#areNodesValid(message, ws)) { - try { - const updateMessage = await this.#getMessageData(message); - this._sendMessageToClient(ws, updateMessage); - } catch (error) { - logMessage( - `Error reading object from Realm: ${error.message}`, - MessageType.ERROR, - ); - this._sendMessageToClient( - ws, - createErrorMessage("read", 404, JSON.parse(error.message)), - ); - } - } - } - - async write(message, ws) { - if (this.#areNodesValid(message, ws)) { - try { - const mediaElement = await this.#getMediaElement(message); - const nodes = message.node ? [message.node] : message.nodes; - - const transformAndAssign = (element, nodes) => { - nodes.forEach(({ name, value }) => { - const prop = this._transformDataPointsWithUnderscores(name); - element[prop] = value; - }); - }; - - this.realm.write(() => { - if (mediaElement) { - // Write on existing media element - transformAndAssign(mediaElement, nodes); - } else { - // Create a new media element - const dataPointId = mediaElementsParams[message.tree].dataPointId; - const document = { _id: uuidv4(), [dataPointId]: message.id }; - transformAndAssign(document, nodes); - const databaseName = mediaElementsParams[message.tree].databaseName; - this.realm.create(databaseName, document); - } - }); - - // Read the updated media element - await this.read(message, ws); - } catch (error) { - const errorMessage = `Schema is not compatible for that media element: ${error.message}`; - logMessage(errorMessage, MessageType.ERROR); - this._sendMessageToClient( - ws, - createErrorMessage("write", 404, errorMessage), - ); - } - } - } - - async subscribe(message, ws) { - try { - const mediaElement = await this.#getMediaElement(message); - - if (mediaElement) { - const objectId = mediaElement._id; - const { id, tree, uuid } = message; - const { databaseName, dataPointId } = mediaElementsParams[tree]; - - if (!this.listeners.has(ws)) { - this.listeners.set(ws, new Map()); - } - - if (!this.listeners.get(ws).has(id)) { - logWithColor( - `Subscribing element for user '${uuid}': Object ID: ${objectId} with ${dataPointId}: '${id}' on ${databaseName}`, - COLORS.GREY, - ); - - const listener = (mediaElement, changes) => - this.#onMediaElementChange( - mediaElement, - changes, - { - id: id, - tree: tree, - uuid: uuid, - }, - ws, - ); - - mediaElement.addListener(listener); - - // Store the listener so we can remove it later - this.listeners.get(ws).set(id, { - objectId: objectId, - mediaElement: mediaElement, - listener: listener, - }); - - this._sendMessageToClient( - ws, - this._createSubscribeMessage("subscribe", message, "succeed"), - ); - - logWithColor( - `Subscription added! Amount Clients: ${this.listeners.size}`, - COLORS.GREY, - ); - } else { - this._sendMessageToClient( - ws, - createErrorMessage( - "subscribe", - 400, - `Subscription already done to ${dataPointId}: '${id}'`, - ), - ); - } - } else { - this._sendMessageToClient( - ws, - createErrorMessage("subscribe", 400, "Object not found"), - ); - } - } catch (error) { - this._sendMessageToClient( - ws, - createErrorMessage( - "subscribe", - 503, - "Subscription process could not finish, try again", - ), - ); - } - } - - async unsubscribe(message, ws) { - const { id, tree, uuid } = message; - const { databaseName, dataPointId } = mediaElementsParams[tree]; - - if (this.listeners.has(ws)) { - const wsListeners = this.listeners.get(ws); - if (wsListeners.has(id)) { - const listener = wsListeners.get(id); - logWithColor( - `Unsubscribing element for user '${uuid}': Object ID: ${listener.objectId} with ${dataPointId}: '${id}' on ${databaseName}`, - COLORS.GREY, - ); - listener.mediaElement.removeListener(listener.listener); - wsListeners.delete(id); - - if (wsListeners.size === 0) { - this.listeners.delete(ws); - } - - this._sendMessageToClient( - ws, - this._createSubscribeMessage("unsubscribe", message, "succeed"), - ); - } else { - this._sendMessageToClient( - ws, - createErrorMessage( - "unsubscribe", - 400, - `No subscription found for VIN: ${id}`, - ), - ); - } - } else { - this._sendMessageToClient( - ws, - createErrorMessage( - "unsubscribe", - 400, - `No subscription found for this client`, - ), - ); - } - logWithColor( - `Subscription removed! Amount Clients: ${this.listeners.size}`, - COLORS.GREY, - ); - } - - async unsubscribe_client(ws) { - this.listeners.delete(ws); - logWithColor( - `All client subscriptions removed! Amount Clients: ${this.listeners.size}`, - COLORS.GREY, - ); - } - - /** - * Validates the nodes in a message against the schema of a media element. - * - * @param {Object} message - The message object containing details for the request. - * @param {WebSocket} ws - The WebSocket object for communication. - * @returns {boolean} - Returns true if all nodes are valid against the schema, otherwise false. - */ - #areNodesValid(message, ws) { - const { type, tree } = message; - const { databaseName } = mediaElementsParams[tree]; - - // Get the schema for the mediaElement to check if fields are valid - const mediaElementSchema = this.realm.schema.find( - (schema) => schema.name === databaseName, - ); - - const errorData = this._validateNodesAgainstSchema( - message, - mediaElementSchema.properties, - ); - - if (errorData) { - logMessage( - `Error validating message nodes against schema: ${JSON.stringify(errorData)}`, - MessageType.ERROR, - ); - this._sendMessageToClient( - ws, - createErrorMessage(`${type}`, 404, errorData), - ); - - return false; - } - return true; - } - - /** - * Asynchronously processes a message to fetch and handle media data. - * - * @param {Object} message - The message object containing details for the request. - * @returns {Promise} - Returns a promise that resolves to an updated message object. - * @throws {Error} - Throws an error if no media element for the message ID is found. - * @private - */ - async #getMessageData(message) { - const mediaElement = await this.#getMediaElement(message); - - if (!mediaElement) { - throw new Error(`\"No data found with the Id: ${message.id}\"`); - } - - logWithColor( - `Media Element: \n ${JSON.stringify(mediaElement)}`, - COLORS.GREY, - ); - - const responseNodes = this.#parseReadResponse(message, mediaElement); - return this._createUpdateMessage(message, responseNodes); - } - - /** - * Parses the response from a read event. - * - * @param {Object} message - The message object containing node or nodes information. - * @param {Object} queryResponseObj - The query response object containing values to be mapped. - * @returns {Object} - A data object with keys from the message nodes and values from the query response. - * @private - */ - #parseReadResponse(message, queryResponseObj) { - const data = []; - const nodes = message.node ? [message.node] : message.nodes; - nodes.forEach((node) => { - const prop = this._transformDataPointsWithUnderscores(node.name); - data.push({ - name: node.name, - value: queryResponseObj[prop], - }); - }); - return data; - } - - /** - * Asynchronously retrieves a media element from the database based on the provided message. - * - * @param {Object} message - The message containing the id and tree information. - * @returns {Promise} - The media element object from the database. - * @private - */ - async #getMediaElement(message) { - try { - const { id, tree } = message; - const { databaseName, dataPointId } = mediaElementsParams[tree]; - return await this.realm - .objects(databaseName) - .filtered(`${dataPointId} = '${id}'`)[0]; - } catch (error) { - logMessage( - `Error trying to get media element from Realm: ${error.message}`, - MessageType.ERROR, - ); - } - } - - /** - * Handles changes to a media element and sends update messages to clients. - * @param {mediaElement} mediaElement - The media element that has changed. - * @param {object} changes - An object containing information about the changes. - * @param {{tree, id, uuid}} messageHeader - The header information for the message. - * @param {WebSocket} ws - The WebSocket object for communication. - * @private - */ - #onMediaElementChange(mediaElement, changes, messageHeader, ws) { - logMessage( - "Media element changed", - MessageType.RECEIVED, - `Web-Socket Connection Event Received`, - ); - if (changes.deleted) { - logMessage(changes.deleted, COLORS.YELLOW, "MediaElement is deleted"); - } else { - if (changes.changedProperties.length > 0) { - const responseNodes = parseOnMediaElementChangeResponse( - changes, - mediaElement, - ); - const updateMessage = this._createUpdateMessage( - messageHeader, - responseNodes, - ); - this._sendMessageToClient(ws, updateMessage); - } - } - } -} - -module.exports = RealmDBHandler; diff --git a/cdsp/information-layer/handlers/utils/data_types.ts b/cdsp/information-layer/handlers/utils/data_types.ts new file mode 100644 index 0000000..9e2fd84 --- /dev/null +++ b/cdsp/information-layer/handlers/utils/data_types.ts @@ -0,0 +1,52 @@ +export interface MessageBase { + type: "read" | "write" | "subscribe" | "unsubscribe" | "update"; + id: string; + tree: string; + uuid: string; + dateTime?: string; + status?: string; +} + +export interface MessageWithNode extends MessageBase { + node: { name: string; value: any }; + nodes?: never; // Ensures 'nodes' cannot be present if 'node' is used +} + +export interface MessageWithNodes extends MessageBase { + nodes: Array<{ name: string; value: any }>; + node?: never; // Ensures 'node' cannot be present if 'nodes' is used +} + +export type Message = MessageWithNode | MessageWithNodes; + +export type ErrorMessage = { + category: string; + statusCode: number; + message: string; +}; + +export const STATUS_ERRORS = { + BAD_REQUEST: 400, + NOT_FOUND: 404, + UNAUTHORIZED: 401, + FORBIDDEN: 403, + INTERNAL_SERVER_ERROR: 500, + SERVICE_UNAVAILABLE: 503, +} as const; + +interface databaseParams { + databaseName: string; + dataPointId: string; +} + +export interface DatabaseParamsRecord { + [key: string]: databaseParams; +} + +export interface WebSocket { + send: (data: string) => void; +} + +export interface DataPointSchema { + [key: string]: any; +} diff --git a/cdsp/information-layer/package-lock.json b/cdsp/information-layer/package-lock.json new file mode 100644 index 0000000..0a6cafa --- /dev/null +++ b/cdsp/information-layer/package-lock.json @@ -0,0 +1,6741 @@ +{ + "name": "information-layer", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "information-layer", + "version": "1.0.0", + "dependencies": { + "ajv": "^8.17.1", + "dotenv": "^16.4.5", + "js-yaml": "^4.1.0", + "realm": "^12.13.1", + "thrift": "^0.21.0", + "uuid": "^10.0.0", + "ws": "^8.18.0" + }, + "devDependencies": { + "@types/ajv": "^0.0.5", + "@types/js-yaml": "^4.0.9", + "@types/node": "^22.7.0", + "@types/thrift": "^0.10.17", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.5.12", + "copyfiles": "^2.4.1", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "3.3.3", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "typescript": "^5.6.2", + "typescript-eslint": "^8.4.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.25.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@realm/fetch": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@realm/fetch/-/fetch-0.1.1.tgz", + "integrity": "sha512-hkTprw79RXGv54Je0DrjpQPLaz4QID2dO3FmthAQQWAkqwyrqMzrCGzJzLlmTKWZFsgLrN8KQyNewod27P+nJg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/ajv": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@types/ajv/-/ajv-0.0.5.tgz", + "integrity": "sha512-0UD98SZLwPk6cTMZoLs8W4XSAWgqT9nyoZiBw+uXEPf1u5h+Dn2ztMG4Is9pDA+9D7GKbCTfIkQK/hNgoWVQcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-int64": { + "version": "0.4.32", + "resolved": "https://registry.npmjs.org/@types/node-int64/-/node-int64-0.4.32.tgz", + "integrity": "sha512-xf/JsSlnXQ+mzvc0IpXemcrO4BrCfpgNpMco+GLcXkFk01k/gW9lGJu+Vof0ZSvHK6DsHJDPSbjFPs36QkWXqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/thrift": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@types/thrift/-/thrift-0.10.17.tgz", + "integrity": "sha512-bDX6d5a5ZDWC81tgDv224n/3PKNYfIQJTPHzlbk4vBWJrYXF6Tg1ncaVmP/c3JbGN2AK9p7zmHorJC2D6oejGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/node-int64": "*", + "@types/q": "*" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", + "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/type-utils": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", + "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", + "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", + "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.8.1", + "@typescript-eslint/utils": "8.8.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", + "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", + "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/visitor-keys": "8.8.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", + "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.8.1", + "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/typescript-estree": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", + "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.8.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz", + "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==", + "license": "MIT" + }, + "node_modules/browserslist": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "license": "Apache-2.0", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz", + "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.68.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.68.0.tgz", + "integrity": "sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.1.tgz", + "integrity": "sha512-CgeuL5uom6j/ZVrg7G/+1IXqRY8JXX4Hghfy5YE0EhoYQWvndP1kufu58cmZLNIDKnRhZrXfdS9urVWx98AipQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "peer": true + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/realm": { + "version": "12.13.1", + "resolved": "https://registry.npmjs.org/realm/-/realm-12.13.1.tgz", + "integrity": "sha512-fAs70ZCBf1P7htVhOTrDMFHD6SzoGXVsALy6DpOPR6t0LXoK635cKxBMECX3bYdCgI7+riSfdoWXLA/7g5yTSQ==", + "deprecated": "This version uses Atlas Device Sync, please install `realm@community` and read https://github.com/realm/realm-js/blob/main/DEPRECATION.md for more information.", + "hasInstallScript": true, + "license": "apache-2.0", + "dependencies": { + "@realm/fetch": "^0.1.1", + "bson": "^4.7.2", + "debug": "^4.3.4", + "node-machine-id": "^1.1.12", + "path-browserify": "^1.0.1", + "prebuild-install": "^7.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react-native": ">=0.71.0" + }, + "peerDependenciesMeta": { + "react-native": { + "optional": true + } + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/thrift": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/thrift/-/thrift-0.21.0.tgz", + "integrity": "sha512-AW8rwHYjeqXisS8B1iwko2gkNMFwSRJ+bO/W0xTGqRspTD3lGHwZx438+pHdOJ3GwpRAnK7TKbjqPOrHAa7ZwQ==", + "license": "Apache-2.0", + "dependencies": { + "browser-or-node": "^1.2.1", + "isomorphic-ws": "^4.0.1", + "node-int64": "^0.4.0", + "q": "^1.5.0", + "ws": "^5.2.3" + }, + "engines": { + "node": ">= 10.18.0" + } + }, + "node_modules/thrift/node_modules/ws": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz", + "integrity": "sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "ejs": "^3.1.10", + "fast-json-stable-stringify": "^2.1.0", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz", + "integrity": "sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.8.1", + "@typescript-eslint/parser": "8.8.1", + "@typescript-eslint/utils": "8.8.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/cdsp/information-layer/package.json b/cdsp/information-layer/package.json index a86d372..1a7e849 100644 --- a/cdsp/information-layer/package.json +++ b/cdsp/information-layer/package.json @@ -3,20 +3,40 @@ "version": "1.0.0", "description": "WebSocket server with handlers for IoTDB and RealmDB", "private": true, - "workspaces": [ - "handlers/src", - "handlers/src/iotdb", - "handlers/src/realmdb", - "router" - ], - "main": "router/src/websocket-server.js", + "main": "dist/router/src/websocket-server.js", "scripts": { - "start": "node router/src/websocket-server.js" + "copy-files": "npx copyfiles -u 3 ./handlers/config/schema-files/**/* ./dist/handlers/config/schema-files/", + "check-format": "prettier --check './**/*.{ts,tsx}'", + "prebuild": "rimraf /dist", + "lint": "eslint", + "lint-and-fix": "eslint --fix", + "build": "tsc && npm run copy-files", + "start": "node ./dist/router/src/websocket-server.js" }, "dependencies": { - "dotenv": "^16.4.5" + "ajv": "^8.17.1", + "dotenv": "^16.4.5", + "js-yaml": "^4.1.0", + "realm": "^12.13.1", + "thrift": "^0.21.0", + "uuid": "^10.0.0", + "ws": "^8.18.0" }, "devDependencies": { - "prettier": "3.3.3" + "@types/ajv": "^0.0.5", + "@types/js-yaml": "^4.0.9", + "@types/node": "^22.7.0", + "@types/thrift": "^0.10.17", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.5.12", + "copyfiles": "^2.4.1", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "ts-jest": "^29.2.5", + "typescript": "^5.6.2", + "typescript-eslint": "^8.4.0" } } diff --git a/cdsp/information-layer/router/.gitignore b/cdsp/information-layer/router/.gitignore index eec8018..58c3437 100644 --- a/cdsp/information-layer/router/.gitignore +++ b/cdsp/information-layer/router/.gitignore @@ -1,9 +1,2 @@ -# MongoDB Realm -mongodb-realm/ - -# Node.js -node_modules/ -package-lock.json - # MAC **/.DS_Store \ No newline at end of file diff --git a/cdsp/information-layer/router/README.md b/cdsp/information-layer/router/README.md new file mode 100644 index 0000000..4f5a7f0 --- /dev/null +++ b/cdsp/information-layer/router/README.md @@ -0,0 +1,4 @@ +# Websocket-Server + +This project is a [WebSocket server](src/websocket-server.ts) that dynamically integrates different database handlers (e.g., RealmDB, IoTDB) based on the [configuration](../handlers/README.md). It listens for incoming WebSocket connections, processes messages according to the specified handler, and broadcasts messages to connected clients. + diff --git a/cdsp/information-layer/router/config/config.js b/cdsp/information-layer/router/config/config.js deleted file mode 100644 index 4233552..0000000 --- a/cdsp/information-layer/router/config/config.js +++ /dev/null @@ -1,14 +0,0 @@ -const dotenv = require("dotenv"); -dotenv.config(); - -const getHandlerType = () => { - const handlerType = process.env.HANDLER_TYPE; - if (!handlerType) { - throw new Error("HANDLER_TYPE must be specified as an ENV variable"); - } - return handlerType.toLowerCase(); -}; - -module.exports = { - getHandlerType, -}; diff --git a/cdsp/information-layer/router/config/config.ts b/cdsp/information-layer/router/config/config.ts new file mode 100644 index 0000000..33768ca --- /dev/null +++ b/cdsp/information-layer/router/config/config.ts @@ -0,0 +1,13 @@ +import dotenv from "dotenv"; +dotenv.config(); + +// Define the type of the handler, which will be a lowercase string +export const getHandlerType = (): string => { + const handlerType = process.env.HANDLER_TYPE; + + if (!handlerType) { + throw new Error("HANDLER_TYPE must be specified as an ENV variable"); + } + + return handlerType.toLowerCase(); // Ensure it's returned as lowercase +}; diff --git a/cdsp/information-layer/router/package.json b/cdsp/information-layer/router/package.json deleted file mode 100644 index 333c2ac..0000000 --- a/cdsp/information-layer/router/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "websocket-server", - "version": "1.0.0", - "description": "WebSocket server", - "main": "src/websocket-server.js", - "scripts": { - "start": "node src/websocket-server.js" - }, - "dependencies": { - "ajv": "^8.17.1", - "ws": "^7.4.6" - } -} diff --git a/cdsp/information-layer/router/src/websocket-server.js b/cdsp/information-layer/router/src/websocket-server.js deleted file mode 100644 index 64173b1..0000000 --- a/cdsp/information-layer/router/src/websocket-server.js +++ /dev/null @@ -1,74 +0,0 @@ -const WebSocket = require("ws"); -const RealmDBHandler = require("../../handlers/src/realmdb/src/realmdb-handler"); -const IoTDBHandler = require("../../handlers/src/iotdb/src/iotdb-handler"); -const { getHandlerType } = require("../config/config"); -const { validateMessage } = require("../utils/message-validator"); -const { - logMessage, - logWithColor, - MessageType, - COLORS, -} = require("../../utils/logger"); - -const handlerType = getHandlerType(); -let handler; - -logWithColor(`\n ** Handler: ${handlerType} ** \n`, COLORS.BOLD); - -switch (handlerType) { - case "realmdb": - handler = new RealmDBHandler(); - break; - case "iotdb": - handler = new IoTDBHandler(); - break; - default: - throw new Error("Unsupported handler type"); -} - -const server = new WebSocket.Server({ port: 8080 }); - -// Define clients array globally -let clients = []; - -server.on("connection", (ws) => { - logWithColor("* Client connected *", COLORS.YELLOW); - clients.push(ws); // Add client to the array - - ws.on("message", (message) => { - logMessage(JSON.stringify(message), MessageType.RECEIVED); - const validatedMessage = validateMessage(message); - - if (validatedMessage instanceof Error) { - logMessage( - `Invalid message format: ${validatedMessage.message}`, - MessageType.ERROR - ); - - JSON.parse(validatedMessage.message).forEach((error) => { - ws.send(JSON.stringify(error)); - }); - } else { - handler.handleMessage(validatedMessage, ws); - } - }); - - ws.on("close", () => { - // Remove all client listeners - handler.unsubscribe_client(ws); - // Remove disconnected client from the array - clients = clients.filter((client) => client !== ws); - console.info("* Client disconnected *"); - }); -}); - -const sendMessageToClients = (message) => { - logMessage(JSON.stringify(message), MessageType.SENT); - clients.forEach((client) => { - client.send(JSON.stringify(message)); - }); -}; - -console.info(`Starting authentication and connection ...`); -handler.authenticateAndConnect(sendMessageToClients); -logWithColor(`Web-Socket server started on ws://localhost:8080\n`, COLORS.BOLD); diff --git a/cdsp/information-layer/router/src/websocket-server.ts b/cdsp/information-layer/router/src/websocket-server.ts new file mode 100644 index 0000000..aa6f93a --- /dev/null +++ b/cdsp/information-layer/router/src/websocket-server.ts @@ -0,0 +1,96 @@ +import WebSocket, { RawData } from "ws"; +import { RealmDBHandler } from "../../handlers/src/realmdb/src/RealmDbHandler"; +import { IoTDBHandler } from "../../handlers/src/iotdb/src/IoTDBHandler"; +import { HandlerBase } from "../../handlers/src/HandlerBase"; +import { getHandlerType } from "../config/config"; +import { validateMessage } from "../utils/message-validator"; +import { + logMessage, + logError, + logWithColor, + MessageType, + COLORS, +} from "../../utils/logger"; +import { Message } from "../../handlers/utils/data_types"; + +// Define the handler as the base class type +let handler: HandlerBase; + +const handlerType: string = getHandlerType(); + +logWithColor(`\n ** Handler: ${handlerType} ** \n`, COLORS.BOLD); + +// Instantiate the correct handler based on the handler type +switch (handlerType) { + case "realmdb": + handler = new RealmDBHandler(); + break; + case "iotdb": + handler = new IoTDBHandler(); + break; + default: + throw new Error("Unsupported handler type"); +} + +// WebSocket server creation +const server = new WebSocket.Server({ port: 8080 }); + +// Define clients array globally to store connected clients +let clients: WebSocket[] = []; + +// Handle new client connections +server.on("connection", (ws: WebSocket) => { + logWithColor("* Client connected *", COLORS.YELLOW); + clients.push(ws); // Add client to the array + + // Handle messages from the client + ws.on("message", (message: WebSocket.RawData) => { + let messageString = rawDataToString(message); + logMessage(JSON.stringify(messageString), MessageType.RECEIVED); + const validatedMessage = validateMessage(messageString); + + if (validatedMessage instanceof Error) { + logError("Invalid message format", validatedMessage); + JSON.parse(validatedMessage.message).forEach((error: any) => { + ws.send(JSON.stringify(error)); + }); + } else { + // Pass the validated message to the handler + handler.handleMessage(validatedMessage, ws); + } + }); + + // Handle client disconnection + ws.on("close", () => { + handler.unsubscribe_client(ws); // Remove all client listeners + clients = clients.filter((client) => client !== ws); // Remove client from array + logMessage("* Client disconnected *"); + }); +}); + +// Function to broadcast messages to all connected clients +const sendMessageToClients = (message: Message) => { + logMessage(JSON.stringify(message), MessageType.SENT); + clients.forEach((client) => { + client.send(JSON.stringify(message)); + }); +}; + +// Initialize handler and authenticate +logMessage(`Starting authentication and connection ...`); +handler.authenticateAndConnect(sendMessageToClients); + +// Log server start +logWithColor(`Web-Socket server started on ws://localhost:8080\n`, COLORS.BOLD); + +function rawDataToString(message: RawData): string { + if (typeof message === "string") { + return message; + } else if (Buffer.isBuffer(message)) { + return message.toString(); + } else if (message instanceof ArrayBuffer) { + return new TextDecoder().decode(message); + } else { + throw new Error("Unsupported message type"); + } +} diff --git a/cdsp/information-layer/router/utils/message-validator.js b/cdsp/information-layer/router/utils/message-validator.ts similarity index 64% rename from cdsp/information-layer/router/utils/message-validator.js rename to cdsp/information-layer/router/utils/message-validator.ts index ce7ee18..4b24385 100644 --- a/cdsp/information-layer/router/utils/message-validator.js +++ b/cdsp/information-layer/router/utils/message-validator.ts @@ -1,27 +1,38 @@ -const Ajv = require("ajv"); -const { createErrorMessage } = require("../../utils/error-message-helper"); +import Ajv, { ErrorObject } from "ajv"; +import { createErrorMessage } from "../../utils/error-message-helper"; +import { + ErrorMessage, + Message, + STATUS_ERRORS, +} from "../../handlers/utils/data_types"; +// Initialize AJV with specific options const ajv = new Ajv({ allErrors: true, strict: true, allowUnionTypes: true, }); +// Define the headers for validation const itemsHeader = ["type", "tree", "id", "uuid"]; +const ERROR_CATEGORY = "messageValidation"; -const standardError = createErrorMessage( - "messageValidation", - 400, - `Received an invalid message.`, -); +// Standard error message template +const standardError: ErrorMessage = { + category: ERROR_CATEGORY, + statusCode: STATUS_ERRORS.BAD_REQUEST, + message: "Received an invalid message.", +}; -const createCommonStructure = (requestType) => ({ +// Helper to create the common structure for different message types +const createCommonStructure = (requestType: string) => ({ type: { type: "string", enum: [requestType] }, tree: { type: "string", enum: ["VSS"] }, id: { type: "string" }, uuid: { type: "string" }, }); +// Define the schemas for message validation const schemas = { read: { type: "object", @@ -113,60 +124,68 @@ const schemas = { }, }; -const customizeErrorMessage = (errors) => { +// Function to customize error messages from AJV validation +const customizeErrorMessage = ( + errors: ErrorObject[] | null | undefined, +): ErrorMessage[] => { + if (!errors) return [standardError]; + return errors.map((err) => { - switch (err.keyword) { + const { keyword, instancePath, params } = err; + + switch (keyword) { case "required": return createErrorMessage( - "messageValidation", - 400, - `Missing required field: ${err.params.missingProperty}.`, + ERROR_CATEGORY, + STATUS_ERRORS.BAD_REQUEST, + `Missing required field: ${params.missingProperty}.`, ); case "type": return createErrorMessage( - "messageValidation", - 400, - `Invalid type for field '${err.instancePath}': expected ${err.params.type}.`, + ERROR_CATEGORY, + STATUS_ERRORS.BAD_REQUEST, + `Invalid type for field '${instancePath}': expected ${params.type}.`, ); case "enum": if (err.instancePath === "/tree") { return createErrorMessage( - "messageValidation", - 404, - `Unsupported message 'tree': must be one of ${err.params.allowedValues.join(", ")}`, + ERROR_CATEGORY, + STATUS_ERRORS.NOT_FOUND, + `Unsupported message 'tree': must be one of ${params.allowedValues?.join(", ")}`, ); - } else { - return standardError; } + break; case "additionalProperties": return createErrorMessage( - "messageValidation", - 404, - `Unsupported property '${err.params.additionalProperty}' found`, + ERROR_CATEGORY, + STATUS_ERRORS.NOT_FOUND, + `Unsupported property '${params.additionalProperty}' found`, ); default: return createErrorMessage( - "messageValidation", - 400, - `Validation error on field '${err.instancePath}': ${err.message}.`, + ERROR_CATEGORY, + STATUS_ERRORS.BAD_REQUEST, + `Validation error on field '${instancePath}': ${err.message}.`, ); } + + return standardError; }); }; /** * Validates a JSON message against predefined schemas. * - * @param {string} message - The JSON message to be validated. - * @returns {Object|Error} - Returns the parsed message if valid, otherwise throws an error. + * @param message - The JSON message to be validated. + * @returns The parsed message if valid, otherwise throws an error. */ -const validateMessage = (message) => { +export const validateMessage = (message: string): Message | Error => { try { // Try to parse the JSON message - const parsedMessage = JSON.parse(message); + const parsedMessage: Message = JSON.parse(message); // Determine the schema key based on the message type - let schemaKey; + let schemaKey: keyof typeof schemas; switch (parsedMessage.type) { case "read": schemaKey = parsedMessage.nodes ? "multiNodeRead" : "read"; @@ -184,7 +203,7 @@ const validateMessage = (message) => { const error = JSON.stringify([ createErrorMessage( "messageValidation", - 404, + STATUS_ERRORS.NOT_FOUND, `Unsupported message type (${parsedMessage.type})`, ), ]); @@ -199,25 +218,21 @@ const validateMessage = (message) => { throw new Error(JSON.stringify(customError)); } return parsedMessage; - } catch (error) { + } catch (error: unknown) { if (error instanceof SyntaxError) { // Handle JSON parsing error - - const error = JSON.stringify([ + const jsonError = JSON.stringify([ createErrorMessage( "messageValidation", - 404, + STATUS_ERRORS.NOT_FOUND, "The JSON format in the message is not valid.", ), ]); - return new Error(error); + return new Error(jsonError); } else { // Handle other errors - return new Error(error.message); + const errMsg = error instanceof Error ? error.message : "Unknown error"; + return new Error(errMsg); } } }; - -module.exports = { - validateMessage, -}; diff --git a/cdsp/information-layer/tsconfig.json b/cdsp/information-layer/tsconfig.json new file mode 100644 index 0000000..6a50823 --- /dev/null +++ b/cdsp/information-layer/tsconfig.json @@ -0,0 +1,115 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + "incremental": true /* Save .tsbuildinfo files to allow for incremental compilation of projects. */, + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + "rootDir": "." /* Specify the root folder within your source files. */, + "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, + "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + // "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": [ + "./**/*.ts", + "./handlers/src/iotdb/gen-nodejs/**/*.js" // Ensure JS files in gen-nodejs are included + ], + "exclude": ["./dist", "node_modules"] +} diff --git a/cdsp/information-layer/utils/error-message-helper.js b/cdsp/information-layer/utils/error-message-helper.js deleted file mode 100644 index 9c0252b..0000000 --- a/cdsp/information-layer/utils/error-message-helper.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Creates an error message object. - * @param {string} type - The type of the error. - * @param {number} errorCode - The error code associated with the error. - * @param {string|Object} error - A descriptive error message. - * @returns {Object} An object containing the error details. - */ -function createErrorMessage(type, errorCode, error) { - return { type: `${type}:status`, errorCode, error }; -} - -module.exports = { createErrorMessage }; diff --git a/cdsp/information-layer/utils/error-message-helper.ts b/cdsp/information-layer/utils/error-message-helper.ts new file mode 100644 index 0000000..48d6218 --- /dev/null +++ b/cdsp/information-layer/utils/error-message-helper.ts @@ -0,0 +1,19 @@ +import { ErrorMessage } from "../handlers/utils/data_types"; + +/** + * Creates an error message object with the specified category, status code, and message. + * + * @param category - The category of the error. + * @param statusCode - The HTTP status code associated with the error. + * @param message - A descriptive message explaining the error. + * @returns An ErrorMessage object containing the category, status code, and message. + */ +export const createErrorMessage = ( + category: string, + statusCode: number, + message: string, +): ErrorMessage => ({ + category, + statusCode, + message, +}); diff --git a/cdsp/information-layer/utils/logger.js b/cdsp/information-layer/utils/logger.js deleted file mode 100644 index 8b0f957..0000000 --- a/cdsp/information-layer/utils/logger.js +++ /dev/null @@ -1,51 +0,0 @@ -const COLORS = { - RESET: "\x1b[0m", - GREEN: "\x1b[32m", - BLUE: "\x1b[34m", - RED: "\x1b[31m", - PALE_WHITE: "\x1b[37m", - GREY: "\x1b[90m", - YELLOW: "\x1b[33m", - BOLD: "\x1b[1m", -}; - -const MessageType = { - RECEIVED: COLORS.GREEN, - SENT: COLORS.BLUE, - ERROR: COLORS.RED, - OTHER: COLORS, -}; - -function logWithColor(message, color) { - console.log("\n", color, message, COLORS.RESET); -} - -function logMessage(featureStr, type, label = "") { - let color = type; - const datetimeNow = new Date().toLocaleString(); - let labelText; - switch (type) { - case MessageType.RECEIVED: - labelText = "\u2193 ".concat(label || "Client Received"); - break; - case MessageType.SENT: - labelText = "\u2191 ".concat(label || "Client Sent"); - break; - case MessageType.ERROR: - labelText = "\u2716".concat(label || "Internal Error"); - break; - default: - if (Object.values(MessageType.OTHER).includes(type)) { - labelText = label || "Message"; - } else { - color = COLORS.RESET; - labelText = label || "777"; - } - break; - } - const logEntry = `\n${COLORS.PALE_WHITE}${datetimeNow}${COLORS.RESET} ${color}${labelText}${COLORS.RESET}`; - console.log(logEntry); - console.log(featureStr); -} - -module.exports = { logMessage, logWithColor, MessageType, COLORS }; diff --git a/cdsp/information-layer/utils/logger.ts b/cdsp/information-layer/utils/logger.ts new file mode 100644 index 0000000..da127d0 --- /dev/null +++ b/cdsp/information-layer/utils/logger.ts @@ -0,0 +1,104 @@ +// Define COLORS as an enum +export enum COLORS { + RESET = "\x1b[0m", + GREEN = "\x1b[32m", + BLUE = "\x1b[34m", + RED = "\x1b[31m", + PALE_WHITE = "\x1b[37m", + GREY = "\x1b[90m", + YELLOW = "\x1b[33m", + BOLD = "\x1b[1m", +} + +// Define the MessageType enum to strictly enforce allowed types +export enum MessageType { + RECEIVED = "RECEIVED", + SENT = "SENT", + ERROR = "ERROR", + WARNING = "WARNING", + OTHER = "OTHER", +} + +// Mapping MessageType to their corresponding colors +const MessageTypeColors: Record = { + [MessageType.RECEIVED]: COLORS.GREEN, + [MessageType.SENT]: COLORS.BLUE, + [MessageType.ERROR]: COLORS.RED, + [MessageType.WARNING]: COLORS.YELLOW, + [MessageType.OTHER]: COLORS.PALE_WHITE, +}; + +/** + * Logs a message to the console with a specified color. + * + * @param message - The message to be logged. + * @param color - The color to apply to the message. Should be a value from the COLORS enum. + */ +export function logWithColor(message: string, color: COLORS): void { + console.log("\n", color, message, COLORS.RESET); +} + +/** + * Logs a message with a specific format including a timestamp, message type, and label. + * + * @param featureStr - The main message string to be logged. + * @param type - The type of the message, which determines the label and color. Defaults to MessageType.OTHER. + * @param label - An optional label to override the default label for the message type. + */ +export function logMessage( + featureStr: string, + type: MessageType = MessageType.OTHER, + label: string = "" +): void { + let color: COLORS = MessageTypeColors[type]; + const dateTimeNow = new Date().toLocaleString(); + let labelText: string; + + switch (type) { + case MessageType.RECEIVED: + labelText = "\u2193 ".concat(label || "Client Received"); + break; + case MessageType.SENT: + labelText = "\u2191 ".concat(label || "Client Sent"); + break; + case MessageType.ERROR: + labelText = "\u2716 ".concat(label || "Internal Error"); + break; + case MessageType.OTHER: + labelText = label || "Message"; + color = COLORS.RESET; + break; + default: + labelText = label || "Unknown"; + color = COLORS.RESET; + } + + const logEntry = `\n${COLORS.PALE_WHITE}${dateTimeNow}${COLORS.RESET} ${color}${labelText}${COLORS.RESET}`; + console.log(logEntry); + console.log(featureStr); +} + +/** + * Logs an error message with a specified feature string. + * + * @param featureStr - A string representing the feature or context where the error occurred. + * @param error - The error object or unknown error to be logged. + * If it's an instance of Error, its message will be logged. + * Otherwise, 'Unknown error' will be logged. + */ +export function logError(featureStr: string, error: Error | unknown): void { + const errMsg = featureStr + .concat(": ") + .concat(error instanceof Error ? error.message : "Unknown error"); + logMessage(errMsg, MessageType.ERROR); +} + +/** + * Logs an error message with a specified error message type. + * + * @param errMsg - The error message to be logged. + * @returns void + */ +export function logErrorStr(errMsg: string): void { + logMessage(errMsg, MessageType.ERROR); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..51b9d45 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "covesa.cdsp", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From c936c4b14146e87299e4eec11168f446618d4ecb Mon Sep 17 00:00:00 2001 From: Christian Muehlbauer Date: Mon, 21 Oct 2024 15:36:35 +0200 Subject: [PATCH 39/39] add hello world kl usecase readme Signed-off-by: Christian Muehlbauer --- .../KL-example-readme-graphic.png | Bin 0 -> 674824 bytes examples/knowledgelayer-hello-world/README.md | 65 ++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 examples/knowledgelayer-hello-world/KL-example-readme-graphic.png create mode 100644 examples/knowledgelayer-hello-world/README.md diff --git a/examples/knowledgelayer-hello-world/KL-example-readme-graphic.png b/examples/knowledgelayer-hello-world/KL-example-readme-graphic.png new file mode 100644 index 0000000000000000000000000000000000000000..3222fe02700f47f0770e44726d1e8036a850c919 GIT binary patch literal 674824 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 s|F`?Xb#;S#47 z-RV%avbj{ER?PHxj030HsZsl(>mCPNu9ckK=}h)n6DYrt0S_|Gq}~et>BEn3)W3q3 zu*ZJUEhn0qI>eb;k~HIwO@=?xWSG*MJaBq@Kvi9_#pnODRfBS_Y9GrUV2I%ts(=t9#0SUuZy_<{!GSZ>SaQot24;w&2 z>_*L^=eM1LPJ(vc5*^aZ4{-un8qxg7dTY7uq$YGHGa z-F$T${>aPEpdmW?XztC{@kpqCYXl98$k2e4cV#@&f^tvMLS69>v6bU3cfv>!?L*UH z8;Sd&gGdKrd|7m4p+lP3|54bx?~&qeB>EO@b%-%9&>x?^6u(D(BNi!3^Z zoJ-%ku43Dh0F&w6@{Bcv{PY6_m z9V=Q@DSdr@g*?bbc!V}&x?+APD*ezJs>=IXzf9Ld0U3O7q ztfbHNF9;#7hA%PZkE}s?IboD{Alcy81u19 zTQ&CJ3xfi}jmyQ2o z*lMZgUIROJOu< z+@PYmrsdInH4p;oCPvxGWqxO@hd|+&uLyxK>Z2Kufd}Mh#Bjq?tr!$5^(23 zf3(XiAP`wy9AauSb-PZUIdOKUE~m6qt*VzbqbD=q=(c9%k&(5ba^E<|1-jXf35}vk zN&|b-N?Lt+XR?IxZs)v^W19>V;1LoVfyRd?#nW`t*Pa5(w0!jv(H3ZLX4dy=sT+OB z13K<83`c4F6<>{)w$CFfYo$X&DRU`7R;Koj-D)Iozu2JtV4qs)ebxZ`4)7T0YEOj*}UGL`R*F>>$@9tx%Z z8LW(4d;*65E+7Ds!~m34D6NnBBFsVx1IEac5;yeR(02hjmBM;&cqzFFP$`pw6<2^b z1o~*<3iY`R|9u)cNT5V(n(FjoWPE!BSAYIBt`>Ak)Hy zp|;*21$oSk=`05@1fi!t8ZVak5^w-kgP*n-`BR6kY^JrvedPs}DlO-5Rl#+U5 z{q5akae*&M#Vz6R#gD~5V7=y+YRd!JDaunhKN>c9uETNcTa6hXTDcD+OEaqFcRR$$ z))pk%Y{4|fh*0!Cl~;U?kzSiB7^E26MX)-Hdlhpv9@mL$7OB`*0`nCnU00I9Z$csiK5LI8*f8v?H%KAV%^>B-0&LIMp7h^cQ zfidkyq3zDuSUmQLms6{Q_teBVQeJ16MfD94C{XqIxqooraithC4t(Ij_nJ=y?$PVJ z9l_6hp4IlDdr_`2WQ%Pe!x#_L1^R2#Xk{X(=?bf(3fyb#cpn;ixS=MQaA{-58Ina& z4po2J{8{CoT=$N9Y5v5RwT~{EgWp|BvF|ift6K^#ot&#em0rA2jW?%Ss~({C(t@mZE_BeTnhTO>&(w5R1dC`;wOidXfwP z^b-YyUQkBK9F_5(zFK%C(Bwyu%4s=q`*3W?VT~<#roU0qq7@v%@L@)BOQ76rxYe61 zAi|S7P<)(kdch^J_5ntXWp>V?mA9~I3^69nHL^Dk_ZG)<3D-T=G*d11lU9Roto7T$ zmJj?eYSdKDwvwH;r+sIpols|6olw8j%FGL43f${awRmKPPg?=+8#&bz zr=^u^Mcwtshth-Too?T)MT6E1y=vGjnAvDH$0z*|1Z{8IU#C8~A2v`HrnGN3eY$i4 zYQxPpMYdEb_DckrD*25!>En*eNq9&*n-N|g;obdRcoMB4|G#rgY_x!Nrc=<)1FPSn z2&lEDH0&j`D%56w{Y$a7h2t{DRMW-icy76DYUp`R*B4i61&} z*!rE7%l1>7=EmpQR-(~mmGXse-92e`d9yWH0#ek}X7#n^5g2ny;5;WX_f zu}aIPsa>w-*WD{+QjP|OuBFZSH3sRhJs#bgio-Qc|J7tb%)R`JwkRcywv$Pt{Uz~U zdi1lo4o<5x8|59HA;|4-f? zk1nL>l8eq?1%kBo9MZ!#S3*{5fNaA@wDV@(|0N&S1?06@n79fsTq6{+#)VzGD&xdx zaC)SgB#E8wyl4_u`slTsuzc&u8j+Oy%dlD0Syp#W=2@pAtix4~mbdaPDeL2J+G5hU zcx?v!wt_&bx1F7-{FfyS;wl(8#I?(WnhH zrv(gsiTHL}{5|5c^x~*rUrNIf-r0*&zST~?XAK#*S;s09J40n^GQ_#Uw(L|)6Rf}T zaBZsES*WJtdG#CBK4(u6aUjZjY9X$)mv)bS3D&##k%^Vd&h2LR2tl#<<4NH$InCC9 z=|Ay4tB)a6)V$DJ&`co=l$9B7>e5&9po7Ft2rufl5H^78>}V~PmzZC|?Exjj5!vFN zUj4!sf0O<~Hk%Ymt`q%qVvSXr@^RQsyVdCssYyF&?SH%FDigl#=2lW{-Y;A#@y4FY zB%-Oz$RbQ;zItSm%>wi7`??jCF0ow0F0rKMjR$Y^zkT*4Bi!04L6M0)UQ&<9$J^;b zY(>4vccap!>xJ=(%tL~+#D{EVA^|xn@ZA0;jafoD@bXsLGGW_$c6av4TzX#xvEzje zRP0hxysYIzu~v%K{wa(KvOXVGR~Wz~&v(L8Q=Z?c@u}K(^bh}miC7?E z1L+-D`U8qbt><9Afb!qhZ;oF|-~rSdmw4y3F)`+Izq#w5*U#3RUyaRuEe=4DCe)H4$Lj>|V|}co zA_9G8Bd8qgcG|lkI|nP>0YbL?@^MsFSu6D*T=;D;q)Gs%v^Ov2ixE7=Su)YhKAE4h z(*AM6Hz%xRtuvxIZ)&#F#2mhqR9*f~khk$!2;Mjc?UrSWu?j`nsuID0{{EDgdb?gIFYy^Bso9O1!VBeFm6R$6 zOV4y?pF2%PTSr$;>ZzYBdhtDjUx8ORq&GU**K#-A*vnx0UwYpqC1`xmtZr21VJt`@(mD5=mPBSBO0(>6=0;iy0G`i z3?eO%a4pO{+mMHM3k6Ih*p89s0uk zHQu7(lA06HW(;L{BbzNo>F`-|OPLYlF*k}l`kx{3-jHRsSNdw~mBy@u{KF+1#!y4K zXQV-L+^GZ?6Jnf!nJ^ls*aNyX^wV7(atcif2IA`P1Be{=x1F|{aTPa9DH0U}T(CRD zp?Lx10^U+pHDoD#Fk)Q}ccAlVw_3A0DHil`ax%n9!lyo#<{FzE`1aYcT8h|zf96k; zK>RY+|7}O1N&)Rx2I>o7`P2ZWsozD6&S6P}T-e_FCp3RSBK`#~3%$Bt@Cu#_jIXp` z*QfobdUJ}q;i97ERvBnLKPw}lq-29b%O1_QbZkWvru*>!c=R?94X14DucheMaand}h z)7zTms(zO8#D_h_Yx58}+f!vlCK0zUby0PUEFk@}gzsSuhE%Vn-ktiMU%S2NQm9W| zr%h3o7-2=av$p$&DsJPJ4CGSL2alV2%q>kD#_B2sJqyNzT7ReR-bu_dU%>HO&IBMi zgKvIvMb02#$jRQE=ix3n>>O0+2NM7%_u36;5C;LsnFgPM=wApS8-SEhx3N`Ildw}V ze=2pf#+~67=pa?2G!8qqQ=W6_(VcH*7sxAS+GDifA(uIUU6XKKVH$Uhtez?CZ4~V` zhYc^%#+JT}Ffx)3F*4#J2i4!=b3qIBFmHMnv;D^oz>JR~<`|~JqZtnSON)=Z9)A-w z{mf(j?Nn0h{+^LFE*0$Y5R%(X>&%>caW7lY1BEE4X=*mk9gae5NZkA?+d^K)DT2`p z67FkzM)JI4UB$%fQt5AcP)6uB#^(FPGc0>G>plox<8^N&?da`TCKNhJt+K6(&x6t% zS6BQ5%FMyP?Y)HXpQ)cZ0|+HV!z-0mbpZO%^JFlIrUFSC9FEjgmLrb)8!OakYKTq9 z&xXjimUgb6lw(`ZPb*uvulM;uTTBgn2oi6_;Z(i1HJ;u&6ECA(+}CJ64U#1-#&76C zdNFFBf&R6Z=!|DDy4llA11Mtsa@31_jTg+j;-Y~45k^PEU#LaBA^1h;=4R-APuce* zdQ@Z;|4;PZLFZP~e@Jb+^i#_RolwW9+;cq{D@M5Kql>WBhI<^BbU?rU7z&j}RZ0ewx)_C3AD znrHm_tU-<{@9jqhx1Jebbw*|hC917OO8c&9?nO$-oQ2-8A8r_U63b!{mVU~urR4}C zDzsb1QP=B2_LM|kfRFn&5AJiP08s?X)^|n2F7xewg}&h1cq+>I?Z~|tqk&pbVD0SCxj?cwBNVmH&=Vop z{A&9rM}fJK2@C`e4O;Jo>q-KGF|}{3|FuHB4o{(82T|14!oRqCdO*Dn=i`rXkgxaO z`)_xys%;&?@4>zAYz~MHI(>RKZbqU?m$590Cc19djP5wNTr+A$Jf5{uZbkk)NnaU+ zF;_!@l~}8)l&@*-fHZOfwPX8pxcaYXbbar+i_dBny!_+zX^rMlK&l&)FmWifZCnX0 z@2e(aJgb!{HM2KAflHzo_L`7EQ(|xa3rYcR{Mb8=uhPQG3J-X-eA5=&%Hl_#U|15cbu08Xc(3P6I)xDB|;NQZ7g+yl4p}bMIael#ITjAYv-H_}5+r$+UA42OH@s>Ljq}=GC#olm zz{zj$QZ{S>Zr=M^sl%Ll9_K%92T}nqK1U%hzBAjVv;){;AtLfC9q2ojFf((@%IqT| z3pTmY`6r^~y!puKdo>sG`*s12sfd+MvoikSSoqY`Q@(}KQ2G79wPs_spg&EGG^wt#P z(&nI&?0}eZ>oub>j1M2u!^L2unrMw@&%cT=81^8^ezoDkM0)QbT_>gh{0!z^^i+^) zk^lkI_sY$c*Z;waC@5h?nPL?p3NK=usa3TU&R)*rmcHq=eLaShY@$~F$IeR0Ji0%n zmEfVf{TSBE5jU})mSqg)E_;K8g)GVpYAh;qJ(CvjjH>4u<#-a9=fUjZpYE1 zyL4>NU!_31+r@a;UN-Jp3IQ0ERq)P}mc&quYEbr{#+70Pq~BtyY(Us)2HQr&nBn=?z*ib9S>r<){`B49{46x!SI zb8^S-^p0kHZz={Csdk6Djw3que?6elK^I?o7*_|_Qa$ibY~H^kff0WqcakZ-Jl^); zzoBY*mm&(`rQ<&`=VLmjW!{u*Cuigyc+WX*Kt7Ew51`?0cp-h{zt(cciLu(W8Cc?qVE?Z>GdWwWVFHX8d+AOT zLy2?3_Ua33wF=YO!5>F|x_(l3neO_oa1u(85B$KDjXgcrJ*o%+XWNO>1YAz|w6=_} z)K;YxkZi=>-+DxjbMrGVjm~2x*FRwivPewL&T|V6g0QsLpRJ3OMds#{ZEG20l(=7s zBtcBF@Mjk4n5Oe8763mMkU%N&6vn-zw?TlPO?(vUxiss8@U0l_qm9_*b$ReSB;UP& zd>bIG5v0UpSB(qkgaWmGa#raIHcTv@-3>qegYIO>d5)6jNs^g&O@}+o-x#*XG|S#d zcrZ^0!*3qXEXmb{<}`osz{sMvrBZWG7i~>&Q6(xDQo0!m8fAAI+G6&J%6F$)d+l4CYQ&Rz+%u0uqxpcYjp@{>+wWOc0gmTMw3Y!;6lhKSkM-QjEX{waR}s}$ z5YV^dx#8n|b5kt62DRa-!f%yFZM9YbnC;Wj)Vs{P*A4S*d2C-QQCRz;3XP3bWOXo9;ic;Jo(yBARCfzjC#-x{6o4JR8p7GU;78U(9}kPVCw<7vZRE}&pyhmqJXC2>nn_>3 zXuD-K-_#YFAKXkgPKrI^e$$Bjhy+v7vjkgHe>y^;o!tfzBe?3pb>38bKAdpYjQ@UOG>{lMvFIt{LR=5SVeCKg@WP zax_BxMa)(=YHVLj<4en!@lJS81+}Fc%Wk6z4=g&gQ-*>!B%}!Y#n;j)13tZfG2U+3 zKy;l|@R{1jAD@h#_TE$_mx&&m@28#2RU_s!O+jmI5x9Qg7@RMo&I=ea(yoQe$|R;0 zkbDy9Hu!UGp@;YwaY6EY?+(BpAh8COSah)%{)0<^s#e>||NVDKH1MNzliv!MW)-B@ z6KNVciPBy8Ea+Z|CAjQA7_(PmUI?}h1Ez>vGf0$?dB*eljhR}a6Lqa!@1G|%?)jPY z3tk?$@cv!~m=Q`aQvaB(*Et&1U+i_`Szp^Pc|^UMb@RE|c!D-Y9Y-jKbH@rTck~H_LldludY7h5IgxyXREV2cn)_LS%$X;$VSdYDC|<+vkEt z4IyAHhj>{k{ylQaXNUr?0aagGF``zlItCu1(r(%!439`3iG3v~N|kN+5wkq8H)4pl z+odX}XvbF+A0Cd5&lHA=s6{uFu0_{U6x}%-kgabbRugu1oEyEi!(X=xCtNQz$CE>p zwcwoLfljNn`^G>1=oO#XiO6HV6o*EGT`F>9F%KBtZDl*XHKPSXrJX0%$|ZBMPkX~; zBK23F2v<8D?X1v(&^DLQul5Bv-A4UUEQ@jm%dh=1$^a9Defe&Xj^HkyaJTQ_zXfA%MWClPr;5C@#r6`P|M#l}5E7nEklrTY9` z>E)XLyt0JGg>G_CM_i=yugIDX*c*T;)YA5{U<|$ohB`B|Uvfrbr}Q($ijm?zEa4lg zS>BNK;2HtL^R4K@^?mM`RT5Pv+jLtz*G+i#94RCD-W8Z@e%0|f)>cP4otUCx_&Fu1 z!|%M7vi@!T#tJoC_vuYqPz$Yh)%vZbr%T1w16viAGrMpm-ArH${nos@UL@N2@YCdp z0qSzuwe81`pI8bb^HHiN=CPxB8pm+$Qu@u)gh<6wErr8S0dB{u2RPl8i4|hKp;mH4;L_NO8`2SmYEVY5qwW3c7 zKZN&{sH$B$PS93)ysTNn3o7htJbtvaq;!$W8cRKkLGl0oy>&2E-QEy~u6@UHl%UtP zgd^>@{m*64y3m#XAwid-^)?mA(&s)S^UHgRK!g_^o($%D51>#)V&fumfq=}rWht)` zV@+Ni*cP@qxa3<)b7YvuwY9bSg{@I9h=X5P%eJ)G%q}W(cV)a%BEfw>aqH`^+w!0Q z)-Zjq8kxDZuB_}m&)gH&Tr;C& z^dN1-?e!1*l{(SI0yz1#KShm9K0=fzsrl?Woz%8 zuh?lt^6Bc0i!YgPd!=SzON><#a}$~LPa_9Zc{Oy!#`aX_qGCAYU+Yb%@zNxmwWg5& zK2U-G{(m>1Hbk(i^=zV0O^d?4Z`@6N%y5Io3DH0Af-3LLgcwV{J|-tD`K ztCEze@)ZgzuT878*P40`4VwOZ5qInN@bCF$4&?4PlT5tA?%imJ zy>D}P<2B6svxOh@y~g}V$S9aw!j#{cNlBNPAS_s2;ksLfy$lD6(uoRrC{0$#LU4o} zMTFXGFob7LOeuNYP)S@}^t!qwurALuENq3^etJf9&{A<1Mp^xycZyfs#pQDQuBao&Vs9$RkF68>JEj#%bKxdKdmrFZF+Y=(B(O z37WgT@tEfHK7m&$mx?(Uq`CdNYJ3CGMXM5>*_(S90>$@9Qu~?uaIWD6j+d@21`FPD zPM%36bXB11+~XB@>sNbvU@%b6R|ut*T=uj6&iSlTv_gnZ&vTHMAqbAy|EyA(n$cs& zsMW|)Fw-*MDmb$&&=?2NY_X6&>^|tGnrX$x4D=!^nNUJRC(=>@rSqc(kx{BWm(Rzm z88~-TzA4VD=ueHXFUr|0N!r056NQEl4vI&dG+z93hEr?spS%*nkQ%#o_WpR#qgFEQ zYc9qJ4B$II>HjfK{2|G@EX%mNdqPPGUAOC@L1W=Cr%B-lr3q5s+YCLIDm zNOq6w5AYTZFjQ?L;W%7tDi*_oP5Y{A6%{g9BITc`sqx;*OtySQB5DwaA0IHtKOY=u z&%qVm>l&-iAA$~S5mQNA{P1<4A5CvxX?lOw^DBfhjNW3Zf^A;7`zUVhB5K`~Ob{#; z`K;)i{y*K8|A|!o- zJTxBn_Vb?C^NU$YqsptLHzV`mo%D!Kqfvc$?CQ5)7>TSYX$M+yPX%ZNw|9rclKHGp z5~^l_)bG1mf!zba3jsm zK?0$3U7+Xb+mQT>lS#XmQq8A77A&gb!;(Ut+Gk&qnreeNOGL4}SyN$vgg zSwyR!77cOH?k9DNu=kvqxM2Z=gNzk^P3#qkFS+hEy^$PZ8I1GA_${upRch1f;T`?$ z0;NTR5HDjd+(fN>7M+N9!?By=T6nSqUjEA+qTpJar^Se%7i^vDPnI6*L~>hI$kBn5 zms|_iZ=nrVcCyb~R7Fkd27b0|6*03=rqOMxj47`m@a=oouBYK%9iwZ!A!8I$9VsCc zsa;z+eB>uKwaDntght1Y`m8zpPu|mnp!5&8L78WyGa}*{?Sfop;VOw9+J8pmwl{23 zwB9uEz;U7G!JwU;;T1wcY6E>3dD!JjwMb5Lf{sA9;VRiWd>EC9JB&zP@Fsiaiwz`{h0o{y^q$o?Blu@Or(IXcQFF9dr>(<*OaXM*?vW?6u6y zddpu0vIwbWe=ZZB-%%E|_Z33|igP^5&^qMVCs|{^8X=`#<2lDRNokAi1eUx(d7T6K9^JQ<6YHMp7 zhqD;hz1@=}R|d!dRn%a-+VetR6ss!lr0iwMx_fG+nM-uV58$S%@%?RJX5F8g4UW{> zv|+IV>Ri{&ySK9`-TOE~OZpl;3mjB*p7fHnwzh+a64>+&G#O&HRJW%>;`#{3^A>!@ zm@fniY+AZ!24$@iI-1Ra*u34yL4bgoOvFXS(pnr65IP`DA(1a!9ffkFO@NG1c#nJsmx>E zhvuyj8U3#C?}QUu_M~t#gZhiN`)$LB^Qa%sj@F}U4Gp1zOd#O*pj5O48>CgH+QQmc7By zIGpG0SSlHzNyEXZoOi(t`D7Rx6v2F_8!>+kF?KYWS)Tv7*0U6VbH;T4e?0rI5dR=_ zyXBvpAsO|({A$HvLmQrQvoyZ@vwB7y#YUMk!T#A{L(UKM_lKM1m6VjynS#UW zd?F=Ae?unxh8IUA?nv~9N9k_C^Nbrym~7OR!&xrxuhJ>p&$af~zPdhJO9 z?FAfDm5G=!iiJId=;mafF#Er+W*?h`5Li)-*+JQaF^5d8`=k2rmFCFq7>?e^%A6)A zE=o+p{gq;1&rO?|Zp@Frfd(?rz9QN%rbd%F`^3ap517tPL>@_m{&{F3t_e(K( zYi?>$MQ9j_xqG`CD5;?F!n_U1ZmyS~G=ya5@r~*4WgK9*rmO)RU+=a}cf3O1-R2zO zh_nsGE<&>4w90qA*A`RMN=A^yQQx#^M9z6WMCnxnvrLqS;!$G%n**Mn>fcuk{{id* z)mB3c089APu_sRzzZlsFw5~H8+zWBGYg$_pAh#BD*D5m0xpB1DRCm!BIMbv zA7rvpSF)RTDKc@J1q1IvzSZ2-tk(&*l^M8bA}XW;6hP~DV)jU|)4K>dN^#I;0)!N+|*&9}V|@-D1BE7N#suKJG~~ar0i8yy2|Ds>ZjCUV6hz z&g}h=)!w|KTFInEM<1j}$mZA;(ov;h07?kPSPVyq=)!joE~;B;01-V;bz~SHWOtUu zIZ<3QPo};;=u{!}?Z|1^5KfHruA_8fl(D-NgEXq?F}Ovs1JYy4`H!lbQ4W))X+4z9 zlX(nh5B1-s)sLVNA8&J5Y0l=~s*E~_oc!07{`uk*v0)%{!gZYEr7vpkwBV<~3ai4C zA8tk;W_T!DqF&Tq!|WH(UP;>xO)k3f7Bq-}c+e9@h7Tr_I$8@pT)%Z8)xyK~p0SX*%+EmTDakkk8z{GFpXGPl}3F*H-dc)N4<+n*@TupO}q$~V;Z zto-XK^h04O`#bhqWAJdAM0)e)^Hrbh$5VEL?EQ-XaUAD&C{)y3GpH3 z2$@`AOmxf(mH+CRkN`KQ7K8ucgG6x@1W%bUh|AGD#)_ZoG3J(<)K2>{pejBSt| zCz`sJPJR|Mh)YtFoe=hZng%xJvvhmlJGYqcZ+N49Tni z{r)qpIi&Qja^)&PWnq)GBq*$jx5^LgPIEh2wk3dCAlZmMB&VYsx;Ub`qvGmgJ=&BP zf|(ltN}3~@`?c;S5WInNJDfH~KJa;kqDFhwi&|r~ZRv=~n`~w6of#>)mFEz7mEvEh z23qB64MF3U+i_B~-^6wH`kp=ae{BGSZUA)A+fz*CtaiQ4@W89-*d>>c`>kX!cqe7^ z_AK+It+Ho3qO=Z3*p}7CgYHVRAYXrKb615wfBq=;)8K1o?I|w0+vV#=m4;Ya;<$Jk zFsAMQ^=b*0W25@X@Qu(e^hVq?7WW$3Cn}ny${aTBWwp<%i#y7*#GHnz_6`2SMN1j} z_x4L4xvjab30GsGIC5x@y39SL`()u{^a@i#huct26g?boze5h7gQ zP_;-aKKI#736#|q-51+CstGefN3hrxUbbBu)7Ywv+WFq9F8=KMH!^mr8w)yr)g+

B78g_!*%)JDdis7UOa$2Y3k#-Pq39W%2k-!RM^P{I|9k;<>UremPrA@l?e;tWgVRBp2BX z{dh%L;x-*)^(>oB+OO>EvluByMs4N2ocy61DH~wtkD6TzbYLmZy=e$ogAF%en@GHy_y3%s!r#* z>4={F{%1kf|Jok&LHYI@+^EbmA^gbo^IYCZXp#Hzh$|&~<-AFbF3r`?YT6-e4oW)& zNu>f@tCmt{diW|suKUJN_}t{oqP5q?(N>gkWRj*{wRvp}vO zrhRp_7&iBb@Nsvgbcu~PY>p!|2hohgj>>U5x0u4=Yj;az$>5RN+95vM>)Y(t8+lx= z=N5#dfURUDh;y&oggt3|&`Hk|ZJ<>MC-$n4kmOOsC7X_E`#+1Y{)5@M32uwgh}=I# z*{@eYIz}AzE`h~F{zGA){Wpgh=k;@)dB|cTA1THX4Y=vwQvHwpOwOvT&idWuyvWf# z&?m*L!fdn6sVaz)j9Lgd7`YoWk*-q$d@^~l5&=+MP?v1rQIJ?c;7+Opo;(_Yjgm=> zgL9QFu!B?WHBOUFS0#DHZ*O|#<_?P{_LNaX;a$IYPyxD=tnO1BRdC+{Xgn6GzLe&( zZ#3BdG(!B35AL7<@@UIzN~eEAtsqBX2S%e3$1e&Z4=#@Jy$d@NK8~Fe z1&$)0`3#a{n2IKLYr0hJ=GONNs8+k8`h>;oG}z{Zt0m4;JiQwvrbUY^vn{kzSMgC| zcdl#+&l9qS$P`9!1tLvQTpyqcmR~fWQExLXJLI+)F}Y1wOU(oaX7tw4hlrx2{yD4- zmOr@m%hgKIXYFQ5RFmN@o42KcI=P3(V|C-#<5L6={&%M*(*bNGc05Cyvs56@1`G!( zhSuyJ&KV3M$6te1^8rMApZ%+v-M5wZl&p$OGyV!+s;{KRY`yl7q(4&;!a zXw@v!{EQLfk(Lm1OQKj06RYhy{uAvmg}apgbh*^ENbL5o9irGcJSSpI0x6>?hMJ3d zpug~{_Vbl;kz6Bd?@7J``!-$>Y4(NvZZ(p9GBKa^T6oXrMHECTkC>kE&Yk)VRuHuS0r12r>-Nm| zwul0>If1~9bTOs!j=jS0TLKWg#-58e8r}MJGR*crH{U|9s@cs!&+Sn_;eiJo?N91g zebjkqGDAh1SNEA%V?^x;QeK|l>o1yN;L_xK;=5=QO^v-t`kOhV%)X%w$Pk}-DHAqJM*)ffqbzPy?x0P$}ew}9F?hC{Oj!`(JAbM&M6l~bM6R{aUSJJ zH=-INPG)@m=Vz|Q2bQYj&yC)LCQ!(ZjX=va`0U3`Z=8oPUZdH)zYvEo=q}pEbTXg?(>Erye<>{u1mbG?u9$C_Ipc69hS%r z<*httizG%w?dK~wLDj3aGxBN?i6x0g*@a2riu#1n^Sego5ijthNoqm{WNQ=)ZdwVN zSQhWqHnhJBdzkwEuxQV|biOK&!|{9CxLewq<&pO`LCZbhcJP^?>;1c6=Kl?uv_l=m z5efPUCl5UxDkjYXACSAL@l>XNjCs98R9eegx=|9!50cmuSo06i{qsOTh?l4;O zDZd&zQ$AV~mnqy_=(IH$3}(3UnE$gGw!WUkp_#~lMggeHik^b-Z=oUCzby3$PzNAl zLzHY-#TmqU}+yjaoe&z8YSqhJT=3iv_J~Yql#m>2^CJ6@7;T;D?T z<@p>2QSELk_^uOr?^cYLp~KBC=`(5a@?Bmk+ZjoC4ct6pP7tvOXLX zBP7Sk5SN_T2vdY^gZn+}v3$zk(Shbznp$Er9Msauq`;rPqbBm67(yXv6xs(& z-XQW3XwbT*ZM5lGoOuevMQg8QfY-Iyn&4JV2qyr?tYoT$+qh?}0Q;4#ATTDResKnjZ4c&PiqtvifB*8#{@j49t1~d&0sR^`FbUU*i@Ag8 zf`!r+Z-(;yfQT1d<;s`V(vD{&H9wLywhyyCT$g5y?GNsD_ngh%n&FcJ!EEjxK1RnO! zfFB_dGU}>q37lGElzJO(7*rzZD_Hyle^j&^lsy!b;`+^q*Y2uN{0ET>sHWsPlnuu| zoKp>qcC-X;tTgD_i_em}Y3C6NaXve#7USLoqHfB&xUNoiVL=_G+uB+ywR%Iu+ zkDJh!HqgCl$ne(${We| zRK-fL8?z*CmJ^n-VoZbo)Tpg^0ahM2AZ;)pt^Cd-4E4x@Gn+*mT)$)G^$>$fTMfc_ z(3YeFYhL{nd{gfEYE>pkRfV8lhnKl>ryYq`o`ZLuxtx>o^FW6_TYV?*%qSPsc}g(9 zog>9kvnNP*Tx5)@M9;bNf?M&pwBu$>qkM@$%FMlK@Q?kv`n!}~ya}E%Clh+emHE=& z#)$L&khM5%PMx>IH^|A(!d#8SHV35G#XlSJ+1~Q_hg{AZJa*q1aqfxa2Lzmx+DAE} zdu~+mEJo$9*WV_>60K%Cw#>1;%)}=q2s)z$YPV6tNzWr78@0!#|K|9!;PU^LfYdh=J~m!U$!c|`!Ji0xNnB4ELx+R8b&0^x{#|hNEvmm~>t|qB z@ln?OV``-j73tR)SdLXE-aI+^l07XgZM;IHcJ)uRm|lD3AZ+Y;6~=uDsHFFBE{1Pb zVrDoqFTPO5RG0muM6U*@>B$Uyrs!!w@;R6e$cn*+zcBLz%hBms9$j2f*BJe~nup$) zAu($=3-=xUXCH_)4>Gnpt)sy^M8^JcFMn3luo}hWFj8K=32`z;FI|Zw$Rb0Y9thYh zP%2FBU3jE=`NRNwfJo#f;!x*tz~7dPUhf4P01t!F5dom(1NO=D80X6%B(MnYDgT*g zUaSaa?lh2?Vri@P**@H-qfU-_>hw8|&Mi1KdysJ$nbWm?!v?HBX}I+2+Ot3KpZQ00 zK`zw6!@Sz$3!~3>!V$OkF9d6<#9%~sg5$!3@OaS`A}|x=H$};mMlk!wdRvf+i^;2B zpXY$bOoDi?1n#5Zv0lg9e*U*1T?cA|F?C{LI2k~_TnsERN!2-1Xf@0WXygVH_v6Bo zl&lyUhZA<2reC=FH6)#7In~n%isw+wuY=5buFkC2T$Y;D-dEFpNSiWV4NJi!J&lLV z!gaU2oV7@36Iof`b;ITXbkvN)0^H3=%0nLVPdN>0cJhx+dnrGVlr8OhMO`p@&BKz$ z1NGp+m#HnUpBy1<-ud=7#bkvrr8TB@3~<>HolGFT7-;patnLOpsn6(bQb71ZS3HUE z!cb|GPG@33Pwxf9*lOctQ$FcsIrTT-?+2jyt2^!Cw@;uG8E_$5-=)+=UVQ-#7j5HV zRzA}b=s|&YRN4$MvH$Z~qv&x!Io8_5-$m*u*xu!;jL=l7tyQG#a5#yVFGz&A&ojT4 z$8U{gW}9SSdDRC!-4(Q$<##^k5DNV5_iztk&3PP?y``Govi0V5=TlLQ~DhJMQ14RtJY$wrLMfA4r^zYD-I)hwPJP9r$w zw=Qxh&!Qp~pkkX6q-tU#1(V^zj>1M=!zbKc=#Pi|Jzw|reZBhB$c_(xfx}YJYv;-} z`~kqg0Q}bXS`z)bGyWZ-pYdhzW#l4rVQ#qB(F|O_m&E&w_oygC zWFiG-a2|S|!>b5wYwTUuQ6)IJicrS}pWFH0(A29DXa|_4mA~mpqsI$qY&;XMT%nf- z*w-bMHyWRFc7x#nC6qNw_gfCY`tI8LKOr1u1Tjq%YzIMH89=Sw9A;aU!3nXipiyq| zujDtT`$Up`E6G{0-i>@YWNv12us?L!<(wI`jEFB}e_sv|^ul}KKXi)?wC|WntA3N0 zQ)YuZ)OnI9cRti?D?j)W+@3o9@mQd`_MSGn%ZyI%2hY*7%3IUh1ds?Ro#Fw zC4=Xt*yB|07bZa(8S{d(ZhGAyig(v zmbp{Ycyx@hdG2_4Y@i&LmDl|*wh{3Ot-i*_PL*Z2$qdSneEbHLqdDw)KBy}{{v>uy zfx=tis2hB9L|Th1I7fKn2`)SlI4fLQvo!7CD;yJe43Aq$`IH8$5rkB?q_6ZqX;t|4|7MG~B+YFbV*NdAg%m z%}$GC?jJe|DzsL*lj`#++8_iCDg1DrN8#Y|t3o|16N%Wc4y5b<$LK?mXeKo23!6nWnL{v=n{w(~NM@Y3wGu|0HH>l1MW_VEFIcZ4I^O z&z^l=9MHe{stm?vy}c7H@RvbcTzsW!6>wglK%f|^*BXHrdT;31A?J?5ENyHLv!M;*wYsu#bBDkG#EuxOFXgqGMUKba zo{gnk0@wLEWI3SDt`vqa+Y|40@bx&r1MQYu2JYnO+v-4**G+A1FdRURV1b;cQS!|6 z^c7Epeiemdi3*yQ+1lj0)o%M?^vq7WffDOCyT~ETRpS-x-aO|bd&QRIfH=6s!Ce7-Ch}RZPj=tycmU%hTQFU(J-uH(S^7)*r zcA#|$-{0i~r`9iG)e1lYj80^zj(uwH>|qKGw?V^`+vg<-9Jul!R8FRgO|=ZQqTN9xJTyfuj{9n9 zplpv3j@)`zyNH?a-rH$@5(?Z7c*p&1?xW^?TQ;i1C>S@c9-$=^($JjFGn(`pOz&dX zxQ+hd6!HEG<JM7Eda@!HmCFI-fLTL}=e<=~KFhxaE-YY;isNLx*G_egZ=w@PJp4%6P8 z+h|up?0lY=91p0E%g|`yMTv#nQfGbppyJrGQup97Ay8|tBv1GknlAWpWe7@j-{9u}u{gucNAM^a80i_~QrzFbgF1ASDJC?M^SpCi}i^&!3Z@Pg8 zb3V>~5vFfr&ICXn0Imla?2mf@KR(WWErH%}FE*&MKu<^L3b-{dKgo^Lou|LhS&7v5 z){S%bo$o7PGZr<0BcJiGn5loezP00ucnp|sKj6-~J?5*r-xNC7GF4QqZ{VcyEbU@V zyi4u;9w|8^1t|RA|Ncddcron7%0ON3kg{LE?v!=s@~y;&Wt(pry)GjaWcU|8k`>gw z|6DRuN>9#`nT4^0@%Bo19U}lD9z#Hc(bKv!Fk|&YXiwByPMO_(Wl;m!U|cf=X$zf| zCP!8?K*gBzWlXOB1S-|4)H))D@482g0R49rlbW)X`H^a*_Vz5bsgtCF`%#YROj{S*J6Qi zeOgWsJ3!enlw?HR#%TVkS)Ep$ztHa zN1`ytO)lfE$0R!{@zHGSEftMAGQ(wm zP;J+~ya3nIFzYCe7>{;Kh_>#Cld>?a&(faAMhk16G$TG}?75O7Q~h3!Zr>QHl-AoX z%)5tFYAK}0?b!1wPG+y8C(tfQDu*=_reD68l&M((AEwM$Izri=`Up?`#(E+6-2Gxk z^=&}PPa%KXbQ?k4QI@l6U-7G8dnvgi)*Z%@Cdv!)naJZ*-mEv{WN#i68S+7p@SDqV znJ1kGoY2LqdsEYK@Jz75qtFk3{~8xRhmOUpYuRLCuxR*w>C1@f{Li%efmO1RSGo&g z9Xe=NzkgH_!DMG!!=(CR{P*oID-}0~9SX2+Si$(`Cr>H&MJl3T+tSgt_~`UeVcVN@ zbJ65x=lYLl0qid01-dp;@i5M*)IY1(Qv#+bY=jt43PHDb?g%De4?%6Rx<@<552E^W z=i84;^`29k3xzlcsRil;rcyD0^Ichmb1G*9RY{d7+AU>bmoS5AO=MOmUoq(4{V)$c z7Yz6pBF_x#KE|Izu)Y2(wZL=U-Jx$&OB_@^}QbI91iDr z3h6cHoeRG;tKV1WPiVW*PQ{rqP^LMqJ>pI_h)g7LOa!g22K|L*xwa$d#n#VNXMdP71^=>q|y?&u$8s(UM+EJp5&#$iga(J7T_H7jT8 zeoN7Q3|0>qt9&W5LFG!b!ln1U=f5iGYCbEix0NAm!inv zB+I{)!gr95e>$I@G#n9}e((8!m^x;rs1r-f%TMWjVR3PprrwrK4sS;Uj_IBhv ztx>o2WCqq5Y$;fTP|vt-qu!QHXX*Nswt^U-E~ybS z#7R|~s;kaVglFpgOs#tfhEny@J8#Yh+~&1wC?$3Gk8`nK1tD*w{$5l6KC6s*@eIL! z`eYHj^S3%i6bJLX+@0@R2RY^+%yPa~!g7zDi(+gs0{ z!lK|}Yl4d&Y2q8`bK+F9pniCz`bK@oAhkoYgL)GXEp;_GQvLZxLD4T!ki?46iG4I@Dr!%Rp^)>)DpgsMzYSms^!DzOWi~B))Sg(~tR4TRXFd=0Knf5J7S>!7Ju&5_=u`(vZ0AuV@_y`I$Ro5-9|3l-8&n&+9VCFou1rRQ+LiX3)e~ zdnJp_a6wyli&JxzHU;U9n?N$($`|7XosmDJj`QLr(|%#71V#cH6|mMuh>fHL9)r!n z@R_IJxCH+WpII&yvNQ?^4kmDj`Bt!FK{70n#gD+{o+!3fMEo5~=CJAkJZHf8RqU4o zu-xV~xtFQ)HzP&mA}bap7?f*}AH8|3Pb2&LPskWK9^TmbEp@@ypk8KK<@0bknJ(+aPRqe|+dY<~bT@cC8 zU#Qe@kG~V!&v|9bpqa4pCr5!SFhVZh%-b7iFQBJ#{9+g`FiBzdXH=PVzpqlDRr4BW zB4J;H?#*qtaN{T)e05=^Z+-N7vIKmLQ`r34nd*7b)%hcQ=(xB1(eFwJ8==Wwv{l9n@=GpisjC55f7UBn_k zm&tn>WIZ}iJn>v69|VbO;7}0qe|HrI!SAwCf19 z7)>}cz9_YUqT>CBLYT?&0(Ka(6f~_w_ID!zV^~xns^m1ViKaWkr?_pmGX5bs@PYYt zk?6P)j3L zdZ68EJFq`eW7UhVVg&jD2Fe}tq8(?&bIsPRw5lfGU_mCGrJ2PH*a%=umr}`&GZ|mWl%Pi z!IS%*8tm77-WZD5XTr-1x1;>?jW6z9`wXI>M=X&i0U$;(?9e83@B1`lq3d{^$tlTn zOn_}Nb>(BgJ@KI#;9R_UTrDSVU5{FbWXk{XcdC8_i;U;KmE zwi^})LpCN=E(MQNwufb3ry7x4!t>df&GdAF$W=l*eRr@xlgi<$jk=I0CpHdfV8OYk zMp*)|hfyZK_)1C#EqLj%3sSCvE3Tn4mqpoIS*Emc7w}||aZODR+xJ-AX(IOrNqv*c z@%$%MM*AfICkQl+p5WzVBZ|ir{?ulJ!Lza)f##5Fx)ht91d%VGwRX4ye4z(T6UU=r znD8;USfuHNjHb~Do5vKM?K7wJ@6FkX%g&`ay`0h(z~g}qqgM<|}shQ6=20n+QN>aJ1E~4m(jdxx7Xa`T*$fI`Lu0`##X7DHYh|>;Zdo-E0J7{)13;N zi@kXH&hQz7ru8Y8%9XRc(^6FdHZ2QdWO*U;tylM4PGz>OEo34s|i2UK&}f8xLnDgt$@6M0c4RP1R)t(Vv=OU#L?w>?J1z3S&Ka5bMP(%XJu+rV)n zgh)8Ww4YN%K%*;=h)8ng88QbdgA@P<% zjl2~Ud-7Z+5P{+0U(`t#Ho#VFK>7LtvUQ&i;KTvo1!KqA^i1r(o^zZD>3JsOy6E4jTdUISl|`}kBWPTZip>k|t?_r}ySG(u4wm8@$K6J9 zBBxQ2v<**u^>6ADI(_fl@2kl)O;czTDWlq@I|}@Hi_5wcRNL|8NkSxRCOQ~XYl91K zbu$S4SiX0&`}G=u+ufM5#IzF$McWUDUhUD!ERBt@sA8^9N=b){Iafqt#e>DQX+Vp{ z$N}<}2wr^1XBj*7bWr^&dbg6P7qcHa_(^zi{HnU*xRGrLCztK`UFauYKrNcSJWK>9 zWnKqSpi=F(I1ZR0noum1?ibd&g$iWUTrn#vzx~Zwm~rgSA6=Olv5w50U&3<?5%2Z6 zL5c=CTmmo=DRNFpiw6I{wcz5Pit`^!NMH@*Q*Hjs!#lD{9w#Kuo<%>OlY%0!K_1qS z`Ds)8Dt|09&_M>k^O^i!dT(e}XQU?C#oA$MJY{MQ-NeX}{I!s^m1d zSn0F&#X&2n9+|YxaoKRn9vErK{z83YL_KtkUbeY+bM!R65}&p6jLCnQw(DsW<+ddv z!#(QITV`*e(-S$hE>Pc0oHyB3Zo&_Sf+bn!EdE(*4`mk6zLozJlx7&Tw_JagRzJwJ z=D4Oqa6dF)sIIP>LlGDJYv&KJRDyCUYYT)yt>M`7=96Xq6q=VessoUxegv727nU&bT19 z*U_2kq~^7HHB5oBgl^Yu!r3myF?Pl}G8t+?#+%MvC$hs}-i%9p#T}N_UonXk%&wq{ zppKSX%i08L8`<)0RY`BS5enWwdD5^Zqq9ADroG}QZl$;yZnqhc(o{rWiL3dbb**;_ zH-uKC(`3kt|B-XWH@Fa}_}v2bV!zW(TU#uU^rHZre#QG~%otX!{7y9Y_$}JVy$p3*X>Ly=j_bmt zdwj;lpIQ{xEo3 zg$}sP-M)%Ln;y}E_*5X6G>E=N(DY=m6y5IYy5qCG`;L<{pFce>G>>7BtW+n;&oYl! zmQ&IJnzhu_{JIg;UNd+fZ8&RcMz?^F0w9};Kb_p~cpACA+a4Zv%X`o!@LUf0-Xrj` zAdFH=-Vd7wbMK37Rse=n*_v;^Zk=R1x|WpRbEl><(w58WQ_LSXoser#>GZ!22>>Tt z@{kk${}7blC0zrb;HPSiB!m3@|FF+gA+T!>Psi<8bmu(JGWM#CAiZ1op=$93McwmR zYZP^p%CKuT@AzbEl-_bGbu&B@ztjwg!z#-s{@U*bRZ1N9qu?vqk6mGoTY6i~3tXwV zRk~aD9Xurk#;(Qq3b77SdtkP*@EfCn;;$fqxpR0g(@H&!)&!&JRkYoV2JaXTWtUF! zM6k?wMj~`BLje`HD(9clbiKARi*(NWj@3erPetDuyXt^wU6dT82Ln0JQ`&MzI@>RV zsVs5#&1DvyyL3h96GTTkXdm*#09Z7^dBxXfBFAc+14u6iXY(XxI=O?88J{|i(D|0m z{S%Eo(uU~NQEZ?RbnFbEoPS$1|Gb?^3an?Tv&r6Evl6 z9I5oQw7@$lIR3dy$`@m}1O$Wy)OM5dC5-X&VYHMijQ3l4^M(R{Ird!4-qoI2W3Hl0 z!M>H)Tc-{1AfQ=MoEzdL`<2eSoju#;oynODd#h3EdbZl1D~3wf)x=~e0R)qM=JA+?VN7OYNY0H++3nre_?VR2Ha>n z|3L{NwhAph@UC=JQxnJBOSqcS-#U}*rc8H|B%XoyN+u$hES)<5;{hU5sM~IDW^U59 zs1mXL{ndU?T6EAM&zK)f^Du(=4%pnT9=oMx8px*okXvDHWoVrg?7rUSTOm^@ z*2)wFjYlUU(%}VO($t=k;a{%ZQQ+m7bJP)1o>Twy?0j61rC$eD{=wPpwLONA&0dIMVpYYp=HIjF4iiVve&2Ly{&i<4Pb*Ih@(nyEzfWRy5C0g=A zZ-s_T8y~FDw0EBLGu(cs1~&*Tjwztdhq#9hQ3XQcu={^qN2<@4kWcxoHr8VqtDu(C zj>6c6-L!od26;az?tr`pIM2;htoBANccO&SFC24j0T8U@l(~^+cPZ~#%WeB6pP~VR zNg5lm>KMrTuW9z;qu4>ww@k`6^)p88?bqs_iMZy9&NuZA_)`CF%RJG(fGbDs#2__@~DNn6tEh`D0wfnyNSJ?f&q>E-d-78 z<9A=PU`QLJLih|U(laRq_DL{$e=sUlWcugSJ9hyFKfd+q_?Kj|HDVt_%T}pTQ=c$* z@Tg?2Jt2KkmOLJ!GQO!{A!nBVtXut^pR8PFk9xLo3JX2R5ApmLv!Ie?cYX8Zl^k#A zF5SOKaKcChR*WC@h?$XB|4bDuZ8(w7nOCaE46sn&Mo`~7)mje^$bzc#be+a~KcKZ} zs*P;S&_Cr70-lpvYNM*%^|z07B6Hg>pyM{U4?9ScIFFOc?;#^|3isXwp*LuaQ8#=A zgLC=X9$uCTq>gi7H>?V_ThIfr3tDDg+6&kWx>YMacUp}rC@#zdIwcxcQ~^{`f{_KV zXj-kT^htZm4E)@~)rTv5`DKP8k;0j*`yYrebUNMYROl-ZY^f5d83r|}&ki*9>I>F3 ze$RC$Gq^h#1YnusKdla9k(M6G@lay1i&`J#|JJJL1$Oa>7r;y^(qg`6fM+iyR9bd2 z-L#qj3LgI4P(5ik10wlKc+@ZRoB0*~Ss9(&aSx#%sJZ)b6+0fjX~z8mZg^=|N&b;-~FiBphnk>@=9`PU#TwIMf?=x`{Fd`5znZZ$f>eyL6 zfCs0~jk$ebVID&)67gSSFqJDW6m=r?med=9H$VPlPH7Byh|XB^&dCB^o`g+wPog7P z+GGtmR_}7B^RBF1o4bIR4EKxm;9ULeZ%ajH0fm{7b4*39?dKggI7kOelXR{tCJ}}w z5AO7)@ar}9U@9=8msOyJd=1M-C5xp7HTrpRsa4$=vfpAz&PJ{&;o16R(tQ~*=Ny6 zFQlrzy1iy|60@9*4x?#VSZJg!ZT;n53*b8;Z$pCMgOHEQ{0@aDfLl1&G{GK3dgXBJ z_HU@8N?Jgjng^klWpTLKPp-yftjC*#bG_vRVEsiLxx5}|<+)`Swk6q=SA^o_q` zb!&M%G0>ux+weWM6_5lM(lg=C+*+efdN#jyg{b<)8vE|j>}u7nm% z6s~`7duA3t0*`>MIn;#_v9xbORJeug?s3swe3?zPG-vU{xjo}2v)+%NIuqsVGi(j1 zYbwD&N?AL01vbd(hl3No`wnWX`s-k&-z8CDB~eeKKBSrY#iq@-nW0I4$}I*fseP$D zjV!~1FGyd|Xqa9J3g*zb=+oAH75t>2ea%JpEK^3aQk&JW+PDyo=1)(mLb*5Hs99Qv zK4(nHKz^jtD3=hm1uSie$x#K>thLfG(+f6u9(=^!8^*3aeVq>CKRO+j9K#B-N~++m=jsk z9g0@7nw!LF&XHc?wwerFvR}euTyL2!crkPfljNrgHb@(F2sCLp5;>7duA519^ZwIG{@)7@|Hsy`NjZH^YOVSqoacJ+18=N4``+zq93VpnUlw z%(Be-2N=ac;2AI4M9!m~w+3g@Z?ld+ODm6tNDd0&j{oljHu?IE8`tl8yX;E!5=)t>NERv#mfTh?{b2BimRVuUYUHj?uD1*ZSU;g98+|kKbzoozDOl{y>I2czvieW$ZaFp zS8KypRwHF&9m4Key+=%pAF4v8Vhb$mb?NYM0M4cN$$%0`x8a#}~^3#)n5QWH9^R{q(CqYXOh0 zw=>V6U3aZ+gVnYJmD_f;SWgwf|L~$k?_P~?V=RB!Vzh;dE5%@$O;_d;uZz6ZWK)uc ztnt%h%f>o1G-UN>UQds4^Aj*)jG(sJ94fv<@_%Ui>aeP}ZtEi|ieM{Bqeyp)lnK(( z(%q$WZNdPR?hd6J>Dq)Ku_@^;>D+3>9&g5Z1KThDX9^T&Bm5M{14Ys@j`Qqg22 zKo|EU#R&CC>^WyENuBQa_E@*RUgPbT9*Mc{$*%+A6;^SV8MG#DAe*s5UogjhYEsI( zcgiL?34eVaWB{<(qhTe%BdED-Przw=2{nWW*ZI+hR*W`Ui&h?CkBd&eGfD^IP9%A= z#g+dUlU!WfvFUt5smHF~Ak5@8>Cpk zTggxPC>?w!Q3wS#@O~pecuzgCl5L*ev@h?`&f3n?z1`Kz^JDjWOy2Z2#%jzxWHDLU z94L4`AlE!TsE5~^ty5aIE%&HVu(aYb{tpSno_fCT!;*%uZN z?Pn1Eu8#zx0rYi>D>0{tP82U-`}()`Nb#1_|JHs?8I_f>Ow<$Odi{I)e-l;YLE7x$ z<$mzzDi11v-?0Gz6qF-uA=P!XMR#fA)V?n4pRA= z3dK%~;Y+9JmCGI@D&j6ZD_z|rqLyQdS%P;w(G_WaU}ZHgM9-G4^u(L+L9%k9!fG&! z;o#FlH_dQ0aNb>Z4_swrxJ*3g19$A4=ETPJzc>OTv09vUHNgMoW@VIM;a(s~oVq_f zIZ3Wmfb`?BTdz<{MWxsMzFKBe4$p}BY}JPzuUVnQRpR$6tJ-2@Z?!DRcRg8P2AWlm zUwr`})~v>N=w_Y2=L3$sVZ259#7%n6;W~Mhm7M49y}szywl8DNfVe;T}^4DdUq4td7VUHnA_l__&Yyym&Omqj}+=`5v(u~`22 zXJ~ahUXNsUcwTzQzN$wp0JXU<+l_MED0b}3FU`^QsVWq~4I=2tq79i_pVez$4~Rx6 zE)$x4_x2 z?k0Q2mYExuL{aNKYVnRK*Gk}Cc>J>AXE5iw^WU(d*o|va!EWK3m?6Z_{H~6Oi$I`q z76citsK}GI$JY^Xj>%(qC60^tljd2#@WMDK`gP3$_WqRP|N9 zg-#>3S~m?!69mxExYoU~`^y;)Gi64i0a$Ejy>FG0cywucI+w)@Z0=S1-9#SSS8Ch6 zwPL4r7HU!u;T$g~qjJn=f7^z$EL!iT?P z3iutow08Mf*rY4g{+i-UK~3}E^b?z-`{t4am2N4Nt>w@)-Go2~cuT-g&CQn;))|(w zy&R@@%xmaCFKi)8_N1Iazzvq7Dmwy`_%_8L6ZEB4@hnHM3U?vx{4!L1S|cH% z!5o9Pd6x|{N}Iq&)$gq%YK5jMpmY-km!e?G-9!=5jpR^ZBpJ82s9^x9ATdwBo2s^G z^2rpP!o&>qy28sTUKXg- zf-XzwiKQZ-{$gOV6c^-zO}ZqpW;_2UX1zi+GtOA`=rblO)ydlKAB+NMpi_F2_1MoN zp^LwoZg-%9bs2~5Ya~5w#1r+!Ia%<0*akwk3=W^H>1#xU=blr-qFO4;1|fd&qTD-(e;$4&@4l zbGBV3F#@e@XT}Jr5O}l$Wz(%kmQ(}S9!VlX#|qsWKeHOmokCr*9KIqIt8bn9K;)( z4Hj$){Pp2V$A+NR(QW$EWgS2%>codF#JN?rr+=-v7=_k16fd;3{dsbI6w<~QuP^6t z0rMZ7(MGRV=8o?BwXH3(Ng$SQqN*c%0&n_d*j4s%p??{kbF;!fLHqlh74Y98jUmO^ z!Ot0{F!a=UyR;V?L-v~3NKO+f{)OR`vZ2EGig#J6S?MX5UT;#b;fE$>sFm8^gsQ?h zNq-6xMLbT8RLl7_(!di^WzraOr|8>3H`g-Pv%&+WJe4m&g3}^NJx}Tj9((EV zH?6;L!cd`#qn$xdSd6`QDv~wlY7PFH#vcbfe=&9S7oj&+mPHDtSJhA6%~zM95@(#S z?+>~)3W?K;2R`NiwJqR@f%98!ve=AQac5MbfIC=9nsR9+ikj~>J=1CKd;7a0=!DnY z+OS-$y+}PS|Fm$D7``K17!9|Y|46M|VXZ{K${3E0vl>Bao@%{T1Va@>@>(dGDp%au1jM0I z8zdrt(uZ8DR@9%%LaxD|JV4u-FKNO#*G0R2bW!2{0xpzmA40kI*N;9Hkf28)aeMLD z=bVJw7#>rtK|uRib3513c5j=|96T7(Sf}mK^SExf31vQkyd6#Dpx+rE<{7~z23n)w zbw-MwER|eG&t=u@S63AZ4U{~;#yj0+H7|1Hg5@l+XaHmdXy!UH>KJZ={6fLBxIA9x z=W1I1<$VMB+T=&j^4l=RIvQ+GPRCdl<8xjN{CYiUu3PqOoJBr+jc9)6dheoAVZ7t) zwUwDRviY%@`MlZohR@@A#ycuetUF$&p4eb-4=7&qY(ItqLkmH>96q`Xp4ijt5_aU# ztcB0bPF&Oz)>fA~^5_6-L8X&lGkO6s&Nu45!aCWJbl-EENJ{&*8>*`QcVL(eq117< z4tk<hZ-}em!SilH+&1H7m29%yGZdIu2@%se*wx3ctGI-R= zdCBoY0ku=8u!A9rIz#|#au%>W_|+9?+O$l-T%CV5QJj$Rdaaj~>0=bEZ3!(H$gX!u zwb+rGCS4dAw#aQAyjS&P4Iw$M!VROE?@sTI%GGGJwp-13Q?mZ<#?r{X{4j%p=-%Eu zt zbYfrzx0CO|RsX2M^g!O>Y@*ft;G^zzRXkK%TZ~ax3T4M*-Dl1mC9ec31X`0oqrePY z(_^*@l5rjk%{X;Vu09dH15gHPZ&!-rC~)GVR|c-Gk2Iv}>sk{wAFiG}15ikF1#i5T{wt5)?5|@&^tnYcb~oKR)=oBi%T)cVXQrNKQ2PQdiWFkN+goNrr5jE z1!yt>wi9%5x?!`#*aOE!cuBrum{)uD=d%(M(J(&gxlXfKrJf7(J()oaL<4gz)YtH4 z_L{>l`qRkL3~?3UCQ5|e8yE2T5v2+jpvMYhmnh7nxsB#y`U)!f{dF7dY$eGyjNxl5 zE1i{jbv`5_2|0V_i~U(8%3|T{ABdrI zmnU=LW>p({jyL4>nJX_qo=&vZ0IY!pC_kg=6oAC&k71>;&S0X#Q%S;)g_9@B(SJ_$ z+<-s{BM$MNzf8UWnH+WXKKxW1zi6&JYhNxuV^oP{fE-C)5OBdhBZcnQr(G!}qMz^c z@#<{1f4?-;Tq1T=D*Kg&JKx*y2l0v!>WZ{r3I~+tN-ppnx$44_?!`Q;E@7Xj|NIt# ziIBAg)j5`YcO<***61SxnJl-l@eLwAYA%aOmdI7$@^%AR$-B#S$dXn2jU`Hw&6xzH z!i3nfO@(Fy!l05*e!M8!5zVUqu%iCqZeOb4oVT5!dN^i| z{+=>kZ-q~$7$T5bXP^bXGH1kBVv&w5FdZIP$+n2%q@#<951Wq(EfK1hLqC-R}a$9<;5An>6PnfUSG|B{8$~H?qe~-M9zP*GXd@6b&ve z*cXlh`a)#z$$(B;4BSR!>H4d^Rj)mOa}G^3t-tXk=9Hw7%``+ND72nEyNBM4wp{ul zULa^}WxELs85w#GieHzY7bwSScn(VCN(l1cIu#~(FQPIdf)hXzYHiphid}U1%M|^&JE?y?AaMEk{?7e57ZnWjctMWMhdWioNv&5kFhr=Xv;RlxAs&dtC zfkV1SXDQ&xJbyVwD#0JbW?{6OSBASuIiLN+hdllMhj}A0Gw>Doo||!BxnNd0x9J+H zGX6}WO0lC5jXags?bMs4)Do9O9kzabmZ4LU0$BRh2=X0^j>=7)wXKG>7%zZ(umhh6 zVN?k`h2{$)u|~4lTguRDck`sE#>thf(p@KP%hE9cWe4dPbSDQrxj|}$b}*4QdHi`o z8Wd=usxH}V9VA!({VNWm<`}2nev9|@iD_IHt3G);zGcw&%5pa683NITu+3+q?n^+@ zdtuO#6Mf||D)~@3RJ#8Z-G=-)E*RAgN(6C@sXO2sxI6);WIsf_TN9zX%45Sxu5YaE9M5ZqUeQN^moEo zblA$&vTXMT6=u5=;sDwaI2@R~JbH&Le$kx>XZq!*TP-mGhCv7gzPa+AOeHlpXJ&C0 zy@qt|x{_a`d$2Gzr}U<9t|!raFhiA37QEV9R0cx@Dv`@un4V4~q0s#<2HhfQ1ZSpC z*878j<4H2x1p1GE`2C!2Eq z3FIY`UUqhN4WY}@36dR&-u7qa!qqiW?@7TnPmlza1R; z@69&7Jctww`7GsN8(Mi^!OJ9bd^UUXB9l?VK~RJBfJuy5p+%iM2SQNOi17ID{S(9_YR^ro@N`%Ci5vad(;)D; zJ*o8yFYd^*5!IOb9CEeqoMNCqN>G0PNh-x$mRh#NQ@b_#35$SRg+T>b2S)qe&OEZ- zC6#OiU67G8StY3Po_3lv!v=Fzvw90XTbUVT4hPpz{;@`A};# zap=acs?*eJwGvLHFp-{Q19faXUMGKOw(vl{kx;NquQ6DK!?}Wc#UYCKQ6s^+h`Qn% zsxVI%6_D|AvB^BZb#?`H2j>026X*1b{SfY{>FQ5ZJ9$FK8RXTeBS;n_svQK!7K3gBn?2`yeACPkbuTG1y+uVF5=cA`@_Za!V+FR)#hxhID4plAtm z=C8L0BB50{(#2xSOdwxF_fIBW=6iOlpbs$u?yxzbIzjS5wZyh+>K|GY$r1m(YvuOv zu^nB;O90enP`;mKoa@laCzWbxpwldUE=IsDsw+c5Ogx6?D&wQEyWivOJmjR3oX8qN z+myKW3+sR6u_j3%!U8BKN2^YotM6Z4>4|Z!4Fi{o@EWElU1jUd>m-*l$f3Dn1ERJ1 zAlHGtck1C$qzbic7^T+6AxkO`5G2mKroGZ_n&jH+JI!tud79u_|Ae`;y!&)Y_9^y- zj&Cv7cKQKNfXz&b@pB=$fs<5qJcwxeK9zawX>!7a3xCb+I38bIMC8o83tnJ&#KNqc)eq7!NR1^*|-86Id@e0d)u z8+IlVlC53$wL6*ATdthP*|4hBvc)`kua9rIZP6i|K0S8fV1?Kpw=jkz#kk~~;aW(3 z(Ngnm|Apb=C%U3h_j)qX_>A4}8afgljVCU*u+G2R$sZ2V67-=Oh+wwJ>`azbQdsS* z3Ze}bYF$#nDcm2lnANFm>VpDCwO#5@F#4I;EzZrcX*KQp%6oSXJq&jS`-6jUwRCTe zPJdF6a4Yv$0^QIA->K*Wm{lEWrWZcfC{3IIPM3}t7-T+O=%-|?SV;wbWYGnu_B(54W){Y!=US$c`S`9p(K%S!fx&)coOh_do>P?XHB>_KWzwFXKvl?rP4_1{-QwEmuuv{ zBo@Y^7i@#wEI$=n4iJy2GwZJ2(t>^1yfpZtqXY-If9>pzrz1~{crJ3 zBGlR6sC#%_=t>a)^uyRK+?xCs?zSB50>Hw)Ngq2HEdN@KU!hnxj$ZnEpR2+5Paz+0 zV2V_r%FRjPj}tPI&+;#a^ZPmP!}Zwc+wwb8q($~!pTvumZhTa&HjisVo?g5fn#fB@ zr|srR$Wg!Ye8>iZW#iDRGUa($yX(_2C34N-g@Kae6m#8PEwY=5Pj3vTDJbzRaz0#{ za^Sscv%jz8xg&-^ChYHDF9O@>-hs(&@D=(guyj!q>Uuo!H;*qisrucc$p4h6?WDHn zgsqE8AI7TWS`7J_#K@yat`{-B|45r5S$F2wv8wZkO@&saQc(VbEVzJVuy{ zi^Y+H*3MKbWtbGc833~8?C@Gw`zvatJ))rpXV36Fa*3gheuY?IW`?Q<0WXJxtkeVz z`TE4)IT_z9g3Sjv#aySro@(_gwOQ)5k0_f85X5Cvqi39QYD;u@tS1`OM&^#Uw^W(< z-Z-=~`?WM4mwj2hSV)UoUx65x^HRFyZnl?lxouSefpO$IA}y-{3fA%Zk_1SmXx%l` zL(uLH60zI_)iznCHj0eQv*^VGc2)oRLUAC*@%M{?n=U)sEKq zSAKUtDw1u8381fq;wpKxp1-dOB268^>X|b<(8@W9eaw@1YzXdst4Uv+h=8^IaCZ^1 zA3Xm)-rVyzj5i^4ty7;*90lnpwE4fdma8vUL~mE4-`5qb10sIc92_H6CV&gOyqh+{ zK2n`*z=u+MCoq}czPmI|^Wn{~Lj8}bVXx2d2mo^vTXY(;xkBc?;`y6mk_dG?fpw3i zF)`}AiG!Z4>NOUomHUB|g4g7!ga|-dDU=x}OxTaTFM9UYkK1{~FHZ0hV!2+AgxmV5 zI3Yg`r`aG=QT2vD0BAc?rPUr-?Y+E!%V3Q1!V296b!*?wkgfueK>@F($eW>bl1cfT zz|NGOhxi;=fu4Bq3=yFcjvZJm9LQxb-7oGaPc>a&U+9uO-GNJ|%5ZZyMZ2i*9WHVh zErU94qn9cZP;a^F(V5t(WjMAS-<+@t=_=-`;y?OC^c89PDG&v`lIj! z579aK%H@f==^?4=@A#y>%P-(%bCu$RXSuj2L35n$y0pQ_Hj+fKP?jh7Y=&RT81KA2 zG2oLQ4yF*p=d%2nZtF0Byv!eT*}RgpN}wRFJ5^Nyq~*^J)jQ2sSLE*0?S9Q!dO{7} z132ZB8T#vme!~rLgke8#>;K-W{1G}(z`u&3$+jD}pY2_G`;<3#ZD3M+&NIxPOt0nX z5D6-=Vt+@eB^oW+62nUd^!6^Ni-xEh8%v4FSD{&p{1U!~M3fESS>g z2ICU#_q%Ungo7Ap8OuVm|0%qWO{qTG5>=XGfPT=IzlusGO-qw!Y#eb$-_(1L;|J4q z-rL?st8EZUO)cg~iXjo?h1abmIgX+dt{xe$zHT+|YMlxMt z+ovC}twf<&*l|Vl=OX|SAI{a53g|cf+8y^ zhruHQJUF>*s?3Iyr%HE+6XzFn^u!+e+zK1Z482Hv817Q-Z+e^S1cYO9t=n;6MBf2_ zqh2Iy=`qv&6)PC>4=z0HJJv${u>-IT1KlBAuK3p_{lDbogb;NlPP@4@GZ&)+ioQ1y zfxbx+F*MAEzrj3eBVFQqz4ZkhT$ZCQY?*4(HY>58$r3;wDzUn7-q!yget8}sdop?q zrHl`_76+AG6J!&p@{qy6!V+CwS@C!CiV&`7JtqPN__B@62P8A_@1lTabT#fzjLsK9 zt5!`e#D9X$^Owb4k;SUMFn0;6qaP}aUoRMkcq?pa0@MJ)(Pi6~^Ea;ix(7VRw%s7N z=Qt$-Ylg}K-_MQ4fu)==#u63ryZgQqblxSK3-sHntyzk0N3H9tQ=l499`)6~dg>O0 z#eBc)dxE>dBcX0rBZ}p7e!0vmSL;L=IsUmoHw>PNNaV%GKcS`~Re&<6+@7{w5$ov= zflEa9G(NLhZrTCf4j@@{XVl5x2VLjF;MF^YW<&lX&ilM8`%VD>`~P5rY1XjkcnKl` zm94GN{#42dyg{SQHGtCv7mb9*E#)`yA@aH0*4U zdt?sQCLsXSY-lFnoT&AhH(#B)Xt(vtRl9McYyuG^Vm?t%omIXOE|aOK0$~t?Npa_p zgT=I^Hl{uo$jhu3dy@HL(3>&Zh)9KKpWQuF5FP#GND5W48e(xq&R+*+vJaL2YR=n2 zU}QnjL$;6XZjSJOAQoQFYX2w?*@w+oMrAg^NNN^B%Lp)N(O|xO_q|(o40_HyWB`5l zm>WmSk<`qP7dvGZA#8@;+>D9SAx17i{2o*!IX8rI@<7xT2|ifQK&d2Hs2>tiCZAhi zIp3yqp=>*N-o)Gc5PbV@1~hSy{w9!a{@*i09!j0X#C$JwhomB&p&ETMD2)n0$+%6U zzv!kOW}?Xfd(;CDM|)^$Ze1x}|Ep&AlV#QY)mDC%)kcGyjR9G60H4}UD^Y;zMEuju z%^*W$IVHPMkBH@mK*?;$*J>5XE)%(u|Jp*r9R3yuL6H6??1vvdbc;I)@H25S* zP$TK&$A}d2?kOvXv{Zq10`c?N>g0gzNIe?0-`^>mDw7ib`1?O8BiUb}6bs0w8Xd5& zlqP7?fb^FI_cmU2PUB|uKRp{`Ktjy#L`Tq_;g^Nm67uBSMngxEM9}6-%zS=*GtdvL zEvzbN_bPETX0O0Dnyzr&E>4_FI9qd(h)Yp6$8O>0dkYrRwOb{t{0l!6c6ZT$Df?@;Hu*U2$2k*$@FD=Oiqo|b~g6)gbb2m+R$r{o9ePH+r>)f0zZ6=rm z94JZhMO4n{e5l5omfhkn>|+;3)@$x7E{zSrpkxt~s|}4_T@JML4M|9Q2YKNAk2V3P z^f|!XCWGYFEZ|~o%!j2E6>uo&940Vgv4+YT?@+oEGJZh81Hp#~eZKn-{po~*Lc!=7 zeYW<@*wc|lufI;(2|DSKu-Za0aMI}II+CCA@h+w!*Att3F}=be2)|{|R)EiNgyYd8 zgRec=jtpb+QgdBqH@0^Z{i!V|8ef$m1*!y=hj*Q?bAZBS8@tTl{t%7>yD?Mr7qc;p zmFXB~D!qKu4skcn+X?C9b+NdjJ^3B(IlP)i{={nKkDuZ3+m%c-1<_W`=NaH7qjvq` z>O|JV^U10QaqHjM=~Ti6^rjT%jbn&cYfCBeGe>eF;*RC1%*FXeGo3c zP#1x)IbWH_xpM2ng;CSN1sFgU2F{iw9Zid#e*g&rt4$NE*#CPZ^#I!&uKK2_H=-iAXO?3ujj|udkC)dxJn%!$ohRoWw#$(C+4-kcXp*L zUiu~;&jR)~DWE@>uwoaQjRY6?Y3L-06BjmWLHyi~CwdJ7lQj4AdE=NeZ>c&;=KZPy zz$1lzb8mo0(61n~@*z@HRn@N|k}*lY=SDBO^QvB7PZEhs6tkLNzKKE569VI3kP~kN zqsAPE{i`}+1Z9?EWsbKy6&cjZV!0{rymz7L(q35$!`g{+j$>_qyqFi8g+1LW)M~0S zQL`LZvUpD(u+|)V0_KuE#H(~58}!A+f%y@*-?ZRV(wU0b;4T|THfRRCb1~xiYc;iw zO_8^U7v9$ve9bkpx+t*pAp)FE0T=TLD!!}sO;S2~g>Ab(#D~9&w0jR@B_C26T>Ek7 zlnv8g4+ITDiPnZ!0S)8gX37xA7hV~kl}5N3cBYcC>b6LBr=K$$DIxE|Ks10_Qis=g zb6$En>-o+a9!`&yrFwYShT(aQ7rRH4EmqxTrF*ievOO8xX|ZRYv!^OO0V`NjRY=0P zL~s=fxgM*2!a0?@u5+VSXCA+xDT0SrX0F>TInsV-LMTO+_aWe@%y$}5N$cKYc()I* zmH4NhcUQKSwI+Ay74!YZ;%aG(I5S6l=VTF$Q5E}g-PgJG=UYh{cLem}&%*2yM5(Jz z@6-|)hY-3NWUi=4q{dCA+uD!-%MDJ`^+9i2j5dIfVYf1yYjac$R6_HIuubC`oKrRs zY@{OY4?8Y#i}D|;GwrY6DCAS;a6eh)9mOG+2rL|&3jvS$oJ*F&%`>kxYYOldxBv10Ca2hJ5Dh*BtW4*W&Df6f%PE4w59s( zW1`)2Iq*CFK{4)RqgNq2pWIyf&nbD_!y%or9roH^qlF`5{)0hGaad;Z8uu9gwOmpY z^li9GHE4crZl=Xt2?vCK)-4(hY*11d50*RuWQa@^xG>++;P6V@XJi9WsBQtA0@nfX zwA;T9oht!#+Vb0p=FJk*A-wls3MZT~7xWAp%c3)F#6^9!cUvnWnDfGTj)ChLQI-|t zKw2r_ljJWMj+pk+Jo|*(l`(%4^WqF8_EfW6a7Vltt)O^x5D;I~q-6b;T~yy6|9UQu zUDcskFuK)GI-1AsE~lAtNKB^cM_&4tX^1q@0(U1D^d@|5`1Ra^l|aiSum~Mlf?(bV zTkczjf&rRU``m#Y?w(0p2K!WxX2?u&P?y7V)BbTK9I}4asy64by-X>+}MSfMOupaKPPle1UwiHlT1l7(2 ziuc?^LWpXClVxXq-v)ltBZ6~sbSgA48w;u2s9zr~{MnV{K&-w%AI|R2Tk2W8llLn_ z*A>~w9hCY!^Om_#e_m??vSKKh%>6Q={kvL2!}U5GB^a}fY2R}7owgR9a(T^fMR`_@ zf%J@L$tw04%R`kwJ0!i(n7cls+sAsc1gw){B=NbWWpraqP+5YGg>MOtO5?C*7CIL=im3Z zMep0EamTI7me*l3z{g?j)9b9cCz>tK^SxSy z&DdLVl|bqEQzs7jpHtV5LJ-B=2f4peZ5Z%EF6jZnR2#omw(orzynh-SUky)r@` zCjk&`8CCC7%F+gRWEj1Vz08epdGzFaW21=8aP_&%_cRA^72qt&9GPlq+>9x%28-NQ ze&P9ZbD3E;LF++hw=(6yTIcED)e-M?T8%N1@$}AmcNA=SI>K!_!67c{LcvQ;{Z1JH zpO||o(n;Mg!^2Vs3+Y8VNwc9sD^D&TF?HB*jIRn^$^S*Zg%%$F5u1apuC# zmdL9Y$w?*==#!mKG_&JjPhG!XNYs zrS+uryhv=yMvoXEcVU8`Zh8{PC1xbR{qaLNw5F6(B-1wbaYaV=ImcD67rmdEUDb7O z@EzT2i^*VY2cb=m5v|EPu{J*|P0>))MrIi^P-GD68OHPslFV_}No}#LptvYj98x!F z)INWqQ_gvuMaXL^a$CO3#^|}bPst}|YV(G zoY(W0?9g7jfSg*j^=(lubBOM{NZ<#Ul4ol{q@*XoUH(97B~?EC0r6DXtUHRW_Kb00 z&FQZ4>n^0dF{Kib)<~UR4+IXZxBC7TYk+-BHYbc82@Wf4Re9#ZDI18W93>ubf)rTf zbtG!zKxvR2N8XbkjTRrFU(wi=Eho4oztllOXrZY{KIk*O7OS3U0HXkoqQ;{Y)rp4dDJt-sNc6I&xf4JLCwgbG{W(~uT4q3vC7UX$fX8F`u1q#LyX_jY z;UQ7Yn^||;x1us4$6!Dl>N`HOCL)rrJ{k8^!UXi|z*J1*#-8lfDUlyB1W=nYx*sAk0yz&Z80XrTV*3jD_!605Ghu3 z?7q~jx->??kK$N!ni@d3yT)Vt4$NVDShPDzC9@SYPj@IUmzq`yr^ih?4G%%X{Y@?r zYlz!#n^Spid6P0HMsFDO zPaRb-e?Im5i?U;m8pDw{C#l~6IfbxR5yAkK2uo}A{<)yB6`>yS5{LWdD`kKydY8vuY>w`Ymd;)OSnay!Pusro0aGKrF$b9<%-1U@c_y!FkscQtw<=7=cwSm%hY_c zVqVB94=?f~0|cWr65jMWi2S!98M4chV>TfvBt;bAuqXC(se_cC%!17V$LFH_=n(9D z{a$YN>VIPV=e~zi!zXW+G!8hJM@>x;v^yvh=JauP_}D8fm3ZxzasYFgD5>21JIidJ z3QXQe-*}Tl4CC1qRd!dUQG#^9v?;m2a<#t z5R_PS5N8UdiXY<@JI;PtDaX&BtM?4E2!s^I2WAI)AjwquOmzjm7SyDgSsh+3@ytk4 z2;H8c>-q~%Bl>JnYz7Y`yJ_e7Fg`1P^L|JLPnOgIDn*0w&gpmW5!qESb$C6PhCLaK z(iJ$;-JY1vCHBuibdndho1K)`?kTVSeFlcznY00k??2!QgoK6wWjOGFXqmd2UJDUA$qOP`@~~kIQdbf z_Ynh*NM4)z_ba3&!7UU&P?nnpjqTY zO*GJ6E#06t5_qe7QIvIF)r-!{@Q^e>m85-C*jdz$u2BbQ56)ag2;QU}qfP5JmFoUU zfU`6rkJ}>e{^cfvlxVl{pk~p#-^R~WEv5@X1hvDaw$pl`2}#L1lEcLJ(xVKkc`^a7 zfK4S>tWx2PxiWcK@#y=y+qcKz!ufM7fTD0)EBNwZwm$f6!L0K33_av+tpdlbRUiKE zh0mQPJ4M4-8^6|P^TdU~TkCfefYx_45LuE>*0TgLW>Hbp+|cSo9;keh;IZ2H^9)fa z*bKzB8grHC?&us;Q0-u~^Z$XHTn5eqYHdlgYVW_7O@lp|lmIoB(=rrZ2>_Ftm&4%H$n!+-V{G{(ZKivaENj?V6< zm%%=(PE+3`{FjQSe}ZhgG=vfqzJXx$A>l8;`EFY{8B;algc95JfZrVFo4;ILahsN2 zvG6PLr*h)oQY5D}y?GBTY2D{QG?(sfT;c@fn)+3L^Cid|I&Nh`q23|JPe)~O=qgZ* zuBa4RPxPaq)LHR+q36H3xT~N;(cNSH^5l#%G#i)af3$N9!@j~kVj|FQeEavrao_-C zhkOu2w)gmd&IbgRqd^l^uUjtIdlt!|Q0vI7+^5l<-Z$~9As5jfdkU=$gyINA4>=R< zt>mwW@U~b5Q2&(3lZnLjm-T6|+$*Xu7Y19C_AIKLjtLG-MX%8sv7FWM!j!KdzLGZ zqt|n363n?-5q|Yoih#DAX1;&)DC4ZFpnU2@7~$#ZHuHl30^1W%P|CI~ma$Fp&(USu zLRM_X{~+K)Py>OnUv7vqB>msuBWo<_F9p$rXR_3Eu|6LKmFrG=2yZ9`NI;nPb%`k6 zKU38ys2<(bd+L6^s050;PH)!!$TCSsSAc}E_+Oq^KM_lw#~uZ745a3RzYHD@eKTuK zA!H8-;zxT&IHI{(=nQPM_5J6%;3AaU*0M#Z_o5!y1eBk~r1>k7Kuzu*%z-*7UN}g& zMGc;r&ZU)Y;ZE9@ZR)im3Ex=@$sBT^GFrZM5^fd zRp4a5z=H%*skV6*XhhbnFG-2ya21 z!TU>%;u#MBPAbuAn&UXDsk50?;ip!Paw^Qxy&=A4P|=#OS~nE5iFdJ|>?z`EmB8!3Yodb%(R7YAuU zcioXe06Qn(P0ZM=RL~8Vm(8xTL4yg8RQ?yI^U8(9@B~3*d1_rF;H1UNeEhaDu&9Kv z2MriPFXplofUiLTf^dcLQ_TbD^y;FX;A1s_+a!rbGs)R09cUs`R-t@2tf#FY?_g8Y zdQ)OMQ;FMr@o=b;Lk4nG<#mt|S8Js8T8~1g%QloF_wm~9U}QpDZqs5&(SL6B`J%j| zW~tpF*6w7I`;#UCdz|@DqRhrzX#Ur$8b#3Dfx-NRwQ&cyzQ48jb1tc0z6;mStw#iv z9?g~&2p(wWT~5BUVO&nL`pFs%{>> zH*Na`{DjemFHs-Zgb7mWO!1RFcv{&7Olz@zJ^qALGz8%K%{o5bwa0bFi9qnMQv9g# zv{v-e`Rg-~GBs@RDdC6@2)#fH08vY1OzC2U*~4;2jjS>p4T=FVGKb^!T!>VKh8C3N zi0?>wpXa#1G<#500Ge%pJ$u@m_(w(_(Mi)X#thDx8y~gX> zd{-#^js;AEfq@L7gk!5^fE-vobFO<)<;S;$JY+&!BeBA#<^O|nLF7VYiTQK4 zW&@-@yo2pz)I9coQgw;nO{3txkNx5{UH6}r&X8>n%Rg40W^g+X<@~XO_J?AAM7U&( znp<UdUXg``4nU`1( zCw?Gr*e$-bDXcVKvA+klI!#E?6R=OEx*C8{SgXoXdZi`vL&6$I+{WG3}V zFCFJ?G^<9KR_o@*qX#ssJ8+Q0KZ zn0=F1NGv5^VeTqptQ8Ne+*C>xzC@BHlNqQCH&@t>{CYi6Xk52BFng`UyH{P$tknVIGcPH=_ozz?0b;Im|D0cO@Dq z!0K)nIx_7{53|(G#9%cNI+XXA^**H#kJ2cLhl*AW@AH~#{|C3Q5$kZv3PTU)#gkV1 z%e2?@Z~PDnKV$i-b0z)HQfSEN4S>e2$Wlc)t`&v%NBF;FTJhWYq`T9~q~#b?c(T&H z2zgb(G$-Tl2&v=99*0yoys*pkW4`uBOMHwj6Y?m(>9>&qZ9?Zabe=CGyr-Lp|M{?E z)_l-+P)BWSWh#Z6pq-@qig~}SFxNUP4Kg+?ofg#cglG(oy#oAK%=Z1HAy(V%&6>Rz z+fjv+E8nrdx)W^_8x<0_r!wac~Q?d zRbyyC$~nRz{zJ_))V^>~>b~R`HE!G(@<*=k2G6qSKja5WN^7X(fBfD9(J!Wy;U3r{ zprHo1DM5r>o~L^PJ@9e5QwJXIiUhHQ-m$)%pX(G#2G~@9m(%ZOv%)$qSwr$71% z5K9*54rg_XWi*X{5s=M6xCxHjX;?J|6Moq=8F7Y4{-i;Dz&p|2_X~j5VpLdLaam7f z=M2ZmtIc-jg8JzoV8*G(&3?8>&|T~opa;CMp|l(Yf^+UT3yiB%@2K^roo03V;QJqP zre><-T)lL9S{4y?c}62bd?Y-gAQ`;^BjfgTNunVGfiahUG2Kg|r2uP?$$TMTWA@g~ zJCI|sU$EyiA|#kLgz=ekLHW#Y+CkX5?@Ebkv(4ldGZ2RMA*`0&BB*bP{fq^EUqbYM zlzke{ANhR;<8OH9INtvGs0H`P?>DsUh)-VF`_I9JJy#WOs{lxLDnM+LDo2+@E195Z z6~=DnX9{0OiRnyloY#Q^j>u$g>p2J@um;buoi~rzn50XQEsU1LMgXKH)wsL1>S$SD zZlUQ2nVp*RlftFs$4H41;jNVf#AF1U5rYQYD#$*6i>s~)xx%RJm(ua2;2<}X{$H>q0%Di$opP!CM zd3#qlla3pke&^G|Jp&&fo$op12z#`fnD)<3Jdn{wCq-^0n7?N!krt1txCVXGNAxFhN>>v8b7M2UWe9HRNv^erJEu{NWn3BvUY<>5doKH( zG9Y*tINE?XS(dJl+fX&GR|7_U3WdaM7f|^81|@99?Va`|(wR_<7UTZ;-<`~P{m;Yw z6>l>SW%g5oQ(z~}1zZ}sXCAmA{s810`|>Pq57s?(HuOMP@8S{xVU`r<8aS>neFZfy z1s|c}G3W9X3A71nvk&KhLU^*0J*rv==^!-c96tagPBashc;K#ZJ?T?!eI=mYe_~m| za?B^B`JK%bP4{l_Drh7Qi5A9A&cd$U`^Sdc4dz zpG_GN>@4`;42*QdM3E#Z^J1sbkCzl;C@HYs?EY`CQ)*!>xiw=TFW?TD0JV`fVcsU5 z!sgruAkp}*@Es!R?DbMHpvNR^+vDvbW~AROeTl`N@-ijoj7%mCsFUtdOT}l`wWt5y zZtIc)^>ypZKL|0vTt)p~<|<6Nhkc#q6z=Sw7luw819V7CL5ILTyQ~D;v9E#bg9VCF z`Z3*1CwD*rFR@x81si}n6H;Z9qD8U85`c{Va0ZFs>dVmyc|z$V(=GG1Vs}?s`=#RP zwqY;Tf-{Ln^D^bc{pq&}Xu&xqhRKWjoci5x{B>iIj6;xOsnb_sHQwG!vBXO7#wFtW zq=0bOsq#Rxhi|zdK)x_jKKVth#3rh%TuX13gy$);JNdPP`|CbHDH(fvPO9vM)6hR< z;!&kSt$gU3!dFh)fB+ci5XDA+kA*G64{S|)r7=NLaqjXA7`n_^L_20R77+1M{m;+j zPVCv-O=O33Fr&)Chsn4eq;lx73;{M1Lg3V~yngO9fVZHh?+X7bFzub_oNy^xLJ* zvh87j>Tr{TNo|S6g31=OZf&jEaRuzRnQTA(#vS2K#4pvohUr7hM|W{friZo>;Qk2$ z8T}<6?Y?1*{)!Qx-e;JzdA6a-y>i24f*8Ai+oG>ge=9X@}1 zrUS&V%(ceb>fP}E_R_XUht0jKBX`XZAca^ZS0p z?2B#_?<@49jotEx3g}t!5r>&~5aAqo3mIyMynwwjS11s-xESK-{>d_K6)M^JnY(HT*wKE=BH{;xMWjw1hmu=n4eII3T-4_APnhe54`>hunb z1}td8GkbC;cS;E0_&=kP#D00;476i&(@NzPIhKxb4_O7%tJ0lDZ3Y8H)oja0m27gR z#ehtbhPfbG%@KUG-DH0=*x&kbrnNvd^mSIjhACUtA?z1N-9Go06puwSF#fsUw^z~h z-+_n&0T}z_nTF*w$8rkGHWoJ7* zY|+9yZNoRshbkL;U16M~A+^0;K;-;0<#nf-cbbjzh6^v|!tE?iN9t08;q_}Gba>sJeBc&Vke#J{~2(3>+Nz^t{i_JCwW zGtK1ZFEXExd=bV{(?w^wE4Fp}2VZ2|GJMmhYO7&ew%abk4BN3;-uf}dRh{R?k1}4U z*j&OEXGfO9P#dq;tvCfo#5kjRf-RS)dYNB8Z|2?s6n1i}Ruk@}chWz5>WE`8WSl@y`* z-jsHNP`cjxag3z3$@iUNDJ-OYLEQYxb?~ONlb)dlr*xK%De$HIF~r@a&Jju zSkLC$AUW^+9tF-4Yn3|>tdi|6C!NYQhK)ikH7 zpV_E8J<^9hw<+iK9Nu*8C2r(35ym0D>7ssbQJ0YcGp~=Fb>3cWS#W%_vOUE}$2q*O zi~VrGhkP0 ztF>mdE*^r_IlS+3+UVPSS{w{z{c)UipTMGtAWo}krfvDB2V)I(EB`Gur{(XDwdPT% zckhXRJd8biwuKKJcspbqS?JBR6yIAU5rdoF(thTAybAbR`X!#j&Iqf4k7i>&6a7z} z|NqhU)p1dE>%XsvfhZzKgJ2MffOLnVpfu90AYH=HLx^I~DBU34Al;~hO6SlhNS82l z&0QOr0e|Ox&-tBuKli`QX74>~J?s1Q^Q`q-K-`Z8?etw#5881}JZlQ1*SJSbL-pd3UsZ4<%?C@cEjw2B%zviw#_Wvi}LVD zWOfG|@$FykABX@e7KxkcVL!YIEOk!tc>Mo{m5*VKgV(a0Ti8aT zIqVv}U0yOsX*>UFHK*bLzrDfx`IX}mM}{il*XU55qi2+SpN=suyf~*h)I6LNxX~dn^Rz!@q%;uej)gpBDMeM|5_F9b3;%vG$MiGWW}KBR##I{D_!lTMl$b_-))W94L44e9 zur2jZ0$X2RIGUTky+`c%HetkXZJq+vII%v2%qe{gcVy~)bK4k4 ziV+a<>;vBFSzjJ&|DXUca00%YN&BRf0h))`*arX0^E`iq&a1=!oE1 z3hLA=To8;fvt9^Ksar*8fxU`A@fN9y4qU-(uy}EB688e2!qocYE?0KhsO7ozv?_qm zC&q)OFSyiNzkjqJCZoS(uNYmuqS<=U(RPv$dOCz6$DdtBkTr)FN!FFFl)dFj{u|(yH0;%FUo0K)Pi?4gRYDgtUMd8Ht@mh&wo%j(xON?I)@md54HK%n1=A z&hQpjD(oBg0LGG{3S0;n{J@K&B@w}Yxud{q+p#Yh|69^s1EdoPpyiNe1#SOoPu@;d z*C|^KdZyH?o91ZU3RcTEsB0IeBtAdvX8B@bF3+iTV|$gm;af%~-(u;V6Uq8?6^k)$ zb#c`@to4<2DK9UW&B@`1&MH?a1JV zYL;K>c0)z3?>qnvVdf++n9JFU`Yc{2F7ORVT)#Cx<}c*e%%xr2vfE{6@M#Q>e>Am! zfX-#ac6;8cXPUmwe#B)U(UI7hM;ef`-)jk$WY;>rk&Rerws!=UC}S(E5F&Z~|HuNDfJQES4u zD*uJG1DQq_?}Mdrr;#*@$l6-}~wx_|L7W#mwh!|ty!(S%9zN`h_j&M+MM z9bnZqD98#CvnR`1HeEyt2IiIQX2VBcn|7nT*Io)GY@Sj3o=hsNViL+wY+q@oQ`M*d zXzUo1p>+YcA03bo>GvG4R5($!yB4XMF`2#uHsPU{3C5YJUh3f|+~y!i<$%m!yU{ht zxLhEo&&(QgVPO*ki?%4&6C7KFme1!1NcpWCe8M^2-)<$9`g`Zamt+c5B(2Q!7cUWl zUVV%;>~3%YKdk3w6Y=%98jthBZ%nf*1Y+D=9i%qC?|#9y)E5em%a=0hX(?YIhR^4Z z49;RP55%PzG=;Gi7kLs2d$Lq-uvP6Wdv5^a>-{2KWZg*$^PqLjq+CP=cc9**36i*2 zDlU#!!u&VI{9T#qE0&y`h4hyP+e+rd`-?62&G<&?CkL967N2*oK6+9wRmS&Gi@l z06c@vhe@i%m)xZusneY{^P~;&S(7aG2WRsjkRA(W$ADM%YL)|dQj(vqr@BLsiMRn| zZrbyh91eGi>}_}yY$A=fco(>kuot;7JfIn$L!fSZJaEJP3gm%drC$fxc3E%;y)&f+ z8m-u;Iiw!-ZhTzo>%ut)|6+8AV+^3dh0zC*Njs(X9Jp=ZBrDiQ0rS5)$W0W`U?)Vo z=^WaCtH$QR$qHbI(*VsOG5K;2j89X#HN9PGEnk$nStN#g8k&@7}py@5x;Ir z?fe|uNStU*38brg@6DtP6Vtki%(k5`yOTK#^X+|-@7n(G$L0tksxeZpq1LvZv?zc?N{ux1Jq$ zTxN-xZ{_AYCB>t%BwAsx9Tq(PD_p%s2~oR!R4f80=Rw!TbKn5d^?IOlBZq>KWyoc% ziI{ew?Oh(H%whJ)5>2Yj82Nc*cs|+MN+4_`2_>*B=e*mk0xM@*1Sb@>P}8Xb1>xT_ z^2lOJW4@xas+Dj3xoZ5tnbNXJQ_Hk<0foD)RFeaV6j(%%J@OoHKpCe1vL}h37lQ+B zexp{z822}aOHS%|gcfDaVAk#E3boyG-xEwvP#8#mCHRB`{VrI8<}2XKYGF)w&}-Hv z0+4VHn>`9zpoiCiQxx3rKJ_AQW_1twQXNSwy|P1FtLvr77}R!cRftIxXvU>n&Csb; zkQL}jB-mOVxx#$OM(yTElH`kt%|6++#?rMDBwCdGa}}o20Rz5PW2=aI09P)fg{JRH zTuv?98-xKCFT6hQA-@QKC4_ye=S`OX# z^>FFQIn1A<`v@>pcJCkoVr9$F z=+uFrakqvdKz=DEvfxIl0K|Is6Ly0R?quu+wd5JuVX)^gSNq31D*-w`=PVceT7|Z6 z;$`F9guAR{oKSNL*AMY+%-(_nQyNtD8wrH$;e6$_UumwMD+Qas`{<|o9a4POn8 zf)yz~QYRlqo|Rywg1w)mk(+=hx%152U*rr#$?y0<7)k+3>e1u*vj&Oosmeak{(dPQ}rqpU)4oOnm@Ov(GlQ;}zvh9IVDk1(i37Lameh z25tH(br#3hr6~96r`q!x@ib`H^vO@nRT*kpZz}O_&(4H#nVV!58?=V;!VE@pkK^sA zMXhfO(}AbxUD;UedXsgWS4U72l$~LI(RO6`p*k*F+WtL&ZZ!p9N90j8?a!OV1nQ@$oaDhGOA~ztF!UboTx2oo^_YyT=Ey(H5(-a zQr5GIB9kyyCL*l28VY85=lFRlXQ|V!A-XrFuAZ-pKSdn|`@)GTxn4Bn+7PvicBXl^ zBRk&W@DHHqPj&O((=zOGolY8?&8bSa_iK6<0?dO(cub!gD-}C(`!H}T73T=l2xm@l zH%7)uXg>OqdYiWD`1s-U(MlXrPy#3TiZi@ihcX&rFuQvgGRED7^wHGE>yePS17AA? zF1SGi3CBBl{amGe{_+H9A3- zHfXK-8=cPJb}Zg_+^yd3KAKj5ZLvBfW-AoYvM==_#BSCdYrr^iUj~kY^6;do{Y#>f zZ9o3e+A+UxywhJ0!(RF!T6BhPFk8x8OIrc{xoN)8Mi0yR@)3VMBvY{`vsQU6uNKSzWEH zkmrxjv7YiQ{+X~WT+~Kr?_z`S14`ug-SxT)uc@MXLyZNNg4jpj=uijd3#&AQM4D5A z76uDl`|9RmpGb>x#ypnJl7r+zOW%m&CiBv)o}c&7`XE1WNq3#chRKAPEy_3ROV%P7 zXV2E7vlGH2`MARz6F$UIS7ACnAVO09>t{Yotrw#*Q^AvnVWgB*osFgulKiyd8=$Sv z@EQ$VYkLl;r;a}YBEtvNPP$5SGs~t$0_-gDuk=?e5fA0+69CToXKv;Y8KK<=|k{ZaBA}fC1KU;lVMW8 z`4u3p-l=QV-LfB{^_%S|G(AhPWF7s{?i_Ez36klOCbqn3gWUu-X&y}!Q?WWjui1Cz zfreBSZS7xqrR%TvX1??~hL(-Q0w=6CJ;PRKYO|nnG91f$x&;5($wSV@DTsp%s@h_V zQ6w^b`Yc)SPH1*g{_$WaYIh(R4lm-YvDZ|Kf1sS6j!*SoKU|p!Ah&y*dz7!BAN>MF z{`Zu{_G5oefD4n>%@jj~+-Gwt=~@J53u-?>(MktoG>)fBbDu*Wt(&i~mW^u*?Rvjq z^~UE|7D$ASQz{Ht)g`?cJx>y&0xxf~uin$Bl`bBsl!M!e3SE9UU{S3=X}2Mt*Ir-x zxq%G^HX~lo`@vT^=FKA1s;xV0>#{mmjHn@98e~V-8|vKr@a4+VHwsJffui{jk+T(5 zo3Gqz!&9PzU`=D9ujya8=wB*1ND4|j7fDBQEw$;%iu-rN>DE|!Rdq^+0=6%CQfCzp zKlg7gZ=Lj+IJbu)ap9gP5fqy{A>_ zU&&zU-vmdV zx!|;=v`KBB@emE>9MCNhK~%nwYg@r{ z3OnVLDrYy4mYlM)5SWgT#|q~{trv~4#>M%O1%T!yGa?T2ee>GbRN z5>SlHy#nj5!AdIL^smPE1V1rx5AY1Tv242V{z`dWYspf=U^Sdr-^6R4H!ZfbB>vUi z#V`h@O=&&F5_lCv>}ILD)Q=V<>T&|>V|*JuH7yhZb-&X?&h?Vte6aM2Ij>D zm8#%)#Qu`pj|a5Bc**PCL&m4mIw(pK)Y7NgEk5RaDWK}IYO5wp zqFD9BGP_~H`&QIDaY|dMD2Ev`PnS~i#fteNo=uMgm~8{qi$!1G?TJ0h8#8C#mVJNk zt%r)G41z5r0>h+=Rfd0aBQZO5@hsa%OMZ)d$I<-o`WLQiNS^hbk;%E%g)gKzkeLR| zH9KU*>Pj+2@XSUb^(K#%cXN%eYN_O^=^gLv*oZN_pn;akr z*`;)*3-`mpf3KZpK1F5DV3g)nIzh$OVrFhlBafg^QL5?L;Xp#9R>4pO3524 zg!t@+T{EH@&y}wK*l6FHot%@M*_cYeX}26(eOES7LV%JtsPD0-yzJoTk*PzF zOf0v|cD`?z&3J^c06XpoIS-|F8-shxeENHx^%*h2*~>?W9|2`Yre7Ig9%ZNii}oop z;w^;d2uN}xBQ^4DPV71SaJ1S?dO^UQ>l~WRs{7Lv2N~R$3~DwcMW@ zuq}39DrU@nFqe_B^kRL)n~7_P!Rm{blJJ|ySH&PlWR@=>+J1;>&uKdNElz@IQwpiO zv9WWj_k1rYycM6}6hPJZQ?E4|DfAJ!e`@4LxdEb*}Vggi8lC9ZF zx^`=7RJdLTwe!06U8qL3LdC{R7$g=d=H6A;$1?K?Tb0@(G=%qTM?QPHta8TK_J6hN zJoh!;$TX|cVsN`Hfj1?U(I*1{7BcC~O8e@05%BF@S;$=c+J}mLP3`j;II)JP&1#gw z&PGk_#9YoiY3^7N>sFzBVKLIhGJgnfX?@l*CWmQz;uEsPHzTKn1F~Q88e%EMsqH^i zY&)}5ZR~ify3NOUehyt|yDZl2F+RR^am(ie;yT#wiF^dv6yrS|Wv$xo?ZF+mw& z{lP2=wBZn->;AQquC~qUg@R^$#~)NgKOz!$8EY4=D4tTJbk4C>^$1MQ(15S~^(Glj zO?-wD0MqAz5dqM0sfz&G;>Kxwcyb~e5UynE`3P-~jt+y;sOSlcOvX2+t(9w@-lw#B zQi-T5P*psmxi1J~=iBo1DwekfJYB-;@4UV*9l^u8Wsz&wvRd!6O%tMO{WWU0Gg;bq zwP%iu-LOT9GXJwod2O&;wGapnSS|njn%7=dX$oR8LW`e->yMqv*2{>M*i!9LBC!@1v^MO+@&bx%B75rTUU}!fiHRkieLG=>>9)_3IVA zetpT=IEt8Xb{iWc)ar-QF${g3n3T))sWX@D9WO>j@*`NoJORSKcjI8?=~IZxvdjLY zXb%MtP2?CPFaK)4h|10$K)Xi5=QG>LQsuMSqb_Kb zC8alUmd#KeG5O3T0}2V#;~9@sxm0Kp{)GT(gW5f*F>rKtgQee=Qp?`s)@n+|?67U> zG5)PLI`x(7JM2rF6qe?c+4k(b4 z9D{3{HJB+Nux~s7aG;GYsw6NX102pYW}$?J5~xG-iRKZgmm+`LF%xv?0AmmcUHB5A z^Ei3_aKGR300N%77(^!Q2yqN}y&&m1RZG18UjtxU^qlq^ zPL(m>jS)b((oyS%SQ~Xp+on8-r~TmDS-lpG&DMDEwU;V-pmginJ{2=iu0*qYx$sf- z@Oo!(+<o?wpA(Ru%?+|PQHSEa_asgzrR2ECc1eR-aYpeR}Me(+*1eSW; zOe`n2tJdQi^gvk{;P2Q-D1yed*M9#035FN(Lqa}@${z;yjzaMaLtC}Dt&K_Kw$5?p z?+=qPP5^Mq#6XEB0z+vUUr6RU+%SP2aeoEEKBlQ*OTjmPwU#gVjJd&{$UK)~P@;=U zPZBycr$N<<2j{ce%x@7C#@nlV4AISXd5Ip_gR?&=*Fbs%6kdJ3Z156q?8e>wGN8I5 zjh}eW__ulqM|%lnWCj;OZH(^NYL6GlHb?Zj_5KjAOEZj$?o}BmX^knb!@U}lQ5n6s z4I<{mg361$IvPUUU?28-XSa~lgs<(UdRes{cjqA$7T?MMkJklG%#t8WkzP@nDONC~ zoZra|XyX+40I3vWReS?Y5|J|}Uipv*eM%3yi<$Tz7cU9WvC=M^iOXp11Bi7AAb0hz zX-uvPY;X;r{K-Ndf-*xc_#Lbl5!sn1F1c)cvJ}G{$n5cYwj>WFw8C5Z; z3G5NwcxKWgzfO=LV|5vs(K}Ge7scr?zRO!q0kOZ z-UM}4_3g8z>+!W!++zNIT6VoRfc@vNJ%sWDrH=3Ng*)?*YZ`T72yp~&azHer@-EFQ zU(#^cH&AVeX2qC37%Nr2^uJH3Jfyp2H~Nc|-T3ae^oN)*-yy?6RJ^DjXCErmo?$w2 zN7hsb&Bx$BP=yF>oDl|KMph7kT(QsWGb0w18~f}1^&4W}yX6yf*Q1M@OGnC{f3_A< ztnq{F1R)1hWi1)XZj&=_cHubT_Kay1yP-^`a-nm}W7N*NC{)q|@!{QcId@~jXgljc zo6okMoKU`AtZGdeq^ust?=iBJUt=!&ZjW1NNDif1uZmX_dEfkSU)RliY$DQ(l-l)| z>%4h;HTz?`aC>${3RL4I!wO&z?Bz90ssAXgF5;Y)lx%;@@bXWZ90W?5X@2vXM)z4p zHH`o9Ohg~}co}oZV)y~IMARXld-X}zzPvjJ1y1mp^cb}sb<}#c+rKD;v0+MYw!Mem zrZFk#bxeN9*t@{LSZ4ZArP3U1aPDG*x*ZxdCcz3$5EZBPj761~)ib9t1=0$`u2~DRWsN_(B{e2)A3&OwxFQRr^keWN(QjZ^Ym2U03%_ za}A3ks|wU`xu@ywQfp|v_Vz+#uZqr?3TpR8&+g;(sLz)ietJ$-PN;kCzQlW*o)dx? zab*cnPdC?P>hs;-z{RLJ2C5OBn{Y&IFQ5W9c4PP07KLD}=KWo&ITPWaN~{H;4M)EA zMiIjoi*@GBTNYhidi+5>MOc1y8`W_TdD~kqZiLBb?3Zxz-bi5A%TQj@ zqw~H0fb$!~31~@lc;P;QmN^#Lhc*xmeI*Q z0OP(fT`(Uk(gp)*(l*)r}@Wrxl@Ferf= zNlw-?kbHJG1Ap|9XXA9SY1xvUMHG8@80UR;j|WY)7kJQ#V?CbJSA#4(=@wNAn}7%R*qw9zbFbT;=L_81slh znci3-(`Qlq?M{XZf-uNH7pJ=f$T%xMNHNdBRtHL1y|F|i7>y5_6Ih~R=Ok_uN&EwP zLM~2?B=GSSW|@2?$UKtcHUsDho^S6bJwRMsB6MSA>3R(G={*pH;>f{re}xkTpD?!C zwMASL>N2lOcbM1=CESikSgP4w^Li{AE1@|v`Fih03(urI1RWt^XNNfrL7K^2dA(uJ zq)>}kG=(aGZ`oVsw%|s&I5(n=FTA}Ok6bHMsuo%rE?;Z{B;uI~8ynpSlxYSe0uK)~ zWF)*B3FLo0sAE{7*76{-4eD)RPRgz+07*pgxr*8BzR$=qnK5|G^@=b*$B(3Uzy+&6$viOrQR znFHQq(1G9uFR}wgFNbUM5}(w0GTQ1>p7=!6OkPTiZ?{usOn!A375&acDycJq%2RT# za&d3zwXn`RNIoT;7bbmu$y#nS*KWSQ&eXCh5=8!Q+PqP`e7uuw)f~8npgQO4s%7bF z(UO0pMdMj-V2gs{dYgn&!~>M!FTwLr!C6>Wq1=G%T85wDDTMtt8a8@d0A*-KADO9ytOjt;b zH4UZls@UbBn)7|bS>!E9;}Mbdt{mk&4A>Z04_L4iwfci#z|R^j$3dnJ!m5eioy(XP z)c_$s+|u0lVZK6%!@dLs2V5K<$FbF3$8siEwkxP6t-JhskIm4HmH(vHPQ%7*EGnR+ zR?LOVlOMIYSX;G4o>RKKT=L!CkRETgR4m6~V=4Z?B_!gzwcjW*n^R7gw+Bk>ZfHA> z&8wQ_)s3QyJ*@`W8gEjtRPoWN7h6R4RzK3ya@Qe2t$yf*ExHgpC#J4L0!nwCG*_>J zZ8-@d87O7EVMkFi3HjBK9bm$etXIWVe}RD;0)gH8HBlNDFs%-Ix*HhVhT(n9Ph&#e zsgjTPG(UD>rvJxi z3#t?-M5r=VZ7&Se5+T&=D@!Kb#R;~(hIoE1@Q;<~`AKOSOyg1Mc2SHG0DDPb;)_mQ zH7a-qZUg1UHSNbh>j?wETm13P7+{=lOds2x$V7$kpKM6p>p2TdPDMMj@SS!i}gS3Ux0hy&`Nfra{=JLJIb#C63>jRd$ETh6Bpy zJ6Uxo#!d%C0+nvfFTZ^`KnP4`nxBy9Fz6zWu7divbc-HPx>vo>{eML_A1rZ7yZZvb zn&effSYAXl;PKDD%db|YVyXIdXHM|xWK^dxtJ&Sm4>Kmb+c4Xe#q!%ypbn#ULDbFh zZj@b5=^@z6L5`=+zh^F-{jWt8aZ0L&Xd8*lYUS22P+T%9gaSdVyzNVyDElkiT5eiV zwp(94VOjl^;sSdsFi)2{lbb-&BT5kq<+YM5La|W!PXT+2r|5ZEybZ9w`;RNWi;l@n zx_orEjIPLCfHdT2nE5*qZ^-eIclE|7JC2l^UeC{ZO^FwpOA`w*uI?WfaUR&{LZ^7I zU`&YTU*l+s>0ogr1Rb}5o)mF}WI_(IAadeD$-0i{D2V$vmiC$qsrZY>kdi|srM$_c zRQq23bhjWVa*gKMoi^O%a$RctOt@{$S;c1kWRCUGYt11m(7o^`+OCh&&7QdVFswpI|T-39ui+TUeeYFH0yH>i`>(+k%Rec&vVmRD7iV;DnCG^9KivSK9P ze+G!OdzTK9vJihlIWwO5CfLM(BhoHl1Ce&DJLnINL@NUZQFPT2+h8~o2Audtt^lvi zmKOKW)~ov#P&nO|Pr&}PK-xjE*R9t3FQ*CjD=n(+a>7_$oLWX*ZEM@DmZuFT=2(;) zYP9U%fXuH{RF%pib^Wftz=iOD9A{yAYE)ziaMG;tsP{Td+d=C5 zcC~I11YV)+D99kl%;{LZI5!rHa=n$uqA~`RG#0|Mi1(vj)*WevwLiqE0((__>Y;8j z-&52jZUUPd34PMYY=ow1bjjk6hKV8WpI6KQzScmzy0%^wYaDWkqhva@PbWeJxqPkn zlrW?@K}^bKBIj<%aaf;;Rt@{wH7EgHmdI<-9CL^}j>{1Nveb^wT1j0E(AI*gT-u z9)h$N)2eu4P0*Pro56Odez{w1$X!_QT8kiRy&V+f^EHfj@`B#nFb=DSHX3;v(Vtm1 zhIp--gG0wDkpoB;uj6iZ_gnVn{3gYH-ngs}a+Vuc%?7KeamF}LY;N`wS6m0O4LEN? zJKuMEodeI2+!V~&9+MT|^xJB-a`bJ!Q~w40T{b-2w3s%E z3;`zKx6*_z)g`HZ5A+xIWZE{r2S+UNtnbR9@^%aU=0RPo-@b(DTbM)^`^aw||_T7y>7;2xV6-OiYzeCnNjcF%MJn z)8X+xMQv=1`M)chETXdibREg^^OsS2XS(;>RA&#P*HyE1#5w{pg1d82sj{j? z>G;HK#w;C#&>mgB9{qTK5nkXVGfs9Ea$`+{xLt@JOzs4lj3RF#ZpP^;z(Drs1p^Gj z%_B+khuqAN4VGqHj$A0{vPQ@qN45kK>MEk zVxH64LD*tMZhmlrWGK;l*rW{W_V(gfzASxRO026oGI|r~hFGj(7lL|Qn_>jv@uiDy z8=f0K)J>VXVuo@Lnh-z#ZbBSAY(mVZ_LZfV_Hr9`5!YM}^&T6rtPam%*#^7uD6`ts zeo?imD?`EGfWS9sm73pywR%M{a1JG9T`v5h%CW-kxcsyC$%{g$?uM6I z%OG5Ttc$(Hm&$IK7F33~v{)5Vh2vKjkB}2u`cY9N=)gILK`jr@W*58e0F_-j)w_-T z9>kw(8kT;bl7XxI`sC_)Wp&;jZNs6de%qH*U8OLy+{dxKC6)_riMON|9Ss!fY??fi zUxw`RAB#3n#TA$~la#)!4S;7WEHN}dr&Hqq{ug{d*P}UH%x@UG6y%os==qJ+X z-NCG-FBAwNc&AL-CI$ye_-biBKZ;%=vo{Ff)F60o}xKD=_@;V@lXJ zWY8Ie(KYkWm{+mS(1P#Ey*rFiG9&^--!X~U@90*S0KX;qRijuF`%=mJ$kHsROJ#hL zi4Sj~zh%C)GMxt;usTqDeNp%8%ZaHj$4!TouZ9Vt4S2Y#Oucfz=hZ!t+#JSwwMQf0 z&>7iWaH2Q>xwo8wx&U>0LN%H~dsAb*Rs(xWt13F(+y(8sOpwxduC6>;4|1)>zb?(- zN=bHtB00_Yk=2tg9H0H$Lc+%ogCAs%(OMegfu!1?hA(K0u23;O0L|d@# zLhf47m=}d8fRwT_DEMVZR{}cDn;y2+4UBUNA>y_dHW7n0m72TK=CY!X`lk@u-pBYY zhQ4P(ZG7Rkn1ECZxl=tG&g*hou?&nt!tMB6tjH3C_mSQ+m?Z=`M-WaUR_%U=x%J0| zoFCeO7%$<3V|))9IYnriz==Fdbklx_Ks|(7l`Od%SL+H<+J{51g zc`{j_!LoE|i)XBh5I4F1XhR&l1rj^#x8{35HF~Ek@8z7z)xIbBCA$l5>Ewwk-`F=k6GUz$Ga>?aqJkK7tcpV5ES_Yb!3=~1t!{4A1TyhRs zV6}RYg{^^5Y6Iwgj703QeYAQ_Wu>UCha|H>%ojI+>e!1TF6-t(pOKdWLjZz4LhY5L zE1|;mpyK#j#-1~9>H`Z`;4x|OZHrC@GSpbXP$;!y3`5Q{P;Jq#WP|;H-~`AZ_Uue3-?VfG z`{mawg`$`i%Eo$td8Hf3UEc96qjrnJOc81Lxpbt`b>p)U$fmxS*ac1dRxRNvP+=Q6 zurSTq@}WE%-058&~V}#Z7>WY^B-6&qjxRo zQHP8WV2M32?J8;pdmU(#@v?z_?k57mqooc&)Q*n%)7?#W`6w$2P}f@Y6CR^h%}d2T zyNREQ4T0?Gx3&9m`T+ffnbqAG$#90@mSevMDWApDV}=|=XtbcsfP)y%M(poWM)PhI zx#p2&kV^p^%jal=iBSI0+Heu7_PEU}E%qp;W*s!cwBk{ae~zUhP7tpq)*E&Z6pCfz z1tnUXmQoY%!JZO%nkg-LbJmUfT{hz;RiTR=v^{EuLmTqaa_T8E(GwISL6K6uy;si* zlAaf~(Q)4RxDE8oeyIrXAFGB;TCv zJ9$Pbl8ZCOVWr*S=Z{mPz|hO!P5H{X*b=nA%|UYzrr+ysgTBdL*WYw}MQ{r>ldu~! zy}{vJ9IN$=tqs+2CWCTq&Y-cP-9E5c_k}N)$-otL{H3zWOy`aF#! z-tX`_d$hwVC8?kb@k3B{_rmo65vYIvF0n7jXF*!|7^^fU_uOWU?gJ>$Jf@7v_Z{I+ z5ES&nN2jE(teFHJ$}x1e7(H5=F}wmlq?;NM2*ED`Dv5=8YxtwFNJ92MfO z+wA+?h@kypsDWXyztF%KV>B#a7>=xDcb|zI6{-7kn8t^^L%uWe7<2rO5u8@^KzoPx z=DO)HJb0P|>U&mL5x^8Z$lU}#QumIN1!71Jh|4l0#~-5i0+{G3B1UtnNEPHq2DAD7 zMpi7Ya^yjMX~1?NBJ#}p*fw4DYc@D)K~ z@G8;{>E!6%eZQ^kEcn%kV|@e|GM)p0xt>RC=Rrl=(e5K?EHr{xpE^2V#5azlh%t#9 z&=!8s`=G2e+B3i3Q?@?=5p8HdVp@Zo#LD7kq-LQWw50))pf@T&Gh?C>$R4T7 ziv2wiQl-$I;kUsGElfZSKUEY=l!~Ve{qxxBQs9PnyG9r^{xcBoJPSLllwb%0SbZ)Z z0royHbN!t?keh4)NE5PV|hSO+Fi({=^iQ1=*m z4^czz5uo^qlbo1HjL2;u7Kl9BuVJ6=g7T(#l!sHDCPWt{ySz-pKpAI+)e%P4j1Shm2A_@>HmD-?y^lwVn0hdqttP+fXCIDEi zOd6j#(JL;J4)p+SIb1|%;?PU8|E9YarUiSH>aT;3fv=`QYs~lq-Q6NWBMrvWVMA^L zvD3dYy%z+Su(Am{5gJg%)(poWRE_{EFh%-J{MgCRyIEe46@(tw;f4D*qJsoky5?W} z7>P&|030YL+|RV=H$+STsgoucF779fq`{1Pum$`vO6sCCz(~81wA8a26fm?VlrR%z zz;S;(cB;Wpfj;Qp4&rwYUiSZ=LENuIM~TyN6x=Zj_vZ!8)wXiU*s1P9ma}LXa}0|J zvLQ!xj{SA;th*wRI+Ejg3|Yg<(~_-KjgR)usmL~rkHYj_fe>- z$1g+eNS)-tdqDw^WRyr%-``>8kQ)!y2XOflH1U7RWc^8z|H;Kh9smVmagO_OWoQy{ zbwEHBZd_n^Ch`^XFgLFjpua1!iE~g;DDO&<4{g$Zm=!u%Mx5D~@RT2J+pG0z}hev|jN zL&7|MABq8gdB0!o4UL^<91P>3tH`&ja#-L>;(I_4x|1aJn)~I1lS&JV_sbjxp1BZA1jWCLK4t=R;s*v0y& zv6-)Fo~q3)oKI{TBMu?FBXJJ;qz9aF)%OJ!21)8^<6f8iFZFEBQc%&<|RR8^(!7J-ARcU=L*P}34C;Ij9*gbKj@;P zbUcE|Kg(snsO9=Go%Zw6sTf-dv=@O6LO>U?X0mr78DE&VXKxitI;b;Wo}qF>*lP zKZ?VkNrBKPq?}5&Y=VaQ)a%rTxcnEQ-Gc0I=TA0y;lx&x>Cv6@w=|S#-sU}yc3XUj z7?PmDG4Pn*zOa6TF#j)0`vAiF^q7JG8tW@i6_Yk$FX#J}GqUn^-USwf6qywYHX3E{ zg!G8r-Aqzc-xr7Nd=kC-xp3cz&!Ptdao@sTpxU}8u-W7`OA)f=`q4N|_{xbxZ3JrI z5Bg#n4TQP=p*-ryq>d6eE&%AAGik=mXgIj@0h_=3YoPt480TYSB`WxYpb(;lEWgUP zJyw8l(QVHu`*J^;Zs&*{W?xv2?ZxZVdz??<-sn3)t(vg?4HnrmTlFw=#3k5qh+<9E zc-VHn&U;KK49;u4122@e+P*3}sl~lI8Y;X%AgH4LA+6Kl2pW!otyvB>2kPb(qyO)K zDgo_s;hAF5il!Yg0TklE&C(QVT$?J;&a51rI5E_gq9E*}BIL}G+`N$qUZ9-6`f>OT8CFhvFM09 zm$$&`=+B9kwf|l;qo*a31SCL4P+*ZPnze9o4~(4lPf9^+pdu&F%xnnx4D2~$`;nV% zds}U(p1!q~KTy1Goi*h@@hmVfIzYP0E`47PO2l4d{DhunQO!7s8r~@)UZy9zPc55XJbPVCLtNE!3p(X-J zH$ProT3um*`Lv-EhpMV^d5?{o$%2ZWc3%kpRWLwJ7SW|-7}@qmNEQg=ztDKby%l)< ze1sXs z2SFpC1>8!<10mgf()@kWi;fT8E>?r5SOIF!;mLsR!cnWaV~kH^$0Lp|JlIMa?w+w# zh1@~?zZyRDb&Xre~O2VE!a9a;U? zqL7uYRjrHDIf?#D=5i;_Aib_JwNrI*s-4B0C-diq-6H?y&kX3;j_$|=3-o^LHCM34 zS5GBn{s_32&S@DAqZ6PDPoN`Je>7G|&Z~}um$qAVx4HD8e=GCy)8sPgVTRIC1=Wb~ z=N+$ZROe=>`Y9|p?d+lG8Qk^t%=yT*2^>2F z!s;8uG?@Q*+>M)d$_i36JO8y`MuUSfNyNZ_rCngHxnVDk#*ay+y|;g;?6Yp{-_SKL{E&7q zeKa-y6|i@}hV|;Ft<=ad7^isxR`R7!$jb{)eZWxyex)XOUTA!fGXByYw==F#Hl0i6 z8ZvM3Xt)OJ!tU<0wJVmi(ot2PZ8pdm6ZmLspDY~;h<%NZt$vm?tG;C+(z;?zE3ML6 z%#>mG-~@;`^z00*tir_P`!M*HVk=Dt6`Z>B0A=T*#V9IngJE0H(Qf?l}Uc(|Y*ia?qLEPvp^ z^1}zQu?vW%%b4R>^iF)6Jujj5`LZ5&;gW^Fj211c{8Bo-fb)XA_1-tNZq}FdGok?D~$rP7XP|l`~3Hu5iHtMLAApZOlm;6 zdZ&+-0SP$G3bdz1TZZOiQ2rPnYzR;?byZjFTgP>jnr-{+yvon{<j??uO}PlQoiiXOjD*Hpg9(8Tzz;BGOIWQxH*Bk#8)IsE}(?Dk20-opoh zaVEv?5iX6NTL}JFRHcpg8iPNU+ytA1rO1AV1|NCCpYAyRX)(Wyn)$7>Hxp+_Eu(Q* zJ=p|j^WU+uHE0xP7tKs4SdV_vo}OCh;*7bC#+{aX;cSKt5o&OTUf)2wC_7J?{H{?% zu!Xn!1reGqux3WD%7}Fk^gPWfto8e=6ZW7c_-Dvw={aAM3c zc*4d4hpsZw2+>`ACK3y#i~(7bGSKj}nqR!*)q7acX}4Ew{{G zzRlVOwJMj8ZTcX)h5KFcdWMCBp7tI`B|l}9HnVnyJcStbfxJ~!{l1xH`%t4Z+wnPl z$i;68k|aic`7?i2#v3nW@;Ex(OIGrKFa*iU_s@dCie2*hUJ!r9dH)=>TrZK^TV~-= ztPMBDAJU@*_&+g~2ROs40RQ8Mo0tbh?t?>jaIdp?U;PgBeJ7<=GbI5U!>233@pkd7 zG1163KGH1;nmZk*MEw#<+VI*R&CDDCLBBX zKqg}xH)X@ZW8>r8soWgCG%?3mwSl_9!!k@C`04wOvFsE3Y7`lTBB{<_py#{%9Z6`{|Ug1W%<#17D zv7BCOels#Kl*-L?E^%q;U2OEzS$4}z7P&B$YsQ{?D9h3wlJD3D82TsD(8Ljitra(h zx_h7z3+Vj=OL(wI!B!TlQ_&Gp)>Hr=(;~Wur+q&ws`2aa?SDZUFG*v2H(ApnBXoFJ zTTT5}3fp^@CaG!q-rKgN#+~EYO^yUaWLX7CCfloi#G7$W#SYI0H_+$2z)xpt=_EPg zr+6ft6UiK2Nsr1F;Ql4QWc#^{vQCH(f?URFhv!a3W~Qf8HDyKmMR+2LsTwyo`$kngGQZ(*6CB1z-<%k)D!QGVoG%)*36L? zMQQ&NF&>owu)hk-zl;IOGteE`X+y(`ee4KNph@L`{hX?Q{7Lr#XFovtp5(Q1jlCJQ zL8Rojexq1&tWdq1waU)Vr(D$F2}^L-1+prcdFm0y%7<15vIX=x_SQp5*Rba(GhJAR`bK=07ipuXd1))1*t0pxHd(i6Zsy>SDG?Hpa7!^4_Oq(N|W zfCp;}pMr=bHhPDifFwE&9?dOd5#qOiH#D}2=kw-GfHOi0@U8fjt5;TK%FQ)rnv~iZgL@uwkoXw=aCmg>vk|}%o6-$;vGLok12V`kyuv82 z(+(uP@@4JtQ&~c|gTi~T(WlKmFi1B6x;ZDKfSog0>3FB2ulC-?Tc`>FbEXE zgVp6i-{7A+4x8`hp`UWU?Gp=%llvG#56lxAc?`T33)EY@J&xDvWj8D=RUf6w$|tcA z{~X~UBqa38ds(&eg*tESR^Gk%lejMA!a4N~K?U6*w`b|1ZXYyy8G#HLZtZGqy|+XK zA2?q51Z9P57(&-Ybjo@6RRab=yFs>wEib6=L||+@bQZ zi6xf%A8wcc^UpaI4;QZjRldkWA&!sOzeAOjKXNH->h2xZwWlqSPn+#nSM~p%+@q95 zxS(%0_B^&dJ?o0oSzo+OZE#_?Xcu}<(kBRZxZmUjNZ11(EWYlp{ChP(t(i?J4vY; zh$!+9QG@VYtTM5_*XfEjUl0G|5c{kjx%oQg1Z3gy(TD@WUF%;|CLt0CZ4*Hxbk^9* z2l@O4uU%v7^g_Pf2M=Q`XN3L3zzZweuywlYOTjI7?T?ikaH?GLB!Uy%Wrk|3_jyG> zN}0c(nyz2Ib@zr-gh3mRp6EDv^`4DahcPl6_^ShRk9&rws)x5oMAi3&6=2=F^#<~9 zLHL29_dA>7MI?M0UPmCnFLBcNnm=4pT6bCIwup#H*EEu8^sGShNK@6VyfAPqcDw13 zMBASt+*_vGs!7q;9lA{K-iBkYVNB!Dj#{=mq6ZOk3?dfPuyIq9*GN{seCsPL`gKWP?mnwci5AkVJoAdYmh71YP#GBx zZ)qJEVlI>z+ci_O(D@=e9sqT$?7-ujI6iKoY!DAIA-#b!ny@VuH>5N`KZiMP=*4E8 zONy>Eb#mA{-u8za=IQ36YOj&`JtzS0X+Z@shKz@^Ja52P*q@cRX*# z^bl$e?&7E?9_?6qGOB#EYdMZd`9)X65&e@9=C=PV5Feb#2gA32W9;Ck`m0;8dd!y- zYuyU{ue$AwQr|%^%*(|A)_Lt$8 zbF+;|AH9G+3-yrHdt#*LKdQhbh;gd9oCHIJW#~DEo~vQusKq&fmY_qvqD6~KgUjkaRJfF8xRa3@WagqO+I?-$LVTGaUsb2dh zQbvV>U!{#wcR(B_&_i?+C=I(ERR!Oq;ZfJ77il?>(b4W_9!i_VL6O3*FSg`tE{IMT zXVR(T2rqjC0#lgJH***)+2n|2)(2??pIe|WD48x(g5~=E6n{vZw*^Vz3Zv;m3~EMT zpsDOxq6gy&oE~5C&!&5nvC~IFrE{2)0<+smem7`V#9$r@0yMLXLgG9zuVW2zz zqc?4Q0?S^tC_~Y2?C-maD=U$c0Rw3V5~GD8l*o^whH9WJvQ0!n=;M-K6++ZNk%pi| z?(>3W{}hbU#Dj~De+5{rCV~(^aFLGG0J~l_HTfdiPh5U3@JbK19Mwn80SiRer2AM2 z4;i;UJ`5m~?SJsvKS5fi(GCjy)z&){5a5YH`+Yx|0+k5q4Ku+{-q@8~Lk|XZKu736 zXEG{!#xbyDwmMiSQr4(FLu6@m?kI)+_F{8RNl_EY9AlFk=sJSH@8xfX=ha6KuEi%f z58pMV4E`m#b7W&Ng#?orNil_A-xKk=;xY`w)r(zLLeyAv%7pYbOWwY1%a;EFWkIZB zpG4DoQyE6kK6EeQ$uUrvi3NcupdfJZviS6;zx1ky!!(O;*lg`CqUtH(KX+Nc1AsM@ z*J8~D=qs%1s7nli`N|=ga0^%;H?fa-nkojQUz)*5Q z;*62I*Ty&X@AFtLudE>2(1krp(homVbFCX3cASpt-ZT)GDC0aIs(cMVkr5O<&(~rN zo;cftG_-Lco}G*#&ia`&aSOiXuLv}rp3ETOPYCNNQ2>tvD13Zj#qsKFYGEl_(7+x| zRCD^QZ%9CazX5Ykx3A9>*np$$)&t=^6&XKq3;yXg zlIBZF^vXAGcJV&Mxl8vEu%`{`_5EY4lG)B}GgNq99ao<#i_3Us}xi0~(*=u27@HKP<;3-kde)PYAM*}PG)y2{?u4rgy3)S03Js^#>pb}0t7i#Np zG*$HztHjtAQuwZ>Q@N|h!=V*Ln(lAmzPoc{0#@nW;1K3PRWblw!0lbV;!~~J$auei z?h78`Ko&z+0`uQ?KvTuJuDxkRRYi;dA!etC=a#W3AVlQqTz-Y@5;T>43VF74hcow8 zV?*mym5G}7)l_Y43KHt}>m&AFk2~(|?w4H(M~3qlESzcAtNIjL+iNZRxEun^FwPn%?rZX~O)TnCB-K*pFo~o3qF5Tylo7$y*0MMfv7L~2yAblE{QR$Zrg|Gwyx)h(gxaMPBHNM#gBvN zXm6p_u5(=YiE8TpU^qost1hK?8Tw|vdlJiI5;dJM&Ozw8c5+}|HF$?EVfYr?J&ptJ zPXY*&8md6~x7b+6Z*gH4RPbd_AQr(!!4YiLL-vC}~?=KHtL(71kh8+<{TNC}0t zeO<6wk z^@N|K>xpQ$IDZqIx4S;#n}&i^Ff4(#upS%vjW3{^K)4%JAr6cQ^5$2N&Dkgd5Kokb z95#Y-LU96A>tTGoWbh8`K!G*SUW}x{O8}@0lm1!?cmsd&dDA37H7;rCqCrW zw8o2gbod4IU4m|$->%Q3l7-3~e1-8X8ktIgq7+_UTvGi;20p(r15umrDp1wd#_Mw` z&C0jz^i0*J$2FS_YI$hxO#HWDZPbS%VQ@+8x)5I1FM`R#DhJSv*PqF`1}BxoqRVH(zPB(> ztanG7DeJHG@YdjpVG8ljR?k71n_PT@1u2eu4lR<7M`^_il?Gd}s2zrkTDj+v`b9f& z@Hk-di@)R@fUg(OuM>50+j!B=?GuONM&n1_yHS?mT>y^nQZKa5Ae@z427Yc z<y>5EY# zDj%_Kh`7AZgnPrM5ojQL-}tPbHzn1L?vcZ38`^oj*H|4-V}6-cv6Lv@P92?c9!(S! zRR<%xvEPg5eHYpij@fHbp^8JP*w|>R(TkM20>0*#{7PuhvCM#5%IcIGMm?`m<{hx> z@j>q7FMqVG&F=R;RseM+t?d8O)A<{=(EDAgOn?vP&~;xgoO>zO9cV)=AEG8kK4SY& z5={~ogryp&#VPGREWVFSCq6#jAdC;@nppv}!T|!wi$wy}ZI+YYDGf}=VOf9W7-C~XSCc# zRiqyR)QkXsTBSVsGSa`q=smzUe+}+VfQ79%$Ryfko?0}h*BgP%ruW$12+&RQ;Hm6# z4WtaH0N26g(JP1y3s@-^Ng>83ry^x>4$-?an5A+oVtvxbETF$tUh1g7=Z<$9VGN%# zj8b%ZfUo`9mvQXNzy}|o{{_frP5f8OPHT77rYg^B{w?q0t5>Zix9Bhdw`^>>@l@?9 zoY8IE1mKzyCHnl`)j~7-3 z0=sI$$v+G;GX)ql#y$OGi3}SMdw#&HMGUz>b#x3h4IF&P4FPaM43T4AZ*jKX3;i>m zT8+7xGAY^iuJXB5fLv7N{3AezMaApgOD)S&%HKZ8Nn3d~ZV~R_Fn&e5DK=#_!o5Uf zxWeF-frXP(Mcc+uow9q{NWplKJtGcJ1!Z>_BVH=#(J^XgEN?>N{7_FJ&cH zGile0d%JansVd;a;azS0S|JY~FN<j6`X)O2|0G%?-QZJ42-G!i>#BuKrCH*Dg zaL?YpVtfVVrWepfz(>szll!6e5aSB8R(i8?Sf$0O3*z{D%OD_Q5%47T7Fgx}M+#6s zpg~`gfG!;MUUw`+>#)loge}i?cNM>i+p79`hJ5J!FA6=<9q9tyS~vL@>`778Q6)Wn zy?GXiL-Y!oLp*zaciCOP3~~0=Z+VtQ^w+bj=vie?!3XRBVJtvZCAK`co?CX6;>{wq zEbhhoIslwBKwc68n&Uxhi(Gh>VPipc_!LIC>~fTP%xgnamMyGh)+$!_y^5F&dR&cS zxT6%UV=rsCA-V{!%TtfegZ(KWir8|G!O?G|nLg74*FeA00sEaO;Pf4v8o$s`aIFKi z(rp$qidZqy5bEh&ZbEgN&A0?nWI|i--eFY<+WSsdr(Z5L(@@CJt+Z2Tjt_2&EN}Md z-;{M459R0`4ZL-mxwD|`{^7Tt;Qm@R$2__t-Xtl+7c=xi%j2X0q;&&0TIg}l=n^^> zhJlzucNeI${2GezG)78K*!olmW71n6GNMP3b{`547GK6y`6tBk9iyPw3LX+_65X#+ z%kuHDfk0}u$qc!-7toBLT+|$^2U}bav{V;+r*n$68&uG8!|w=zFGA&+?*Z32rBVyc zQldotuHh4qf1)q36QSD{)pbfPQ*K?tmu~Aw_X)m67k+2Y#8dsQ#O!{ZyrX?=LS>=G z{c6EueZTj}Wy+)F(PKf&y!W4Ff`_ppIFfy;VcRBnuVB&?UiDvx-vJF|a=)O`KFh4u zwNpU~ZC|*P$7MGGA z{~eWju7e$AoBm;m%G2}{P&j*i=E8(b)JO!Dsx=vR2Q@^rO#m+k*Vy3)foU2b2<1E9 zAPwUq02(yhPT`wBZnpRx7=%~O6MofFG>#k_qs=lCx;=w;c3n?+l$oKgM&d_s#5Jv} z?^&2+JU>gX(Zz{Gge*#@mSo5nljtEg9_WpGU%9IwsNy^9(wV{V>hn2TUSlap0he7R zkJvLvV`c>o0D-oPIq@8eUluWFYI>T%H(PnkZW&ZkP(uPIiU!R8Gt&_>g#7jU6Ek=L z25T35!B1{iVo1Y&g!LZ$-}R@)N~l=yy#Qrhf{&mM_zVq4ZWCTag}gh?@|{t$F28Fo z*--5%y75v<>d8G@jZi9@JiA(_5FTA&^6q*tI-JgLKLDe{m4W-f9j0yjsQyEY#>jxG zVPfpEuld)V=e!sM>k1RHj`5a*{h#m0Hu9(?KK+EKvcC^qrc`HBh(2ES_YJ89!1o%n z6rGXHgGVJozA=?4|EVS+m<+BwwcpB3k8y28G;Xc^!UhF1Lqz5#zL&K1{+b{yi zUX&uC30*TSFGUUi)6pm0`ri|K%wYNxwpOih+q69t5?L*&0&?uxhq@OZs!tAr4gL1ztjdja9bO6X94rBjC*$Zj zo<>gU!i&6-`C4W|A|{4slF~!JSg(DGVNxReT|KbDSC~X_h$*59q-}1J=Vy z;TKV$hvg3jKBe82#mqI(a+(1%%;x%?6C5(vG|a1b+GNiA*O)(R=KWK!?L4?!=s2wiQs5K zy(m=wNmz;gV#L)b!eK{?R z#QBIWu>d3zMs|{%&NPTAg@8Jj3EJ})|GM(Lluc%hbAppqrk^}66Dm0%RSUpdvQs@; zfDrA~b&s=2><1oq1y4SM?35 zMqr@AkHU8V#t`$8)Dm-^DGedM@e+LrCgeq8n!pUWxPtNLUS8I5s6bpKpKe~5AKjURTdIcrayOdu&C2JCf5l(kGR9l! z*{Q0@$l>6z%HYw>>*v)sR|GCa^1L%#XrS)oq0m#ywZuVYkYA-$;Icem8(ds7%q8$0 z*6a-as<9TVuq#n7!{@Ec2#A#tW5KeQ`~CgvP^;3C<V6_AJY*NbLL z{=X-WSc(&Mtt&k)d3=p(F^L4>H?Jxjq~Cs|Bbl?jfJ?SCzuHZm!)It|moH0Kp*i_X zA`@?GXrOm^lss-%C(9;pb7)P*NPCjM%3@jQVEtI6$|L1#bXE|OKE%Z~d;L(hm4+jJ zAh)#p{Wq0tb;F@At}Vs6oVSFUidfLG_(7>&+O2!f*F5>9u^LAEjn6yFJTjl0viv?u z*^j5fOUHJ-n|tbi^Fi1Q?wAOmSa(A! zV4Pe}Z`BYVQYgT_u_-Yi(TD)tYzX6?Ng8ovX$XGF#oyiw(%}ILqMct=ddl``x<%vB z!GAL~W8^*^kmYy>|>Fh)=3Pn1hd|ztb%rF%g{q;W3o(C z{nGiTjZh>VQ?A`gpD1K<%`YC#+4?~s6A_rL2-KLL?>37%&O z$eP5G9UOlUnapIY^&t^={lV zk#e;|`$lYvoriWxMTG{w`bxxMzvw=}WD>(mVMSB<9 zrYW;M@>`-|Py<o7H-U{5bWv^yMi0>IexC;~p+D3^+&tpz8yY}jeD4alt(EomP39b3xBhgg z{=~?!cbL?S4d2TAA;CDWzv*^FI%q$uwy?PHKUWVlv#M8xnVf4aflwO~66|24TWLm5 zJ)-OcE$LGbj%@qupqd$vASL7s_vyFql`R`eBLi^b82;Mzaah!Rx%zKa)D(sO|5F?Y zx`Z%*U0Rz%cTmFg!a87%@`h*l@5KH>4s}GTi0ljK2|Rph(y06zGQVrIQ#)p~#}>+} z{d?hFQmc0wuoz?Lbh|ltvA|r_BW~5WOJ9hYaY@=C#FQR^eEbSx3W`7MbCM!rT?aeA zEAba47M3DB_!|xn&l`a~B5* zD;U(EdWd7lk9~N9;D6HrV(SR6PM+XcUMJ-aw>OsWOv%O(t{W}h`tBV@yP!rx-rgDW zi^6rHlcRP1M^Sau%1X}4r_Jb@7e}OeQ`eB>0TQcuGig1PS6v2cP0|)A7#)dXW>be} zbFnlfks`{XiU0OPVAw_&EHDy8hLL*{Dup6j%O2-}9b2Q+ld_IY(s^F@Eekg8hG!y9 z;O$pZOc>4!I644QTWEpFFb9o-&|G=oaS_5@eS9DW$i7|8UJ>IPboAoy{2=PDVb%K( zf9tt%;|34|l=JB4@$tl1K5BoWb$>?GLVswrIC|PmGH15Z5P#i2y`$qKEH(JopR#4T zIQd^2TkZ}Yj0uqYu7XrdyY0`Zi!yO<6|4Q^PYy5SVH~+@`lvAuT^lVXzf{%L;~%R9 zExW85aSYjQm-5Gr^w45n(H3_AbbqM5Z|3CtYJ2dmfKl*ZTdD|Zg}$5+FA2Q?W&-G6 zih$FTi+l^uP`D87`>!p<0r`%`W++|n+X+yj-zEh1xJmxt8qywOoY3U(O7q=xeWRY3 z*t@sv6M@EwLo&yiic)^JifKG-KZY<{1kA^$f4qLy$CW%E^dTVhpejVh?v;%F!D=GA z>(ZaVp5LA-_N++$pfMI*`??@)Btjn2i9zYG*ks`?G#|cK;VXBgmch%SKDRv&3NSZDcbpbc#z{eT$??2`M=O8oJyZr5=kjzSVANw z9(yPQER(oEYB(0$56EQ#AOX}KTRVB0jR}x7Lm?CN2auG|rV>7LYGv4<> z?-oT(0h5_ft9Zk^(&5`j`>s~kN6ok9vR3n6a8^ikjMD#k3i z*%nEey<%07uWm@0ELsluscB9?2B&}Lzaq%qCI3CsuR4^aWpt0+g#^=4?myDcLWu6# zt(269Cp*X){NengYn%IAlX@oy#n$JBvHf-oXI48_%om&AQnh?Em8$Jmidm6 z0N7npLMGg;q>s}s1BJs@mD;y{z8DKF@3i=S_-fErqgkj$At|fsxuiz?@|nw9U2}^+ z)Ktr8Mn~wQt8MyUuEp)XRLP1+9H&}d(L!n`EN>zuK|;R~;21Zx%r}8(b2^L&FC0LTpBCV}+W=^J-0qESI1G}Sg^ zhVY+>E57MVWy;D$qq}eGSf+gI3yZY^=9ZVOqpx!MIBLAJ9>a=WXSe`tG;_ zXn_mTc)X09uEZe@cfBg7#XawQG!4KnE{$JjLQ zfI#*ldn^M~C*ngGn@rwSglZ|mp|IJ+{UY?g&=|0E+?W7MW~&CXVqf2V*?y&gy=vF4 zDk9MvHXn&A;At5Uz0f~6$}X8b9(LHzoOa7^>~#K*8er!Ns#k|Sea$tnWmR}#f--26 zLRrRUJ`oK>J3R%D zV^f*Meibr@q}|7b9m2KBien-}FfSmycmM#rZjMw#EeHc0nuu_Un!qwoj0SL%tueev zl;_ApimR52u0cXhz`^ktB@Cj_2CEvH7d8(?dON8J(16fs&53gR$EZ z(*Es<>oL!RS~vRh{+g)%`jk=MwRbtaiK%~b!DTBYsih--33&(?TCxz*+w~}%@ZC#Z0o0*-N61REjq8~p^3 z<5zOi8&`CfB6_Av!5N3r^M3HI=@L+3+aRPp6xrNoQ3&m2_G_YuEVx~|w`xn&Bb+r$a-_WXNoRq$1TrCC7UzH*e}23x2xfP@IE`E&gq79?%? zS7K_4k#GYybsfZ*;Hx9ertTEqO1FS|IImI zW;S+)wG}&iw{@EoB&`s|Nod9mETsYY3F~d>BrwohYvj4XykwJ&MAz{Fl|w%dUt8zo z_iV=N%aTwP$qGrPHwMb!MHxi{m*5-O&u|Lix=zyT^KEa3v>yj+?{H8*Vg%V^_J__~ zJFuJ&H&kmk3)@R0TtTey1@IiLmF7%xv?ZwSs1rxbCBG$~2#fK+7zeg9=cE8U;TJ?vR-poL; z`ep~uIN$yYl@Wau0pjeb4H4Uj6ywFi&Z*(_IQb#BeBXEg2jTMwi#pGxH4^ zYc!gn311gOl;?C@+Pqc9 zt6XeTFmSi{XGnC_7P-p`x5`w#^LS`AE_rQ~!`bp+SbX$aS%}0D?)qrq8I8R-20Cz2 zHpK^^O!kQaAFeIFjVhRLBe`o?RV5ec4S!#`E^SsL$r)xcMeU<}508b1O{h9 zNpv+M_xl1mGw`;o3AiM{&>XzX>gh>Rpfa(+A;K&JU;B-ewImRtkc}E6hE!pUVUJq3Emt0^{RB?=~E8uL>7534LJq*$P zA5DfJQ79rOvDGOoY-+Ry{4zjebswd%s)1LXN;E)ffu$)!|8d+o&#`A+qm7&A*qNXe z2L~>-N*;Mth6;QPS%`&@;&@Yx0?7X%Q?&#%THFVY=#){S{jb~>Gvqo3^*gTX@s;~7 z0*<>0OnyI450AQj<#06cRF3GZt+ju;vqnN!xigq+gVl6*sl&g4y`Jh{!$oGX#$~Xr zu_tdbuc9qM5PTvyjU?qJ2q3zK#!h)WI2Lg3K#U>LBRRXRu^doK#hvgz))4M!`o z+Ax>8V(eS53xll32EwS+e_rx}uNXv@seU{_#+wfsQlE<^sO21pow62{WrUkn>Xf8v zaQbA2e(dzKx~X#w=mr^iquW&HUN|-b%;woMy~$!++^^Vl3f<;V&cVMjmEKc7Q7Yf` z@*>T~@Ar4-I)C20^|W0qd@{#$Wz?8MO46W^S`_uE9N?jOX?SBx?{B@n%WzK;49%`u z=>Si<;a;m2zT@tx(!J*v&-A1Pcp5pzqe{$U~ePza9Yg4DX8xFHiRZ_FBRXj*2Ir z8XO;}YaI{X3OM<^(lg@Gvb5{HvF$vwu;$fekrYdb-E_CtDkg`lo@%!GYW9Q1 zAjq#b)HAWs+@a)Ha5T+>Sf$}Zz_M-|yg&f7{4be!cIObCO#WGMi!|zjL53B*dn7;S z7bueMmvQi0B|m!nXzALjV-Vwyyji;{Ro$30Je0yaJ%_aEF0s57ZdV0@t+0GcFiD1ifi53Aw zR)6!nxQv{!f)N13R{)2D)!2W5u$D(~Z|cs3_a5 zQISWolzc>pvtU*ZU)E`jpO4UN8lK|34^X|zwKV@C+^B5r*XyWO9~}8$I<^u!+R)U> z2%r89+4`}Uk0}fKTS39Hu)45%^@$ACLe%s=&!~lgg-uk2LIZPMU0wAYCrVeijx~=h z)7Bag85f7&&2zH7~;`o3Jz%2MFa5+s4u{HaiYQ`(xGsnTyr-Gctui(OEs;XP=sP+WQUkOYB zIVVea5o8d6fiJ)Su=6RYR}GAL{9q(TI|o3&gS*o-ub@0 zN*hr?#-=i|nCBc|+%t{dOlt5oovyN`IDC4`Yv>!}FNO&E0v;IaF!(9h*CHE>_>8=JAn$c5CZx_CR1zgkk z)zhF#m54JFf>BINP9VCF6dKQv8Q{Pu#8E-GXk!+-8+xzMKQ6as^J|v`g*u2o&K|hF zbS?t75@eLsy*PuPBN^X?~Da`+Y*c!JbLSlD?l(HcWG|Pz#&Et52Hwf^d zTRXlL*A~%UB~oBlvh{{KZ;%a7<09?=tgH^wp~vQ8@XWtXK`d=C z9tp%O6hUd4$ZG?rZ+~V~HMMnVk6q*&EY7=bCVdg@MIxr@^z3$lAU8+Nnd5o`9!84m zP_VjsOHr%Bs~&Vbsjb{OFoT!GS*s+Cnl;}#o-aChp8Cr$#g`9UrU6t~NR11xjIFp? z95DM;vg@L82G=gp8{(qXbv@Cc?w@$L?q2kD;`U%Z0wTg*016J#7KqVDfc3ssj{Z-j zaSXL$1_HA%%f~?ATQW|tgDEp{xhpr)z|wPY$xcd2%5HL-u6Flz&W5D-j_1LFjOZ39 zT*n@{x{sq3c$!$;Bx$p}_bkzE-`b@ikVB;Sk#q>%)=<^L>*#6w5TQj-SpSCvGGqrh z)$T~A>W6GQ!4ZZivSW^Ko?0?D1U`9=CWTDIrzA7;ko_308r*ZCDe%ObTthrxZ`X~C%?j_Wi%rkYrhZ|!{AyQR-s}H8)WdAQ zTBGCU?q27(SK+yK*_&;Af3||;DDu9#N7)nnT8-thBl{56a5;`+(f@5)T=1-jn(jqe zV7~;{wFF8u22eF{E63NN>XuLFg3|XEsarS=Fji4V5l>%7j?SA!rg(le0w=UR2c7=@ zh3<6GFrb+V+j_HuS@X|s__6ESGDliYh2USA5?Tbn@r#KmP-t>qY-)eB2=~iwQrlg4 z*E^slf<{;!Ljj=w681h37Ehhwm-bI#7K+BrmQymCasA%o*HpNG63QnOz5Y1Z^tqn; zSfFWEqz%XV5PbGTvM-+d9~SThSd^@%FbV1wA%1mW*`NBtmm$5GCDa?Q6vSLSRWkH$ z5z#vM5lt$rf7-O9Txl5ktf3-!vd(>aiKTuqZ%KW4j?Po|)VwXQLS)I4duc4I$EE1& z(t3l-Va?{YbHiL&m*oflXR#|1?J8Ht@z$IH!Rbt{{RtxMxz|3aFc_u+c#?Qgg3@Dr zeuxk>_Hcz=KgGJ)bh|AGoM8td1kv83IdG6UT*dL|BK~zMa97%o)oXj7p;J^fWM%K8 zhbgBg=$u-?En_df&!c9>B(M`1%T)7!3)xL4@)mOv*LnLeuPkogx?^Q4Rgdw4AdXKn z7_{0TqZ=f4IpN4Lu(FMe3++la9)pXIq~p$bW-}GnL&l-E_eJHR@#{@GZ8lM2y2>N5ffkZK}hu{z*-e-D8 zNooJ->eWc5SbK1zKx=_oL773+)of>}Exa}FskdW~8Nl>Wd~p=wNU!}SpC!vp8e%b> z*6gqbb94Ouuv{bn;S+Zge=b2x2iT^xO1>PXgR`_tiAI0Ky#0DE4a~`yQ9dQ~n}Mp| ze`MWT?R1&H@srIFlG}@t%APwr4NI!zDL{F~$~e)s_1o?(cco!s#wEXamm0)L+)8n2 zlnW4Gfx~U3V%srP%)W!%t5Jb?I}h|kia8!xDSsuYIy)V-8$T(TE|H09eOIr@>qXGb z(mmv+wpt@-P+eWEnvt4THQiklK6%i&0b9dF18~{XVJ?{Pt#JfOYDZp~?3L)f>C;jc zGJyk+qYI9!kN4NkzFH(HPlX$}>yELE<^1u?IhnZ3cvF~Rs^2v49$oEOy~jadk_L6T zg~I!3g}B_mHtG1{MePn$v)QlL-s~L#^sB+m>x9nX#qM=x5pqH&w;0L>Q7W!(0&vtt z$p~ZgD+vW@5;J#kw6yd$iUu&%UWqIrACKOA^RQ=hcxr(1Vz|(C>uW8}(uo#tg5;?M zyO*~tYz$};-CC*ekA$MJksV2+AyiRZ^4>li8}H^&SofbZUGrKy3&GXDhpS}7`Ksqq zboxD>j*>NS>E3098OT+^7{0En!1qQpTg)x3{6D@SQ7(Bv1n-x@?C>_t6~Ad~h)6>w z6w6-~2$`C$vo+ohJUZ&a=Mxb5NpWL6&3v4;=NokU27-X8fvElH_|gFZal#lrRkQ7R zo`VAKUGmN8fiu;~$*H$aTi1M_qT3wLj?Z*yoJBuf8Kd;tiLaO*J6hf9e@q379eLov z4&q#}Ya>zT%=s_){%qLKq;@^~I6%6ZbmDWosnM`8G?({#Ywl}0>2zyfjz*p1cz-z} zjk@W?54{~IuVWrRYs;v^e;*tir9#?AL`*zYHvaz?(Qd%*Gdp~hzt5#kf8&Pu?U2}8 z;XS5OkNmy8iA~!&ZXZmHuy52}nle@O2ndqtjDE>WouD-dfrsSyt?&!IwFSCYz@w$292Dl5;En|Vw8F7sP zZxjKoo-A|?UGJUPTMO5Q^8vx@t+*~;Kjqa6#h!~w4&E^M@6toeh{zkF};em{7% z(}jPXImGxoJ^aM;7tZDOD5S?+Ku?CI(|^9@u7&sz`kG&K{2q2YWPUvt>4BQ%NTkYrmWagau1u;dkSSK+3I)WDj9gGK{}X%MW~Zk;G-! zeLT{t;B;h(nTaXOZhP9iz;leUD^Y+=hBjd>&q8y!;&dsg5WsQ~Ax!ni+3{@A+r0b_}giCt^;$&s!gX~Y0eG<^NLq%#;=W}?t9Ii zl+5fHoT(RioBd2;Jqw6fc6Tpu(3qX!>3) z-u~srjWl|r#OV)J8aED4yONS-sdns2-J*3@aJi;XT?x2Hld)8mrO*;CMJC#ua((44 zpHws0pzwHyu^{m(;J&`^(qcW{a+o&$*#>ULJ24Wc3FgcFD9X1_bpLrohH_ph#9u$e zJjTAX>7VZE1&%AzRO@PrTxJ19$A*78UjKwJ&}**GI18G#m?cGxJC=P&5PH=Ozx)Xa zhR`^BAiiw3DhOY8%j~g)M5{g3X#t7n3`>7=%Hc;WY7rO3dhOEoj4~N~FZ$J7%cNOO zm?UUI1#E^$*#tOe3u+0}px4p&g|GI=hj>Sdy=Ee&K@=^&ePEaRy1H^ zMA$|2|(`e~UnijN`4BmqjV#ev|maA#W z`S}fG3c}GG_x9q0u5n8=2T4V9d5*`wVp5q&H1EABa{Ylt%c+-lJykUs{w6)c+14b} zCvb$?fWA!&b-RZlHn2bIOF0tg8~~&@a3VuAy5MTzhh0tuN8DlDZi`m#`qnjn>7Mnw zl^m2irCo&|8NVv^Y?(&-q3Uprd-b&Hs8^QR{rvx^3INvz-CP${_Eax;mg3U8eWKh4 zA2G%$0KpaSlXyYShWD)?KO4ydbHA>ZEw{o;YlOB@KB7;IJoQ#|gYj2TMgX0*WUo_Pq(i3?!~QX z_wh4}s=fLno}bxxcZ9uk_5U7w8xO?WJaKle80voNnRvFc+BqUrb(FYZca}SNch0xU z&UB2?+kCn3>wQY0vg66Vq&6F`6Bcuenq;FlPaGUdN!UFK&w`^o|H+)3xqr!jPw6*g zGZt~r=~P1hG&)IYVZ(?rMRaA?e@U)t$vW2cj5W5wFuDDcMkdAQ^u3ymg~ir2A@8b2 z84hbD+U^1FomKNqQ|}F$J}y7O?;A$RwYiFaYx*h3Y)h%iyzhovN^fl zVI+iIc--5rqmIKC|C1$If_$Cz?Xmu%*NkBD-N{-hAB-pPe;Pxv6u~`0;89`Q**9aN z`1J0p=BYm@`h4N8X3f)*XP$Y2lK50X6B9Y# z_>Q)z-WAWZVtewm5@)XJ(B8{82)|0;!hE3qb#r_GM~El%0`|uX*qPVGzVh%!P&`Dx zDTaP?;vL4FnAvwZ&52XupIwrLTuzr`3xAO7RX?3pnDQ5SI2Aa@q1fKOR{DXGoAy(~ zacg1Fx+YP_i=od^-Hg{NR&XATc^nv@-1r$t&hh(b*!pkHkwK_Vq#V&VN=_Gw`qT7i ztuMOikBYQQtpj;;)C~{+To9`CHc;a@q}RB2uRTVXj@M$KFJ5(xfq{X`x!*xHfwR*x znJ4YReeXfil;-1Hl4sN5k2c+Q<|#9FLIc!y^8$RbxI=&U_L^O>zcTR3ue-=f#(%8F zR6dTAPc2)O-+AUux9Q@L*>G|=Cr7zbwKZjbR9Ldqv%7lAd>eIFa*-kg|*3^R?}z5q8Hu$)=6&&_mFigpgJ zYx#;Zx?bx~W@v6jIc@IZk9c3N&oYTg5tWbPzxHB!=}JW^)AsFuryKE#)HPMtY#8*h zPl`TVQ!#!lm8AV7k;l<8I(zGC(hb|)Rgn=lJAE}FKZG9uZ)i-!IQ}`#BOvtns_c!s zIGmEU?`{Z5?3>Y}5fyTy*^hmn)@IY6XfV)kUkt_95*7)^c43U)Ev8ubQ&PkJQKI~C~fOta1AdrTY?mwmgkvzDiRr-=v~oaD9^eg0(O z(*=`OrZAX)fQ5ea*&_aI7`IhW#L%fI#c9=3s%17i(35LETKkgbGWy=r{%xj8=e7Kn z5vl6SH1TC-#&_j&(4?;(bi`Fq>`?Ojd9f6?EaPTYX3{5ZvKPf;uAIP6?*AuCCH7Mr z1`${XJ(|xe^I9DEniC=~VD=_B8Vhg;ptHsE{n#*)^tUd1Hs$N?oT4JQwc5vH-jA+g z(oPm^VWwMSf_J#LVr~{7A|G}WoBh&TvBRJOr<#1?qP3wkV(a-w$9YAb`YB}Toe3F- zr?0~9sPDv;5qj`qU9Yg#9*GMK#3f_b@_o@~5vMja$0hn~Z26kWOeVJVX!*rvg@oMO zJj}OQS+5v4nfc+)b!B%d;mAg>auKHmB;v1 z7&s6$a8$-rBg) z*O9>({-?QPH%Hu`Z~w?|{Qe}emFsnW1np*uVVrFX>4z=Tt{;_LDI`YI3EUgMO2(2$MY z4oq&DE>b98{_DOT(^9!%Bw@6=yzs4Z#C7x8&%}%3Nxxh~w?!8JWCoFUB?XR<4KMPV z`D<;FWwmM$H7To!JyuL_k4>pemCafm8*FaqPjT)lP*dd-{XzYeM~bzh;HB^gewFd5 z7|u2Gp7bWsVP^&zvMn!%)fe5QJT|K21^RW$nbwIc^_aa9XPj38$vagnvrSg2V=By; zh;B)zQe?ay2>kQ8r%tsAn}VMy#^i$ETYNbXJ@|DVmWdeDub?G9i~V~Of_7NwmJn8Y zoN=-X6P$f{UDBb};h|iU-ZbYr%upmll(Jqy$no;-^UJjL)mGEJRChC4UfT`!ooJh{ ze-Gy;r_5B~wOE@;ym+gm-`^sP#AIf{k3ppVXRM&R?a`od-FwJ85dU;vK|9;HC$~$) z$zRh#ap@N^r=+gm4dPAeh3f#P=)m^>TpmcP4vic$?TF1#rg8kl833@25Ibf| z8r+@q|IqanKvl0_w1Oxhf^;J(AgweANH+q~-CZKxQqtWZB_bu=-67rG(k-3uJA&T- z%zJOvf&n-9i;m*g4{!<(0x#KyGy7-(QMB*lLB%QY> z${$ImaHCu#vRL|e4I6^Kcn5Hl5Nvz(-080Q;>SYXLHnJFDt(w38Wj&2Qs2%ODRnLn zv*oCtSlU|5<6fR@zsd=xQGSK~QWiZ+3ZL~*)OXpCp49c?){X2vcIs=l(W*CgJ2P}2 z$1NwYU$4=jUkJ2YXxcUR?WhX;V4DWWz&nkUEHPH(qm?kysyOSUb@n|);slM5FvKLf zo9JlnO=M9FOdM$(3+Rk_8f7yP+7hei)H0~9lhi7<4CH25;4!8Zx& zUyXR7I2>IdL3@pJD2*SC|M% zz2Jprp-2_l_x!{#ri{s)cT8$)x#nNX{q44Iw8KUk^5^9wT7Ay(`A)K&Aye-C;3!Qc zm^ka<0|?Q5#<1qv%xIvOOjlP@oo;z4F-Fz?5QA3zx4f`F?4QRQ*h>8IVb{p{m7=2F&lmz6u2)Mfe#j11Jm{c> z30?j|Qk$K5=5R*F#TDiLtY6`iv1kNY(_-YBB*IX>dI=a;PNEVOl6FiU4b!Q!g+8{; z;jjL(WQxbN4g2x-gj4<(c{sOdUjLM;3;Z|rr`73bn7Ll8mKs0Hw^w8Ew^%IRdVccJ z(>+4UuhsbK7PXtXdC6RsrIkR%cf^SRh478NTdYVL)k+N-UBYIjOn2?>4FSI*iD_NO zXCqBHUX>=(>l&l?ycd-}7+>tSCeh<0Y`B>RxAFcQd=@`z6WIadt;2wKGga5z z#FEORYE)#|2xwj~FkG^Z86W7*=_{Vd8j<|PH2`n}*x-d4o4uWoLWfd?`}W515GJ}C zy`#o{>AAE-3=NJ{Qq8CL*|O|2Ih1c!gqxUt$Jks?@eCB4Ry31s;Ii8i!`)iUhs?cc zz-$+3A2nr7H#Iv zd-krrV@N~_T#_AdXG)?Lna+MA$a$X&B~33~S^c78Sy-FR_K;1XK*jU-S|4R5soZMM zg#9`U86!LR+p7ig`Nd1eB)`PBhm?&Uj0g-3!S*3H%NQC?`G*?A$nQO5# z%t1*HpIj7jqFOzMRJX7E3jRM*j_=#}>(bA9qY1@tgS8${ayf=@^swAVoaDH{3CCXq zhKI{X{1lnUX3B+fM^05fQIQb8t?kn9eOu1c58?^36bTAw@iQg4l8ga0*DI)fbJJe? zp^HM?xc|O^NFyf9$mgba`;8aW+98#X1s(GGQ!oJdKmex4G3D7W&fH-47LKj%_S;$nhZuf0dhRoV+pp}<|G{D_GAQRZWJQHwJV-f< z65KF-V8f)1qn_R_jsHFH-T1X~g8~6y?=lR%wenk|8PqqEm2czTSBWvxs2;<9;c*U; z75u%p+!5MbY4OHMXZ^Db-}B(RgMSFA=6+woJ5tc`0*sa&8a#HEIG#&BhwI!tJZLWx zFJ@{DMqeUs&a1{z&(=_B7DeO{srrc3D^(dJGbp~&V6#Vhx}^|%Y&l=|-0^TV@_38j z+vZAVG@iI(p0B;abJqZ?2K&>7^||9GweF`<>!(MD%{Qc3=#Q#;P$YhaH9gea6jbq+n||S~fW5+yKGTBhTI|6>Yvobdfh*<~9aW zE#B5VT~!&|CITlR1aATqdT}Yoa2QPxt3Pi2z$RtaY;g18hdt5V+f|>aH-Dn0hPpU# zP}0nmX{tNp{h)MbKs4@jXI#DTSIU^84(Z>!0D?hRnAiv`*k7JFxR7hBivdkN12px_ z)2xf9xYT_Vl2c3^MGa~Jj3Bj}0pUd%dFYp9P#xruH(j06PU>&dUC@G|j4`Oy!uY`C z8SA5?YuTJa>L_bZCKlCMX+`t%cZK$Z^Rc~4&=vYm-Q;1j6b!yW8u_qR@_4~V^MbYQ zUDMMC3;Lf0&n5l?MbFA-`_J8n^_&_PwqNLCYjHz?>yjziw7E460O_2F@gPfhVeX8? zRk73fDx*!FvbT_CzTm0xejJPluK@4Q=J0ekbM44EzsvG|y}&d!Uo_PH-W@+gs&msS zsmjtM)W6lr3r)n^R0>nriNq$T3jfV#?un1(IchPV;!|AarXcnw_#vr7{BD2(H6$%A zE>g;qJqPEUTmqNf3BUdVQI{&zc@oxoKK_-lhTC;qO@&G)QN03}rmm;QeGG=#io zhU&_F;{Lq32EkU_>)P6#_auQYMGyZ~>T@^EDv5PuE*BCp@4OFH5tYtsJqXNUFUtN{$N*`VC;-%4p7F>yqpH7*YDShSG6B@_r?0du1&TYNaI&rbbz0w!S z>Z`un8bvvNAvrBmD*#{hkY+#r$gZPT#>nDI-oDIKkytX$dKsu(}rZiff-K5||7X)D!QeF;~$+<(r7 zUUzXcnvydozIA-~iyBZ$%vDNtybqs@pRD$^PYm+FZEXaTi$%9@mbvFT<%_VZIMs<< z?`z};c;dld2?HuriwbaTDG{)*r9_6U|LA+;Et-lSBRgbt1)8EpA$R00%2q%g5v+;!vN@28C0+ZRW zudUVUNS6}9m3_kC@DpLFFK8E~W-I(|W6H^ZX{GBYuk|H_0QKT$ z`%NyI#LsLrspUH&ocaa4H6tZDcSD+oE-1wW-F&Q?G9=GMFIcU%;(713+L8-iRPM;> z&G)B*1JOT)b`f#7thRgFD4q8#8`|5SZUyU*wX702zf093PP1G(D~e-x4H%$+PuiKV z;av|j&r`^zv6!tznZ~!BE3&}~B4mBLj)ueIa^{hP@pEBrmXm~4C#?y?7RL{@da@vUTbq{nz$PnOTZ{|x49j!bN*hjr z_0!IEe_nMSSpri_v2kA!hMo0rQls%=|Lssok!#U{mS9!;ChEx8O}nxqr|<-YYVNaT zw4B&zPbof7SW?AdNsr-;;vl@fmd)&+cF^bur&jNd9ZQIB{RLjx`h`DQ6;T5iAiI== zMhht7IFEb=9>O^}%*-$aF5Bo+`trrUgp9v|CbjVHA!x*$`|HQ*frs$|e-V=xd>p_Z zd~>+RH+Ij|u!^{vL(d#&bV)fM|F@tDaY<9Lq@N%;W?ky^Ip^9@)X|HnKAbP@+=`sZ zDHCiP3HWw!ts)T0f+~UygBoF^GM3k6b!k`G<&*jOtEd2C7%}f46AlB@f5*e49Wqrc zKZ)X9$Nb`!<+LyTkrZCKF}P57wTu>oX?(xKIa*`K82&#tml0> z+Y+~7i;OOYtZQ)47Z8#8GyUCSvq%C{c6P*z>l3HWenJ~&cv2*&3}57?h_)x*7#~)8 zeAGStGF*qeriUKRe3%|U;Yn8wwfr@sP^1YO@LGRLo7cd*nTFeWcQ7=2);Qzp^~A}X zrey7E8`015FZsxnDlt})SMd_xOdB8Ajg)iMF;jo9iJPT@sHU-gv?C@s?ust;X_fO+~d|`fPe- zmgsUwk8*AJ8)2!H&hRIWhrfJ|h{~B+oI@>x*$W@T$B_WQmh)bx_(RjJ-a`o5NVM*} zHF2TdAaoEeqks~LOu9g&!*R^MP0rC|fkTtp=b#{_?tJAMx>b4&OnuE-EkdDCd;@e+ z909&}7mWoqAKOFB6OXePPmb|e+Iy;==uQYw$cDBdte{t=n@!vAg7yND2v*5_?!Wzu6~aqk@|xOw6@^kub_)s>ca|)X{coiDaMsFEzqP`b+ zA`_VSvK;0Uk$R?0=2btbZXV29lvaxRY=2sHw_zCX9aC zy}{1ti6_%_<;9!%f@88u@HpQ==6@eqg8YlGrv`QJGI5DT14K-0$q6#(=V#nH!-l3A z6ZB*M``*0JGJtcoKY1GnV@4HM?z(00@iwP~#`kHWy^z0n*JC(*AgMLiPQEVO*lYO6 zCpHd)q7#{$h!=oC@2^q~>$b&emX4;;Ls&2Ln8Y^Y{Bn&2eF*N@O(z` zshVUjDcw!?FR{(mN{c7rE~ELdzM&UXzS30n5>*IFCA)jr2V-oGx4Q&4lV_}eY(6lQ zN|9BUMMb7o`VJ=+OBL8HpOdabuDR&7@!`=9^N*4Kq731K%K-9;TH}oEmZ_r4lL7xW zX7f4d{Hap@T`ou6nqCebn~T!j<2MA;u)H z^#)WEaDQ9AM+qw6Cpjfjy_>(qmLjkp)xIRI@Vg4;F7tA`I)VZWW#QMQp^01`E`=*G zm9%dJWmq<}8mjV1UY3n!K|vpjY8c-+gT6 z=u!58DBm>1ji;vK-x>X2P+veX>*$0Cy*QaqGnq%DYTY)X&d+yC#JJoO-o-m^w_D27@!3`V zWitoAW~W$ODOgD_(_tCtDT1y*snlL*u1Iva`jdY7xLm*{Y!*{RHFHjQZr zKV=$Yi${3N<1O!>n79e)q2!*$%Z7BS$HWV!O>ft~I~#Ew&DE`2)4UOheu>eiUX}K8 zR%5x|;Q+O+VaKjdyk=!7FwYLP87l#Mg?1$#A1@No%6y7%GstT`%-j zA`yWoI|e_Mh$*JR?%dDo9p}qVqj@!9@AWILi$`(zYItIm85A@P&VJQT_kMb#F z%%D7VhYFS%UBP{C55G#pBdmF~o}z<0Y{KY;F-2001*erSfRu zb7b$!o2*D;eM|t|!RTEh?(Fn-ilG|wf?E42MZGLM_V$;EW4v?!2~$x@WPhn zO?7Kcn7>~8|L4UBz_2{#Zu|1EU+{+!p5W7TnTc)Q`~~lkXX70PKbt)vIz{7WAhL}Y zwfO`E3<61RVFYI6YIXJ3s7P+U;!uOzFy#Ycl9iTTc}~a%!U(q zzrGcg^XrldlQq>9&g<5wSjCh|V50hD zG50#&puoBSR#R}CF4<~1!L~m1)G=5kj>CpfHcLwXL*Io*O2^e_#}dPJ>HKobJKxZ( z_)A>}>m<=b5h6k`LeLVX7Tqpzt;5Mtw$+M8-DR`;z&p~Eq{c|HPp&72 zwj!StFY=W$ssTsx29x7WPn)Tb&QUDAxy<=Nq{O*qM&u`@3^Bm$nZ5(sd!7-0+eb zRWt3Q%nb5Vj8(BE%S8KapBiVAw0T^iOlPh(v8Yzf#Byb(9%O!4?Mc)kN|i;DwnFPI zDeYMgO}F-->`3o=v3mK!tJAVS_4^~ZH<2aH@RT0IFH!)G)ohM%`8X?1Yhh$+OVC7e zL*wP6VMNSOKX`~oh1&YcCW1^$5!7@EwHwlZT15}gDljWXB{w5rd|oTQJvkDjp*z|i zHBUmA^khY$r~RQF+}i4|7DlhDymCxq+EgIw*8C;6VR>?z!L+m)_uqjadnVZEekB=6 z2L0HO6{qFF7TP;%HsWB3L8h(WhJp}$ekb0DKgd+CnVZ?ohH9k&y?Pa##f)Gw*YctO zt}S_b4?{J}<0}avhvYNL1!bi3y6(i!>52cH5E0%dkW=U*uZ3I$KcT{quaR$3>2kog z&63`?^~V!zMdrbM;r+(tvr39$GjJ&pdlh)Zia`C4`XeGp~noN{1 zhei_?|4^^sUZqphVVb$L-+Nd4PNUZObgYvC2X|dy&!9({=qO&d7Wd<$URz|(2B+ih zB&Iec=1;~axTkLGt|QqpIP_nrZ!6=LU>-@86_``mE^BTL)~t z+iM1?@C4(B2tHYDFWiuh$x{k`IhwO2opF-La^=c<#FqxODbxY0~0yPBGs-ZG6XCHzNb%RvMvIYX8A zPCt1P_jks1w2PRGhnJ3ga+|B~CY_~A{vD2w?Gx~5K8|Ay3Dqp!G4!D?j<*($P0yXB zhFnEOX=v>Ui&9gvxyw$R!Y|~jW5vK+K`qu$0%@=%`IKw?&{L$K{p{q!bN-XRtWcr1 z`Xy{5;wS8JzhsxB>5ZvaiRWDX;;Nz}<@R0Po^^$De0f8XuBPEKF-+e7S$1-hsBFtH z=ci_sI}FzI&z4KMbj`f~aRdgURH3}L!IYogiV~{Cdn7OqA$OGxMJ{}SRGXQ!$KH6k zVIPWU;~+3g>$Uf)5`No%Q$Z26F`06{!Pj(#ak051<`=WvVQvqB0Q2Afbbu(Rf{4#G z2nVJ5IPG+os$F@Li9F6=?|?QL>$gZFE~E;d2IRf{ zGjpd30w5S($|2E$X1VrXFNunHFm-zU zI6d_CfveMq+hHqw9E&oIR5XPpH$X)mq1qYIJE5JrF3?+y!1%6FQcj5x=|&K`AqNc-PZ>aR z{&-VNtx{%;e9E-z`-6=Dd3PQwSCJNL?ChK2b3}X&we{EfT&{;?3Cua9cy`?Dk7d6} z=&zja4Wn({sOjp(BBpP>$2Lln*_gsUX<4U~0zM9UZhunAvtvAFg&>&^f0!yLyiAM? z`ZQ2@DtxNeeX)=y|H=5zlmGifQ6JpLK$2k?y_y%Uk* zbKU&9Isis2il)}gc_nuy!Sn$7^4Y$>&HmA0fc9`oo?1Cf%j47W6x^NI{0p?`-1p4I zxy;*BRRo&076mM7wn5S|*HJ77ONCk8%#LYqF{B7vX)(U`&Jg=WXqZACq9AbC>K#d5pm9wOOJerAvRju zf+~=q--Cb&DL$QIrO{22!}($6Kt5SIM4^43{SLJsSY4~_EMh66c$;SxTlrNH0_&W+*uHQU%?^?7I3@zaLWmaD&;9K1JsLh-k(s`>rU$W9u&cFHL#d5u#|qRLn96xj8AP_wCY~rTBD7mM2Bn| zQ_CvFT_b-gDbz8<<~oh%?mtW!_89dUq@hcldXfElM40doEx{M15RFkq8U93Dq;c$% zu^hBp(}-vTZuv9U?c`BmitisuF4R5_q>DaGVsm@H5>Spo`CjRi$PzY+Ru##3IJ2X~ zP}=Hu`%^U#%={Tkw@#Qh>pxzgDcJFoV1kc<7MKDPHv8DcdIu~f{H8X{CIbk*_o|am zGy*2wC-?Fl)C;oZx|-8>*=CH&xA&<_y=$=$puuerw&v&67(_J)E9N=)e>cs)b3Gq} zt5cQ+GZkSP98YxeoQ_UwjxwT?{=d{e@CtsE{gs6>dH-5YLm-|Fxn zJvEru2D=x9?IY2%9Tn!-9n;I*>&{44%~H*c-vj09o}G#G?jQ4RQqBCEfyl}0j$3Ch z9r-wmUQIAvz(3u*jHdwq*pYTh%WB`X!E=3?r?HX5ed0dmgFR5cjMbS;Q2>TGmy_-6 z?YbPm2ZVYB=`=;rsp&o$V~An3T@SolEJUN|_twl+0B1^#!Jef(|a+56=5gp^X^{7J;gcCzk2RhjL@pIjCT;ax6kBE*B8 zgzHZnG*o}7xjYd?_z$gFBh%`;WEP}L{*AkkCqhIA^Y!$ZaY>m&0<*vn;u@`gW3RgL zmA-Zh_D0;ESCRkz3_f&y)pZzg<^li7>WCK2UkL@M6TDZD7Isynum2Omi_JlT7@O4~ zs&Mg$qbVB%rQls74pgk3nJDCwZN=iNSKD$TE%R(R+J9W z8be}hEQ4Z`)rdw_^TSusM4>a@EX=hWHk2nxLmW|*NywJ-^(Y3Xo3mIqUcLyfPP$+` zvL$iAg2=eauEpB(Y0HdeCenXhS>I4>=Ev&Qwu(XFNfB)GX%8=p>`&>;=F0``&0jR9 zEgSkc0yf=TWn-jNQC&#U6-TOQL8D%T8}U7DsQlh@7BQus;;O4HyzQi#gmt@TsGntt z;d}G1ov8!RnQ!RQD2c(^97Td1A&7^yK+U#Hfp|Y}OS>ea+mfD)LsakF@=q2aSojGK z@aWAR#Pi=tI}?yDx&0~G%LIHXfD(2$COzeJS5H--OoMidk^3yJyw$JbgE#RYYO>gq zY1({AGuyBkw4>TavJPBr-XAl!{;{Gd{Rpck{=_c`-xTf=+0pyfPjnocx`&8k^>wgx zOgm!kGU<9tH&Ecrfi+V z9mx&}Qe=uIzjG>GQdTl^uf0+of-U=VKCw z5<6ZI%BC%}#@*kGL+8D9Zby0c;ls!9ears)_t>DA`RLH;237^r4R(%_<(MSzGOnnF zZ$Lz`;N0@Z&bS{b#83|t==d??wgl{q!6$p%~xpN7zM3F9Fw;3I|{$IM<(nm`p5GSm@nW7ZOQ`? z@ay0NrjAl&8~y7d0{SlvyhWd?bP_ZAmtV%Qn9k{pnC>_Dg=Rd-WgA#hlP@(_=mbn5 zRXoeCnBA1s>}}Ujrv7z=?!EnI)-&dQN(@L4~J;reiyA%(_ds>bY z%QGDOQ5l18-4)WUG`O5E=0ho3k@oLQ53K3D3pFR++nvM;h^&~XyLX_Em*E9t#tR-K zi$@Rf-5b9R>8o~4eQ%lhcsE{4-N%f+OJ(+F1AE2$D4zL5q38n!KuVT!_Dz@FybWv~ zyV3zeN+EqQbT^Q?&Ec_8$bN@g!N0Oc0H5gZC4;&c(OS8}LN1e63HOcJTnW}t%HLO#LzapI8Dx573sL@YY+(wk^BZk7C!(8U9^sTk zg-hu#Oc-K%`B42Mle88GW06nT+#v~WAtkjIT>maq3Vy&@!^q7Ew-HoA6!%h8GiXfz z(|&oGAb6e;`U?pN8?iQn7KYG~irzVxJ*j8j$yk9c0Qkv_piO)}k%_o8NDagyP)I}P zz^^|VIf9P}ODOek9U*(m)FMeA@?!Gvf{gWJ+g4FRgL4QK;i&RK_romKq{#Y5eo||P1BOgdK+7XDZc>3$B?nP z@aNseJ31}87gXz`c5h@qGxU&VP(ULS_~j-h4m`)osB6!^bGC`i>U7uWu-{mG8lZUP zcD4^S^l<2OH^5!VzV$of`cQt2%w~pg=(}%mwUx8n1iyh@9dwwdUwC>pmH@jI2KJJ` z{7J>Wdar^cLz-|s-!?rre5uJCc1H+4D$?M0(bviASMGd^V8Wg4}Il0xOzq=8X>SAYW}`D6oYdNcP-jAS7&n1 zy*mb2hQ%O2S-5f6H zfAoxRS_xC5x@vq7J>9#oJBbv20upcD{+W{TA3=bJ3do$aC${-YAJiP5OXM#u8;I+O zcL3_Je0h=jAU2NXrHQsIYHaJ-{zit+q{Q7Y^e6bu2*tcaJNh#7E$RHnCFoLoz6_$3$tm4Uo22DS zNjf+$S)etz6&!#=bxIX zMCIEvc=`%C^saMJ-1a%MFJr0wYwRs@pN86~4X@HNI$qFBa)_lXS))kgDwmP`c%+FD z!fAIUP`Wjt4B{V|&J19SM)#oke4@lO3w)fIBx>p9c`OyAN9*K85M35T8pQR)Qd?{i z&aLj$$fUm0&N$*2bw&C3s~FH*pbikwPM4xw14 zP+iGIXM5ZSBZ&7V4y3ePA$LCD)t7pgP9;%;TrQ;gT9PyVHA*%d&tt=H9Fsx#mK;=( zRT*EU!RPMED$`ipTx7hie1n!`ZSLu<#kSEyc<)sok#P{ktB*)lAUb=+d_pm!(sfJ_S#Vl82j z8M`~P1CYeFu|D~P-y1j@<=SUJB*jEZ1_DX!C;o+{rBC#n<}TE~j@VDz%ekB;LDayoh5o^aSXuP#_D%`r}cc+JVm2Xbt@p z?9=G{e6j!xtftapas<-tv@^f67m~^T2DB<&Ctp|KfWej|uhjeKF711Tl4~a8%34a{rw?#ynY8T;KEdv&tQz8*$ zIFB#f4dZk^s^xrC&eJ%pXoEh4P)xL-Q0Hu+1+Xax3t4i6Ri-Q#g+`J92NJ2)!7Taj zv**Qwp_}Ik5=Ra(%7}-V^Lc_woF!}x66+}bXyiqo+qX{pt^TCe;masf{wMa3$_(;n z2>1E3(lL(9aN<;<2hw7hMhS?#2_X9*(kKK&nP5OVfbR=(k0mf8waAB-3cYkG{7eds zCHRNV(e|G;CjYJKfXILz5jL}qh?&iZqmVQ`KD+T1Q6XMJ#hijDdigv z^)ekCZ4od%Ot`On4W}m|fjvtl#g6>hpW)yu?sw=R3+EA)_8q486Kp z6g7^*4`n}uXcw6R1!lE+hqu_nyun;;%Y3fg zq$I>V-hQvFwRZnD!$=omf-XtPGa<(X{R_*@mPs)a0ETTS7X)243+Xb=1 zXTTNi7F*kz_QgN=gz%V=&!&$M`z(wdS0_Dr-*u|?s8ikOmrd-v^B`eC`2y+l9_H}h zQJzF_EM1nFkNadm79@N$%T3K{@X%>ffo!59ZL9yFJ9-79(6zH zw(K^)go0mUcr)IQV?Nw>1_96+?vQXu=IUl$H?%# z(d)f%M{nyrvL2hsMQM9w&n4O;fr=hG?WTIend7Fx-)CO_X1!ZqL}znr{F=B%%2$xp zay}T^2LbZKbCw%>UVA!c^gl(e-yD0`B7Ci9BY28Wrmaqe?HZ5fZ%{ka3v9l<(DoeNVoCcL|H`1^YuR`p6BKzaiflV6tLMWz0^CWCuk+ucGQ z9w>MWwAdgt;_3Zu^EknCpV#Lk((Ms4RbYF0)5KhOB9{|$ROeq(`vG7&TDl8z+wA*l zjL}Ol0S-)C@2SCpjRy%=g1Qh3NWO+WfZM<3fTDSo1?1gS5#C-y)NI~UyDuOysaAxU zOhzP}s$9hVfesSh{Wr0jLExI@ao^&5l)^Htgrf(m(iy%_oNYk3^p|OcPkk2}h1S%H zKc8l@(^Ce+CQHyCWpaUvo1BX(ZsU@6$|qAKAu|~TA}Gt#dp(yl(>cnd_?%8kO0NY2 zqSzd75Y*JweQqY&Wm^2Sx|SXl^~$W>S%ynn@8Yz42Q`+F@J60f#|A$7^+Gby$H0xY zH?GY+O$^zdLi!6dmX{^GX}Q_dvyRZNz~}$Dl#U}0TbfC%8K#`C*h>4}qkeu3I&T{e z@sqnj&L|2z2c~KUv!4bqVwin?S<)$R9biO-;o_==Aby(r%DVO0QmzHq0dQEpV19o} zTL3o03S@GTd_(br`@xT+&B`@dwD#b`T9>JjEZ6QpJ2Dtj;B_&t%JGNd%4bGC>%>n> z->XQ8<@YI{t%{L@vjg3$t6`D6Yuz#(e@}kjI z=Bfkv;uL9|f0yW4H^vX*xXF3fO$T$Hx+Qa|ub24B?37ubExau?9YqJyLUD`AOOgUe z5jK5$y0rk7aGI<7;_4ne#brggFd~C81OYWBLpAw6e=rMxr#hvAZ1-=YYk~K^39mHN zF7e7)Zz>Fv^?M9)+b-kbMqHt9-Y?-YJnbSSGwqAc=)vPFSE3 zB}%(raSn8sRPO(@=kA0$qsrHK#}iA)qS^l)7x0AwWUGbxp+0-=Gf$1d8m7@xyJJ~->Xwh7or*-@0q1pB=!+0?_z8Yc>A=9~d+fNd2=mu@Yv*)DV+zyR>9cOfq%9&*)R-ltFg*zF34C zXhH8S1Li>OLM^)|lTm++28;d4sdjJ?WTL3ax|_VBVbogP5=@qp-S6RZFGd4&;$N@- zRj;Tb;Ht=k2sNj>^~D*?tlTFL^QY|^&-^2OZnB{obh^K4de^`D^-`<1x&b&=?dLWI z+DTG9lBJ?c))AkRj8uz_poD_4Nj{{#-zYw_Y2kqcP*&CO(Asaj*-N6@R)AyCG7@jo zV(C6d`$#mF?*zlOskg@HquWF^B+{@;e*-INAtnYzzXl~k^N z$Q8F*?0@L@ckVAx5>%qGCc#=c&GX>;k{Kp)$|GLBw$}`yhF=<7^mb#^}6? z4@MqdPMDE;*uy>foxFHbJJ~;s(cgV?8fC5J%YP8rCacIp&RL%4_=T|eT7@uM@OtSUgHHg{!y(vCT7o1*{HreSGX;MGk!B17q z`-p@%*4syq()ttH|C(>)KNa(WX>JGm&<(x}B6cjI%aE7)cjzQHZ}lM4?6 z+cSs}I#jr1G7F$vFG#?Q-1JV>B~t*M(EeMt4IK;FLgF+sj;zzPl>pNJ5Jj?Qkf^y1 z+F}(Z9K`U^YM49IJ$|`3Vzbs2NZ^bF=PHJbgLEhD3CCsWjpS%0D6HkQ%I5F&CXQ3e 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 Vehicle.Chassis.SteeringWheel.Angle changes by more than 90 degrees in less than 3 seconds and Vehicle.Speed is greater than 50 km/h, then flag as aggressive driving. + +Derived output data: +- `Vehicle.drivingStyle`: True, when driving style is aggressive, otherwise false + +## Installation and Running + +To be determined (TBD). + +--- + +Feel free to explore the components and rules used in this "Hello World" example to understand the basic implementation of the Knowledge Layer. You can extend this use case to more complex scenarios and even adapt it to different domains.