@ultipa-graph/ultipa-driver 5.1.5-s5.2 → 6.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/client.d.ts +196 -0
- package/dist/client.js +394 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.js +135 -0
- package/dist/connection.d.ts +30 -0
- package/dist/connection.js +190 -0
- package/dist/errors.d.ts +99 -0
- package/dist/errors.js +237 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.js +88 -39
- package/dist/printers.d.ts +33 -0
- package/dist/printers.js +312 -0
- package/dist/proto/gqldb.proto +689 -0
- package/dist/response.d.ts +256 -0
- package/dist/response.js +723 -0
- package/dist/services/admin-service.d.ts +44 -0
- package/dist/services/admin-service.js +168 -0
- package/dist/services/bulk-import-service.d.ts +35 -0
- package/dist/services/bulk-import-service.js +105 -0
- package/dist/services/converters.d.ts +57 -0
- package/dist/services/converters.js +254 -0
- package/dist/services/data-service.d.ts +44 -0
- package/dist/services/data-service.js +206 -0
- package/dist/services/graph-service.d.ts +32 -0
- package/dist/services/graph-service.js +127 -0
- package/dist/services/health-service.d.ts +50 -0
- package/dist/services/health-service.js +78 -0
- package/dist/services/index.d.ts +13 -0
- package/dist/services/index.js +30 -0
- package/dist/services/query-service.d.ts +39 -0
- package/dist/services/query-service.js +112 -0
- package/dist/services/service-context.d.ts +39 -0
- package/dist/services/service-context.js +73 -0
- package/dist/services/session-service.d.ts +24 -0
- package/dist/services/session-service.js +66 -0
- package/dist/services/transaction-service.d.ts +33 -0
- package/dist/services/transaction-service.js +100 -0
- package/dist/services.d.ts +28 -0
- package/dist/services.js +122 -0
- package/dist/session.d.ts +45 -0
- package/dist/session.js +75 -0
- package/dist/transaction.d.ts +42 -0
- package/dist/transaction.js +89 -0
- package/dist/types/bulk_import.d.ts +53 -0
- package/dist/types/bulk_import.js +6 -0
- package/dist/types/data_types.d.ts +116 -0
- package/dist/types/data_types.js +122 -0
- package/dist/types/enums.d.ts +59 -0
- package/dist/types/enums.js +67 -0
- package/dist/types/graph_models.d.ts +54 -0
- package/dist/types/graph_models.js +6 -0
- package/dist/types/index.d.ts +11 -5
- package/dist/types/index.js +36 -37
- package/dist/types/metadata.d.ts +107 -0
- package/dist/types/metadata.js +6 -0
- package/dist/types/schema.d.ts +31 -0
- package/dist/types/schema.js +6 -0
- package/dist/types/typed_value.d.ts +25 -0
- package/dist/types/typed_value.js +1176 -0
- package/dist/types/wrappers.d.ts +23 -0
- package/dist/types/wrappers.js +39 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +24 -0
- package/package.json +50 -63
- package/dist/connection/connection.final.d.ts +0 -14
- package/dist/connection/connection.final.js +0 -94
- package/dist/connection/connection.final.js.map +0 -1
- package/dist/connection/connection.pool.d.ts +0 -21
- package/dist/connection/connection.pool.js +0 -103
- package/dist/connection/connection.pool.js.map +0 -1
- package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
- package/dist/connection/extra/algos/algo.extra.js +0 -69
- package/dist/connection/extra/algos/algo.extra.js.map +0 -1
- package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
- package/dist/connection/extra/algos/algo.utils.js +0 -54
- package/dist/connection/extra/algos/algo.utils.js.map +0 -1
- package/dist/connection/extra/algos/community.d.ts +0 -27
- package/dist/connection/extra/algos/community.js +0 -76
- package/dist/connection/extra/algos/community.js.map +0 -1
- package/dist/connection/extra/algos/degrees.d.ts +0 -10
- package/dist/connection/extra/algos/degrees.js +0 -24
- package/dist/connection/extra/algos/degrees.js.map +0 -1
- package/dist/connection/extra/algos/embedding.d.ts +0 -13
- package/dist/connection/extra/algos/embedding.js +0 -33
- package/dist/connection/extra/algos/embedding.js.map +0 -1
- package/dist/connection/extra/algos/index.d.ts +0 -5
- package/dist/connection/extra/algos/index.js +0 -14
- package/dist/connection/extra/algos/index.js.map +0 -1
- package/dist/connection/extra/base.extra.d.ts +0 -18
- package/dist/connection/extra/base.extra.js +0 -111
- package/dist/connection/extra/base.extra.js.map +0 -1
- package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
- package/dist/connection/extra/batch.insert.extra.js +0 -354
- package/dist/connection/extra/batch.insert.extra.js.map +0 -1
- package/dist/connection/extra/connection.base.d.ts +0 -112
- package/dist/connection/extra/connection.base.js +0 -530
- package/dist/connection/extra/connection.base.js.map +0 -1
- package/dist/connection/extra/connection.d.ts +0 -17
- package/dist/connection/extra/connection.js +0 -44
- package/dist/connection/extra/connection.js.map +0 -1
- package/dist/connection/extra/graph.extra.d.ts +0 -54
- package/dist/connection/extra/graph.extra.js +0 -151
- package/dist/connection/extra/graph.extra.js.map +0 -1
- package/dist/connection/extra/hdc.extra.d.ts +0 -89
- package/dist/connection/extra/hdc.extra.js +0 -322
- package/dist/connection/extra/hdc.extra.js.map +0 -1
- package/dist/connection/extra/index.extra.d.ts +0 -102
- package/dist/connection/extra/index.extra.js +0 -210
- package/dist/connection/extra/index.extra.js.map +0 -1
- package/dist/connection/extra/job.extra.d.ts +0 -32
- package/dist/connection/extra/job.extra.js +0 -122
- package/dist/connection/extra/job.extra.js.map +0 -1
- package/dist/connection/extra/meta.extra.d.ts +0 -36
- package/dist/connection/extra/meta.extra.js +0 -123
- package/dist/connection/extra/meta.extra.js.map +0 -1
- package/dist/connection/extra/policy.extra.d.ts +0 -32
- package/dist/connection/extra/policy.extra.js +0 -114
- package/dist/connection/extra/policy.extra.js.map +0 -1
- package/dist/connection/extra/privilege.extra.d.ts +0 -8
- package/dist/connection/extra/privilege.extra.js +0 -20
- package/dist/connection/extra/privilege.extra.js.map +0 -1
- package/dist/connection/extra/property.extra.d.ts +0 -66
- package/dist/connection/extra/property.extra.js +0 -190
- package/dist/connection/extra/property.extra.js.map +0 -1
- package/dist/connection/extra/schema.extra.d.ts +0 -108
- package/dist/connection/extra/schema.extra.js +0 -253
- package/dist/connection/extra/schema.extra.js.map +0 -1
- package/dist/connection/extra/search.extra.d.ts +0 -12
- package/dist/connection/extra/search.extra.js +0 -117
- package/dist/connection/extra/search.extra.js.map +0 -1
- package/dist/connection/extra/task.extra.d.ts +0 -24
- package/dist/connection/extra/task.extra.js +0 -107
- package/dist/connection/extra/task.extra.js.map +0 -1
- package/dist/connection/extra/user.extra.d.ts +0 -28
- package/dist/connection/extra/user.extra.js +0 -91
- package/dist/connection/extra/user.extra.js.map +0 -1
- package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
- package/dist/connection/extra/user.privilege.extra.js +0 -273
- package/dist/connection/extra/user.privilege.extra.js.map +0 -1
- package/dist/connection/index.d.ts +0 -5
- package/dist/connection/index.js +0 -13
- package/dist/connection/index.js.map +0 -1
- package/dist/connection/network.manager.d.ts +0 -28
- package/dist/connection/network.manager.js +0 -179
- package/dist/connection/network.manager.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/printers/alias.d.ts +0 -2
- package/dist/printers/alias.js +0 -39
- package/dist/printers/alias.js.map +0 -1
- package/dist/printers/any.d.ts +0 -2
- package/dist/printers/any.js +0 -63
- package/dist/printers/any.js.map +0 -1
- package/dist/printers/array.aio.d.ts +0 -3
- package/dist/printers/array.aio.js +0 -259
- package/dist/printers/array.aio.js.map +0 -1
- package/dist/printers/common.d.ts +0 -0
- package/dist/printers/common.js +0 -1
- package/dist/printers/common.js.map +0 -1
- package/dist/printers/edge.d.ts +0 -5
- package/dist/printers/edge.js +0 -78
- package/dist/printers/edge.js.map +0 -1
- package/dist/printers/explain.plan.d.ts +0 -2
- package/dist/printers/explain.plan.js +0 -46
- package/dist/printers/explain.plan.js.map +0 -1
- package/dist/printers/index.d.ts +0 -24
- package/dist/printers/index.js +0 -43
- package/dist/printers/index.js.map +0 -1
- package/dist/printers/node.d.ts +0 -5
- package/dist/printers/node.js +0 -77
- package/dist/printers/node.js.map +0 -1
- package/dist/printers/path.d.ts +0 -3
- package/dist/printers/path.js +0 -62
- package/dist/printers/path.js.map +0 -1
- package/dist/printers/status.d.ts +0 -3
- package/dist/printers/status.js +0 -68
- package/dist/printers/status.js.map +0 -1
- package/dist/printers/table.d.ts +0 -2
- package/dist/printers/table.js +0 -56
- package/dist/printers/table.js.map +0 -1
- package/dist/proto/tmp.js +0 -366
- package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
- package/dist/proto/ultipa_grpc_pb.js +0 -366
- package/dist/proto/ultipa_grpc_pb.js.map +0 -1
- package/dist/proto/ultipa_pb.d.ts +0 -1
- package/dist/proto/ultipa_pb.js +0 -12119
- package/dist/proto/ultipa_pb.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/types.algos.params.d.ts +0 -545
- package/dist/types/types.algos.params.js +0 -16
- package/dist/types/types.algos.params.js.map +0 -1
- package/dist/types/types.d.ts +0 -1214
- package/dist/types/types.extra.d.ts +0 -146
- package/dist/types/types.extra.js +0 -27
- package/dist/types/types.extra.js.map +0 -1
- package/dist/types/types.js +0 -1606
- package/dist/types/types.js.map +0 -1
- package/dist/types/util.d.ts +0 -15
- package/dist/types/util.js +0 -136
- package/dist/types/util.js.map +0 -1
- package/dist/utils/common.d.ts +0 -3
- package/dist/utils/common.js +0 -22
- package/dist/utils/common.js.map +0 -1
- package/dist/utils/config.d.ts +0 -3
- package/dist/utils/config.js +0 -7
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/format.d.ts +0 -45
- package/dist/utils/format.js +0 -879
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/index.d.ts +0 -10
- package/dist/utils/index.js +0 -30
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/params.validate.d.ts +0 -4
- package/dist/utils/params.validate.js +0 -14
- package/dist/utils/params.validate.js.map +0 -1
- package/dist/utils/property.d.ts +0 -24
- package/dist/utils/property.js +0 -203
- package/dist/utils/property.js.map +0 -1
- package/dist/utils/raft.retry.d.ts +0 -0
- package/dist/utils/raft.retry.js +0 -1
- package/dist/utils/raft.retry.js.map +0 -1
- package/dist/utils/serialize/commont.d.ts +0 -12
- package/dist/utils/serialize/commont.js +0 -46
- package/dist/utils/serialize/commont.js.map +0 -1
- package/dist/utils/serialize/deserialize.d.ts +0 -10
- package/dist/utils/serialize/deserialize.js +0 -288
- package/dist/utils/serialize/deserialize.js.map +0 -1
- package/dist/utils/serialize/null.d.ts +0 -32
- package/dist/utils/serialize/null.js +0 -178
- package/dist/utils/serialize/null.js.map +0 -1
- package/dist/utils/serialize/serialize.d.ts +0 -10
- package/dist/utils/serialize/serialize.js +0 -146
- package/dist/utils/serialize/serialize.js.map +0 -1
- package/dist/utils/stream.helper.d.ts +0 -10
- package/dist/utils/stream.helper.js +0 -71
- package/dist/utils/stream.helper.js.map +0 -1
- package/dist/utils/time.record.d.ts +0 -15
- package/dist/utils/time.record.js +0 -52
- package/dist/utils/time.record.js.map +0 -1
- package/dist/utils/timezone.d.ts +0 -7
- package/dist/utils/timezone.js +0 -21
- package/dist/utils/timezone.js.map +0 -1
- package/dist/utils/ultipa.datetime.d.ts +0 -14
- package/dist/utils/ultipa.datetime.js +0 -160
- package/dist/utils/ultipa.datetime.js.map +0 -1
- package/dist/utils/uql-maker.d.ts +0 -165
- package/dist/utils/uql-maker.js +0 -402
- package/dist/utils/uql-maker.js.map +0 -1
- package/dist/utils/uql.parse.d.ts +0 -27
- package/dist/utils/uql.parse.js +0 -205
- package/dist/utils/uql.parse.js.map +0 -1
- package/readme.md +0 -65
- package/src/proto/build.sh +0 -41
- package/src/proto/build_windows.sh +0 -40
- package/src/proto/ultipa.proto +0 -531
- package/src/proto/ultipa_grpc_pb.d.ts +0 -92
- package/src/proto/ultipa_grpc_pb.js +0 -414
- package/src/proto/ultipa_pb.d.ts +0 -1983
- package/src/proto/ultipa_pb.js +0 -14852
package/dist/client.js
ADDED
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main client for GQLDB Node.js driver.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.GqldbClient = void 0;
|
|
40
|
+
const grpc = __importStar(require("@grpc/grpc-js"));
|
|
41
|
+
const config_1 = require("./config");
|
|
42
|
+
const session_1 = require("./session");
|
|
43
|
+
const transaction_1 = require("./transaction");
|
|
44
|
+
const types_1 = require("./types");
|
|
45
|
+
const services_1 = require("./services");
|
|
46
|
+
const index_1 = require("./services/index");
|
|
47
|
+
/** Main client for interacting with GQLDB */
|
|
48
|
+
class GqldbClient {
|
|
49
|
+
config;
|
|
50
|
+
clients;
|
|
51
|
+
sessions;
|
|
52
|
+
txManager;
|
|
53
|
+
closed = false;
|
|
54
|
+
// Service instances
|
|
55
|
+
sessionService;
|
|
56
|
+
queryService;
|
|
57
|
+
graphService;
|
|
58
|
+
transactionService;
|
|
59
|
+
dataService;
|
|
60
|
+
healthService;
|
|
61
|
+
adminService;
|
|
62
|
+
bulkImportService;
|
|
63
|
+
/** Get session metadata for authenticated requests */
|
|
64
|
+
getSessionMetadata() {
|
|
65
|
+
const metadata = new grpc.Metadata();
|
|
66
|
+
const session = this.sessions.getSession();
|
|
67
|
+
metadata.add('session-id', session?.id?.toString() || '0');
|
|
68
|
+
return metadata;
|
|
69
|
+
}
|
|
70
|
+
constructor(config) {
|
|
71
|
+
(0, config_1.validateConfig)(config);
|
|
72
|
+
this.config = config;
|
|
73
|
+
this.sessions = new session_1.SessionManager();
|
|
74
|
+
this.txManager = new transaction_1.TransactionManager();
|
|
75
|
+
// Create gRPC credentials
|
|
76
|
+
let credentials;
|
|
77
|
+
if (config.tlsOptions) {
|
|
78
|
+
credentials = grpc.credentials.createSsl();
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
credentials = grpc.credentials.createInsecure();
|
|
82
|
+
}
|
|
83
|
+
// Channel options
|
|
84
|
+
const options = {
|
|
85
|
+
'grpc.max_receive_message_length': config.maxRecvSize ?? 4 * 1024 * 1024,
|
|
86
|
+
'grpc.keepalive_time_ms': 30000,
|
|
87
|
+
'grpc.keepalive_timeout_ms': 10000,
|
|
88
|
+
};
|
|
89
|
+
// Create service clients for the first host
|
|
90
|
+
const host = config.hosts[0];
|
|
91
|
+
this.clients = (0, services_1.createServiceClients)(host, credentials, options);
|
|
92
|
+
// Initialize service context
|
|
93
|
+
const ctx = new index_1.ServiceContext(this.config, this.sessions, this.txManager, this.clients);
|
|
94
|
+
// Initialize service instances
|
|
95
|
+
this.sessionService = new index_1.SessionService(ctx);
|
|
96
|
+
this.queryService = new index_1.QueryService(ctx);
|
|
97
|
+
this.graphService = new index_1.GraphService(ctx);
|
|
98
|
+
this.transactionService = new index_1.TransactionService(ctx);
|
|
99
|
+
this.dataService = new index_1.DataService(ctx);
|
|
100
|
+
this.healthService = new index_1.HealthService(ctx);
|
|
101
|
+
this.adminService = new index_1.AdminService(ctx);
|
|
102
|
+
this.bulkImportService = new index_1.BulkImportService(ctx);
|
|
103
|
+
}
|
|
104
|
+
/** Close the client and all connections */
|
|
105
|
+
async close() {
|
|
106
|
+
if (this.closed)
|
|
107
|
+
return;
|
|
108
|
+
this.closed = true;
|
|
109
|
+
if (this.sessions.isLoggedIn()) {
|
|
110
|
+
try {
|
|
111
|
+
await this.logout();
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
// Ignore logout errors during close
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Close all service clients
|
|
118
|
+
try {
|
|
119
|
+
this.clients.sessionService.close?.();
|
|
120
|
+
this.clients.queryService.close?.();
|
|
121
|
+
this.clients.graphService.close?.();
|
|
122
|
+
this.clients.transactionService.close?.();
|
|
123
|
+
this.clients.dataService.close?.();
|
|
124
|
+
this.clients.healthService.close?.();
|
|
125
|
+
this.clients.adminService.close?.();
|
|
126
|
+
this.clients.bulkImportService.close?.();
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
// Ignore close errors
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// ===========================================================================
|
|
133
|
+
// Session Service
|
|
134
|
+
// ===========================================================================
|
|
135
|
+
/** Authenticate the user and create a session */
|
|
136
|
+
async login(username, password) {
|
|
137
|
+
return this.sessionService.login(username, password, this.config.defaultGraph || '');
|
|
138
|
+
}
|
|
139
|
+
/** Terminate the current session */
|
|
140
|
+
async logout() {
|
|
141
|
+
return this.sessionService.logout();
|
|
142
|
+
}
|
|
143
|
+
/** Check the connection and return the latency in nanoseconds */
|
|
144
|
+
async ping() {
|
|
145
|
+
return this.sessionService.ping();
|
|
146
|
+
}
|
|
147
|
+
// ===========================================================================
|
|
148
|
+
// Query Service
|
|
149
|
+
// ===========================================================================
|
|
150
|
+
/** Execute a GQL query and return the result */
|
|
151
|
+
async gql(query, config) {
|
|
152
|
+
return this.queryService.gql(query, config);
|
|
153
|
+
}
|
|
154
|
+
/** Execute a GQL query and stream the results */
|
|
155
|
+
async gqlStream(query, config, callback) {
|
|
156
|
+
return this.queryService.gqlStream(query, config, callback);
|
|
157
|
+
}
|
|
158
|
+
/** Return the execution plan for a query */
|
|
159
|
+
async explain(query, config) {
|
|
160
|
+
return this.queryService.explain(query, config);
|
|
161
|
+
}
|
|
162
|
+
/** Execute a query with profiling and return statistics */
|
|
163
|
+
async profile(query, config) {
|
|
164
|
+
return this.queryService.profile(query, config);
|
|
165
|
+
}
|
|
166
|
+
// ===========================================================================
|
|
167
|
+
// Graph Service
|
|
168
|
+
// ===========================================================================
|
|
169
|
+
/** Create a new graph */
|
|
170
|
+
async createGraph(name, graphType = types_1.GraphType.OPEN, description = '') {
|
|
171
|
+
return this.graphService.createGraph(name, graphType, description);
|
|
172
|
+
}
|
|
173
|
+
/** Delete a graph */
|
|
174
|
+
async dropGraph(name, ifExists = false) {
|
|
175
|
+
return this.graphService.dropGraph(name, ifExists);
|
|
176
|
+
}
|
|
177
|
+
/** Set the current graph for the session */
|
|
178
|
+
async useGraph(name) {
|
|
179
|
+
return this.graphService.useGraph(name);
|
|
180
|
+
}
|
|
181
|
+
/** Return all available graphs */
|
|
182
|
+
async listGraphs() {
|
|
183
|
+
return this.graphService.listGraphs();
|
|
184
|
+
}
|
|
185
|
+
/** Return information about a specific graph */
|
|
186
|
+
async getGraphInfo(name) {
|
|
187
|
+
return this.graphService.getGraphInfo(name);
|
|
188
|
+
}
|
|
189
|
+
// ===========================================================================
|
|
190
|
+
// Transaction Service
|
|
191
|
+
// ===========================================================================
|
|
192
|
+
/** Start a new transaction */
|
|
193
|
+
async beginTransaction(graphName, readOnly = false, timeout = 0) {
|
|
194
|
+
return this.transactionService.beginTransaction(graphName, readOnly, timeout);
|
|
195
|
+
}
|
|
196
|
+
/** Commit a transaction */
|
|
197
|
+
async commit(transactionId) {
|
|
198
|
+
return this.transactionService.commit(transactionId);
|
|
199
|
+
}
|
|
200
|
+
/** Rollback a transaction */
|
|
201
|
+
async rollback(transactionId) {
|
|
202
|
+
return this.transactionService.rollback(transactionId);
|
|
203
|
+
}
|
|
204
|
+
/** Return active transactions */
|
|
205
|
+
async listTransactions() {
|
|
206
|
+
return this.transactionService.listTransactions();
|
|
207
|
+
}
|
|
208
|
+
/** Execute a function within a transaction */
|
|
209
|
+
async withTransaction(graphName, fn, readOnly = false) {
|
|
210
|
+
return this.transactionService.withTransaction(graphName, fn, readOnly);
|
|
211
|
+
}
|
|
212
|
+
// ===========================================================================
|
|
213
|
+
// Data Service
|
|
214
|
+
// ===========================================================================
|
|
215
|
+
/** Insert multiple nodes into a graph */
|
|
216
|
+
async insertNodes(graphName, nodes, config) {
|
|
217
|
+
return this.dataService.insertNodes(graphName, nodes, config);
|
|
218
|
+
}
|
|
219
|
+
/** Insert multiple edges into a graph */
|
|
220
|
+
async insertEdges(graphName, edges, config) {
|
|
221
|
+
return this.dataService.insertEdges(graphName, edges, config);
|
|
222
|
+
}
|
|
223
|
+
/** Delete nodes from a graph */
|
|
224
|
+
async deleteNodes(graphName, nodeIds, labels, where) {
|
|
225
|
+
return this.dataService.deleteNodes(graphName, nodeIds, labels, where);
|
|
226
|
+
}
|
|
227
|
+
/** Delete edges from a graph */
|
|
228
|
+
async deleteEdges(graphName, edgeIds, label, where) {
|
|
229
|
+
return this.dataService.deleteEdges(graphName, edgeIds, label, where);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Export graph data in JSON Lines format (streaming).
|
|
233
|
+
* @param config Export configuration
|
|
234
|
+
* @param callback Callback for each exported chunk
|
|
235
|
+
*/
|
|
236
|
+
async export(config, callback) {
|
|
237
|
+
return this.dataService.export(config, callback);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Stream nodes from a graph
|
|
241
|
+
* @deprecated Use export() with ExportConfig instead
|
|
242
|
+
*/
|
|
243
|
+
async exportNodes(graphName, labels, limit = 0, callback) {
|
|
244
|
+
return this.dataService.exportNodes(graphName, labels, limit, callback);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Stream edges from a graph
|
|
248
|
+
* @deprecated Use export() with ExportConfig instead
|
|
249
|
+
*/
|
|
250
|
+
async exportEdges(graphName, labels, limit = 0, callback) {
|
|
251
|
+
return this.dataService.exportEdges(graphName, labels, limit, callback);
|
|
252
|
+
}
|
|
253
|
+
// ===========================================================================
|
|
254
|
+
// Health Service
|
|
255
|
+
// ===========================================================================
|
|
256
|
+
/** Check the health of a service */
|
|
257
|
+
async healthCheck(service = '') {
|
|
258
|
+
return this.healthService.healthCheck(service);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Watch health status changes via server-side streaming.
|
|
262
|
+
* Returns a HealthWatcher that emits 'status' events with HealthStatus values.
|
|
263
|
+
* Call stop() to cancel the stream.
|
|
264
|
+
*
|
|
265
|
+
* @param service - Optional service name to watch
|
|
266
|
+
* @returns HealthWatcher - EventEmitter with stop() method
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```typescript
|
|
270
|
+
* const watcher = client.watch();
|
|
271
|
+
* watcher.on('status', (status: HealthStatus) => {
|
|
272
|
+
* console.log('Health status:', status);
|
|
273
|
+
* });
|
|
274
|
+
* watcher.on('error', (err) => {
|
|
275
|
+
* console.error('Watch error:', err);
|
|
276
|
+
* });
|
|
277
|
+
* watcher.on('end', () => {
|
|
278
|
+
* console.log('Watch stream ended');
|
|
279
|
+
* });
|
|
280
|
+
* // Later, to stop watching:
|
|
281
|
+
* watcher.stop();
|
|
282
|
+
* ```
|
|
283
|
+
*/
|
|
284
|
+
watch(service = '') {
|
|
285
|
+
return this.healthService.watch(service);
|
|
286
|
+
}
|
|
287
|
+
// ===========================================================================
|
|
288
|
+
// Admin Service
|
|
289
|
+
// ===========================================================================
|
|
290
|
+
/** Pre-allocate parser instances */
|
|
291
|
+
async warmupParser(count) {
|
|
292
|
+
return this.adminService.warmupParser(count);
|
|
293
|
+
}
|
|
294
|
+
/** Return cache statistics */
|
|
295
|
+
async getCacheStats(cacheType = types_1.CacheType.ALL) {
|
|
296
|
+
return this.adminService.getCacheStats(cacheType);
|
|
297
|
+
}
|
|
298
|
+
/** Clear the specified cache */
|
|
299
|
+
async clearCache(cacheType = types_1.CacheType.ALL) {
|
|
300
|
+
return this.adminService.clearCache(cacheType);
|
|
301
|
+
}
|
|
302
|
+
/** Return database statistics */
|
|
303
|
+
async getStatistics(graphName = '') {
|
|
304
|
+
return this.adminService.getStatistics(graphName);
|
|
305
|
+
}
|
|
306
|
+
/** Invalidate the RBAC permission cache */
|
|
307
|
+
async invalidatePermissionCache(username = '') {
|
|
308
|
+
return this.adminService.invalidatePermissionCache(username);
|
|
309
|
+
}
|
|
310
|
+
/** Return system-level metrics (CPU, memory, disk I/O, storage, network) */
|
|
311
|
+
async getSystemMetrics() {
|
|
312
|
+
return this.adminService.getSystemMetrics();
|
|
313
|
+
}
|
|
314
|
+
/** Trigger manual compaction of the database storage */
|
|
315
|
+
async compact() {
|
|
316
|
+
return this.adminService.compact();
|
|
317
|
+
}
|
|
318
|
+
/** Wait for the computing engine topology to be ready */
|
|
319
|
+
async waitForComputeTopology(graphName, timeoutMs = 0) {
|
|
320
|
+
return this.adminService.waitForComputeTopology(graphName, timeoutMs);
|
|
321
|
+
}
|
|
322
|
+
// ===========================================================================
|
|
323
|
+
// Bulk Import Service
|
|
324
|
+
// ===========================================================================
|
|
325
|
+
/**
|
|
326
|
+
* Start a bulk import session for optimized high-throughput inserts.
|
|
327
|
+
* @param graphName Target graph name
|
|
328
|
+
* @param options Optional bulk import configuration
|
|
329
|
+
*/
|
|
330
|
+
async startBulkImport(graphName, options) {
|
|
331
|
+
return this.bulkImportService.startBulkImport(graphName, options);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* @deprecated Checkpoint is no longer needed. Use endBulkImport() which performs a final flush.
|
|
335
|
+
*/
|
|
336
|
+
async checkpoint(sessionId) {
|
|
337
|
+
return {
|
|
338
|
+
success: true,
|
|
339
|
+
recordCount: 0,
|
|
340
|
+
lastCheckpointCount: 0,
|
|
341
|
+
message: 'Checkpoint has been removed; use endBulkImport which performs a final flush',
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* End the bulk import session with a final checkpoint.
|
|
346
|
+
* @param sessionId Bulk import session ID
|
|
347
|
+
*/
|
|
348
|
+
async endBulkImport(sessionId) {
|
|
349
|
+
return this.bulkImportService.endBulkImport(sessionId);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Cancel the bulk import session without final sync.
|
|
353
|
+
* @param sessionId Bulk import session ID
|
|
354
|
+
*/
|
|
355
|
+
async abortBulkImport(sessionId) {
|
|
356
|
+
return this.bulkImportService.abortBulkImport(sessionId);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Return the current status of a bulk import session.
|
|
360
|
+
* @param sessionId Bulk import session ID
|
|
361
|
+
*/
|
|
362
|
+
async getBulkImportStatus(sessionId) {
|
|
363
|
+
return this.bulkImportService.getBulkImportStatus(sessionId);
|
|
364
|
+
}
|
|
365
|
+
// ===========================================================================
|
|
366
|
+
// Convenience Methods
|
|
367
|
+
// ===========================================================================
|
|
368
|
+
/** Get the current session */
|
|
369
|
+
getSession() {
|
|
370
|
+
return this.sessions.getSession();
|
|
371
|
+
}
|
|
372
|
+
/** Check if there is an active session */
|
|
373
|
+
isLoggedIn() {
|
|
374
|
+
return this.sessions.isLoggedIn();
|
|
375
|
+
}
|
|
376
|
+
/** Get the client configuration */
|
|
377
|
+
getConfig() {
|
|
378
|
+
return this.config;
|
|
379
|
+
}
|
|
380
|
+
/** Whether this client is connected to a cluster deployment */
|
|
381
|
+
get isCluster() {
|
|
382
|
+
return this.sessions.getSession()?.isCluster || false;
|
|
383
|
+
}
|
|
384
|
+
/** Get the cluster ID (empty string if not a cluster) */
|
|
385
|
+
get clusterId() {
|
|
386
|
+
return this.sessions.getSession()?.clusterId || '';
|
|
387
|
+
}
|
|
388
|
+
/** Get the partition count (0 if not a cluster) */
|
|
389
|
+
get partitionCount() {
|
|
390
|
+
return this.sessions.getSession()?.partitionCount || 0;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
exports.GqldbClient = GqldbClient;
|
|
394
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFjdkQsdUNBQW9EO0FBQ3BELCtDQUFnRTtBQUNoRSxtQ0FxQmlCO0FBQ2pCLHlDQUE0RjtBQUM1Riw0Q0FXMEI7QUFrQzFCLDZDQUE2QztBQUM3QyxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQWM7SUFDcEIsT0FBTyxDQUFpQjtJQUN4QixRQUFRLENBQWlCO0lBQ3pCLFNBQVMsQ0FBcUI7SUFDOUIsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2QixvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFDLENBQUM7UUFDM0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELFlBQVksTUFBbUI7UUFDN0IsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBYyxFQUFFLENBQUM7UUFD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LENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQWlCO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsc0JBQXNCO0lBQ3RCLDhFQUE4RTtJQUU5RSw4QkFBOEI7SUFDOUIsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELG1DQUFtQztJQUNuQyxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFNBQVMsSUFBSSxLQUFLLENBQUM7SUFDeEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsY0FBYyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFwY0Qsa0NBb2NDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYWluIGNsaWVudCBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0ICogYXMgZ3JwYyBmcm9tICdAZ3JwYy9ncnBjLWpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBHcWxkYkNvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBFbXB0eVF1ZXJ5RXJyb3IsIExvZ2luRmFpbGVkRXJyb3IsIFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBSZXNwb25zZSxcbiAgUm93LFxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcbiAgSW5zZXJ0RWRnZXNSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZpY2VDbGllbnRzLCBwcm9taXNpZnlDYWxsLCBwcm9taXNpZnlDYWxsV2l0aERlYWRsaW5lIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTZXJ2aWNlQ29udGV4dCxcbiAgU2VydmljZUNsaWVudHMsXG4gIFNlc3Npb25TZXJ2aWNlLFxuICBRdWVyeVNlcnZpY2UsXG4gIEdyYXBoU2VydmljZSxcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxuICBEYXRhU2VydmljZSxcbiAgSGVhbHRoU2VydmljZSxcbiAgQWRtaW5TZXJ2aWNlLFxuICBCdWxrSW1wb3J0U2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9pbmRleCc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBhIHF1ZXJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q29uZmlnIHtcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdHJhbnNhY3Rpb25JZD86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogTWF4IHBhdGhzIHRvIHJldHVybiBmcm9tIHBhdGggcXVlcmllcyAoMCA9IHVubGltaXRlZCkgKi9cbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZU5vZGVzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRFZGdlc0NvbmZpZyB7XG4gIG9wdGlvbnM/OiBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zO1xuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlYWx0aCB3YXRjaGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nIGhlYWx0aCB1cGRhdGVzLlxuICogRW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIGFuZCAnZXJyb3InIGV2ZW50cyBvbiBmYWlsdXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aFdhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKiogU3RvcCB3YXRjaGluZyBoZWFsdGggdXBkYXRlcyAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHUUxEQiAqL1xuZXhwb3J0IGNsYXNzIEdxbGRiQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IEdxbGRiQ29uZmlnO1xuICBwcml2YXRlIGNsaWVudHM6IFNlcnZpY2VDbGllbnRzO1xuICBwcml2YXRlIHNlc3Npb25zOiBTZXNzaW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSB0eE1hbmFnZXI6IFRyYW5zYWN0aW9uTWFuYWdlcjtcbiAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG5cbiAgICAvLyBDcmVhdGUgZ1JQQyBjcmVkZW50aWFsc1xuICAgIGxldCBjcmVkZW50aWFsczogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XG4gICAgaWYgKGNvbmZpZy50bHNPcHRpb25zKSB7XG4gICAgICBjcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpO1xuICAgIH1cblxuICAgIC8vIENoYW5uZWwgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnM6IGdycGMuQ2hhbm5lbE9wdGlvbnMgPSB7XG4gICAgICAnZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZV9tcyc6IDMwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVvdXRfbXMnOiAxMDAwMCxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgY2xpZW50cyBmb3IgdGhlIGZpcnN0IGhvc3RcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xuICAgIHRoaXMuY2xpZW50cyA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKGhvc3QsIGNyZWRlbnRpYWxzLCBvcHRpb25zKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gbmV3IFNlcnZpY2VDb250ZXh0KHRoaXMuY29uZmlnLCB0aGlzLnNlc3Npb25zLCB0aGlzLnR4TWFuYWdlciwgdGhpcy5jbGllbnRzKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5sb2dvdXQoKTtcbiAgfVxuXG4gIC8qKiBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzICovXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5waW5nKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUXVlcnkgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKi9cbiAgYXN5bmMgZ3FsKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5ncWwocXVlcnksIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgc3RyZWFtIHRoZSByZXN1bHRzICovXG4gIGFzeW5jIGdxbFN0cmVhbShcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsU3RyZWFtKHF1ZXJ5LCBjb25maWcsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGV4ZWN1dGlvbiBwbGFuIGZvciBhIHF1ZXJ5ICovXG4gIGFzeW5jIGV4cGxhaW4ocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBxdWVyeSB3aXRoIHByb2ZpbGluZyBhbmQgcmV0dXJuIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgcHJvZmlsZShxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZXJ2aWNlLnByb2ZpbGUocXVlcnksIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gR3JhcGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ3JlYXRlIGEgbmV3IGdyYXBoICovXG4gIGFzeW5jIGNyZWF0ZUdyYXBoKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogRGVsZXRlIGEgZ3JhcGggKi9cbiAgYXN5bmMgZHJvcEdyYXBoKG5hbWU6IHN0cmluZywgaWZFeGlzdHM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5kcm9wR3JhcGgobmFtZSwgaWZFeGlzdHMpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUgY3VycmVudCBncmFwaCBmb3IgdGhlIHNlc3Npb24gKi9cbiAgYXN5bmMgdXNlR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLnVzZUdyYXBoKG5hbWUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGdyYXBocyAqL1xuICBhc3luYyBsaXN0R3JhcGhzKCk6IFByb21pc2U8R3JhcGhJbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xuICB9XG5cbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXG4gIGFzeW5jIGdldEdyYXBoSW5mbyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEdyYXBoSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5nZXRHcmFwaEluZm8obmFtZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHRpbWVvdXQ6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5iZWdpblRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgcmVhZE9ubHksIHRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIENvbW1pdCBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGNvbW1pdCh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuY29tbWl0KHRyYW5zYWN0aW9uSWQpO1xuICB9XG5cbiAgLyoqIFJvbGxiYWNrIGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgcm9sbGJhY2sodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLnJvbGxiYWNrKHRyYW5zYWN0aW9uSWQpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhY3RpdmUgdHJhbnNhY3Rpb25zICovXG4gIGFzeW5jIGxpc3RUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxUcmFuc2FjdGlvbkluZm9bXT4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5saXN0VHJhbnNhY3Rpb25zKCk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIGZ1bmN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBmbjogKHR4SWQ6IG51bWJlcikgPT4gUHJvbWlzZTxUPixcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS53aXRoVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCBmbiwgcmVhZE9ubHkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERhdGEgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIG5vZGVzIGludG8gYSBncmFwaCAqL1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgZWRnZXMgaW50byBhIGdyYXBoICovXG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhncmFwaE5hbWUsIGVkZ2VzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBub2RlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlTm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlTm9kZXMoZ3JhcGhOYW1lLCBub2RlSWRzLCBsYWJlbHMsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZWRnZXMgZnJvbSBhIGdyYXBoICovXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VJZHM/OiBzdHJpbmdbXSxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgICB3aGVyZT86IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUVkZ2VzKGdyYXBoTmFtZSwgZWRnZUlkcywgbGFiZWwsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgZ3JhcGggZGF0YSBpbiBKU09OIExpbmVzIGZvcm1hdCAoc3RyZWFtaW5nKS5cbiAgICogQHBhcmFtIGNvbmZpZyBFeHBvcnQgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIGVhY2ggZXhwb3J0ZWQgY2h1bmtcbiAgICovXG4gIGFzeW5jIGV4cG9ydChcbiAgICBjb25maWc6IEV4cG9ydENvbmZpZyxcbiAgICBjYWxsYmFjaz86IChjaHVuazogRXhwb3J0Q2h1bmspID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0KGNvbmZpZywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBub2RlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0Tm9kZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0Tm9kZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIGVkZ2VzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnRFZGdlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnRFZGdlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWFsdGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ2hlY2sgdGhlIGhlYWx0aCBvZiBhIHNlcnZpY2UgKi9cbiAgYXN5bmMgaGVhbHRoQ2hlY2soc2VydmljZTogc3RyaW5nID0gJycpOiBQcm9taXNlPEhlYWx0aFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2UuaGVhbHRoQ2hlY2soc2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggaGVhbHRoIHN0YXR1cyBjaGFuZ2VzIHZpYSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXG4gICAqIFJldHVybnMgYSBIZWFsdGhXYXRjaGVyIHRoYXQgZW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIHZhbHVlcy5cbiAgICogQ2FsbCBzdG9wKCkgdG8gY2FuY2VsIHRoZSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIC0gT3B0aW9uYWwgc2VydmljZSBuYW1lIHRvIHdhdGNoXG4gICAqIEByZXR1cm5zIEhlYWx0aFdhdGNoZXIgLSBFdmVudEVtaXR0ZXIgd2l0aCBzdG9wKCkgbWV0aG9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgd2F0Y2hlciA9IGNsaWVudC53YXRjaCgpO1xuICAgKiB3YXRjaGVyLm9uKCdzdGF0dXMnLCAoc3RhdHVzOiBIZWFsdGhTdGF0dXMpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnSGVhbHRoIHN0YXR1czonLCBzdGF0dXMpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAqICAgY29uc29sZS5lcnJvcignV2F0Y2ggZXJyb3I6JywgZXJyKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnV2F0Y2ggc3RyZWFtIGVuZGVkJyk7XG4gICAqIH0pO1xuICAgKiAvLyBMYXRlciwgdG8gc3RvcCB3YXRjaGluZzpcbiAgICogd2F0Y2hlci5zdG9wKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2F0Y2goc2VydmljZTogc3RyaW5nID0gJycpOiBIZWFsdGhXYXRjaGVyIHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLndhdGNoKHNlcnZpY2UpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFByZS1hbGxvY2F0ZSBwYXJzZXIgaW5zdGFuY2VzICovXG4gIGFzeW5jIHdhcm11cFBhcnNlcihjb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhcm11cFBhcnNlcihjb3VudCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPENhY2hlU3RhdHM+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBzcGVjaWZpZWQgY2FjaGUgKi9cbiAgYXN5bmMgY2xlYXJDYWNoZShjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY2xlYXJDYWNoZShjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBkYXRhYmFzZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8U3RhdGlzdGljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTdGF0aXN0aWNzKGdyYXBoTmFtZSk7XG4gIH1cblxuICAvKiogSW52YWxpZGF0ZSB0aGUgUkJBQyBwZXJtaXNzaW9uIGNhY2hlICovXG4gIGFzeW5jIGludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBzeXN0ZW0tbGV2ZWwgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGRpc2sgSS9PLCBzdG9yYWdlLCBuZXR3b3JrKSAqL1xuICBhc3luYyBnZXRTeXN0ZW1NZXRyaWNzKCk6IFByb21pc2U8U3lzdGVtTWV0cmljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTeXN0ZW1NZXRyaWNzKCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBtYW51YWwgY29tcGFjdGlvbiBvZiB0aGUgZGF0YWJhc2Ugc3RvcmFnZSAqL1xuICBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8Q29tcGFjdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jb21wYWN0KCk7XG4gIH1cblxuICAvKiogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkgKi9cbiAgYXN5bmMgd2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWU6IHN0cmluZywgdGltZW91dE1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxDb21wdXRlVG9wb2xvZ3lSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWUsIHRpbWVvdXRNcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQnVsayBJbXBvcnQgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU3RhcnQgYSBidWxrIGltcG9ydCBzZXNzaW9uIGZvciBvcHRpbWl6ZWQgaGlnaC10aHJvdWdocHV0IGluc2VydHMuXG4gICAqIEBwYXJhbSBncmFwaE5hbWUgVGFyZ2V0IGdyYXBoIG5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYnVsayBpbXBvcnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZTogc3RyaW5nLCBvcHRpb25zPzogQnVsa0ltcG9ydE9wdGlvbnMpOiBQcm9taXNlPEJ1bGtJbXBvcnRTZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2Uuc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgQ2hlY2twb2ludCBpcyBubyBsb25nZXIgbmVlZGVkLiBVc2UgZW5kQnVsa0ltcG9ydCgpIHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2guXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja3BvaW50UmVzdWx0PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICByZWNvcmRDb3VudDogMCxcbiAgICAgIGxhc3RDaGVja3BvaW50Q291bnQ6IDAsXG4gICAgICBtZXNzYWdlOiAnQ2hlY2twb2ludCBoYXMgYmVlbiByZW1vdmVkOyB1c2UgZW5kQnVsa0ltcG9ydCB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRoIGEgZmluYWwgY2hlY2twb2ludC5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBlbmRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxFbmRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRob3V0IGZpbmFsIHN5bmMuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxBYm9ydEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5hYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgYnVsayBpbXBvcnQgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBnZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrSW1wb3J0U3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGdldFNlc3Npb24oKTogU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgc2Vzc2lvbiAqL1xuICBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uICovXG4gIGdldENvbmZpZygpOiBHcWxkYkNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvIGEgY2x1c3RlciBkZXBsb3ltZW50ICovXG4gIGdldCBpc0NsdXN0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5pc0NsdXN0ZXIgfHwgZmFsc2U7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbHVzdGVyIElEIChlbXB0eSBzdHJpbmcgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IGNsdXN0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uY2x1c3RlcklkIHx8ICcnO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgcGFydGl0aW9uIGNvdW50ICgwIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBwYXJ0aXRpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8ucGFydGl0aW9uQ291bnQgfHwgMDtcbiAgfVxufVxuIl19
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for GQLDB Node.js driver.
|
|
3
|
+
*/
|
|
4
|
+
import * as tls from 'tls';
|
|
5
|
+
/** Configuration options for GqldbClient */
|
|
6
|
+
export interface GqldbConfig {
|
|
7
|
+
/** Server hosts in format "host:port" */
|
|
8
|
+
hosts: string[];
|
|
9
|
+
/** Username for authentication */
|
|
10
|
+
username?: string;
|
|
11
|
+
/** Password for authentication */
|
|
12
|
+
password?: string;
|
|
13
|
+
/** Default graph to use */
|
|
14
|
+
defaultGraph?: string;
|
|
15
|
+
/** Query timeout in milliseconds (default 30000ms = 30s) */
|
|
16
|
+
timeout?: number;
|
|
17
|
+
/** Maximum receive message size in bytes (default 64MB) */
|
|
18
|
+
maxRecvSize?: number;
|
|
19
|
+
/** TLS options for secure connections */
|
|
20
|
+
tlsOptions?: tls.ConnectionOptions;
|
|
21
|
+
/** Connection pool size per host */
|
|
22
|
+
poolSize?: number;
|
|
23
|
+
/** Health check interval in milliseconds (default 30000ms = 30s) */
|
|
24
|
+
healthCheckInterval?: number;
|
|
25
|
+
/** Number of retries for failed requests */
|
|
26
|
+
retryCount?: number;
|
|
27
|
+
/** Delay between retries in milliseconds (default 100ms) */
|
|
28
|
+
retryDelay?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Default configuration values */
|
|
31
|
+
export declare const DEFAULT_CONFIG: Required<Omit<GqldbConfig, 'username' | 'password' | 'defaultGraph' | 'tlsOptions'>>;
|
|
32
|
+
/** Builder for creating GqldbConfig */
|
|
33
|
+
export declare class ConfigBuilder {
|
|
34
|
+
private config;
|
|
35
|
+
/** Set the server hosts */
|
|
36
|
+
hosts(...hosts: string[]): this;
|
|
37
|
+
/** Set the username for authentication */
|
|
38
|
+
username(username: string): this;
|
|
39
|
+
/** Set the password for authentication */
|
|
40
|
+
password(password: string): this;
|
|
41
|
+
/** Set the default graph */
|
|
42
|
+
defaultGraph(graph: string): this;
|
|
43
|
+
/** Set the query timeout in milliseconds */
|
|
44
|
+
timeout(ms: number): this;
|
|
45
|
+
/** Set the query timeout in seconds (convenience method) */
|
|
46
|
+
timeoutSeconds(seconds: number): this;
|
|
47
|
+
/** Set the maximum receive message size */
|
|
48
|
+
maxRecvSize(bytes: number): this;
|
|
49
|
+
/** Set TLS options */
|
|
50
|
+
tls(options: tls.ConnectionOptions): this;
|
|
51
|
+
/** Set the connection pool size per host */
|
|
52
|
+
poolSize(size: number): this;
|
|
53
|
+
/** Set the health check interval in milliseconds */
|
|
54
|
+
healthCheckInterval(ms: number): this;
|
|
55
|
+
/** Set the number of retries */
|
|
56
|
+
retryCount(count: number): this;
|
|
57
|
+
/** Set the delay between retries in milliseconds */
|
|
58
|
+
retryDelay(ms: number): this;
|
|
59
|
+
/** Build and return the configuration */
|
|
60
|
+
build(): GqldbConfig;
|
|
61
|
+
}
|
|
62
|
+
/** Validate the configuration */
|
|
63
|
+
export declare function validateConfig(config: GqldbConfig): void;
|
|
64
|
+
/** Create a configuration with defaults */
|
|
65
|
+
export declare function createConfig(options?: Partial<GqldbConfig>): GqldbConfig;
|