@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.
Files changed (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/client.d.ts +196 -0
  4. package/dist/client.js +394 -0
  5. package/dist/config.d.ts +65 -0
  6. package/dist/config.js +135 -0
  7. package/dist/connection.d.ts +30 -0
  8. package/dist/connection.js +190 -0
  9. package/dist/errors.d.ts +99 -0
  10. package/dist/errors.js +237 -0
  11. package/dist/index.d.ts +14 -5
  12. package/dist/index.js +88 -39
  13. package/dist/printers.d.ts +33 -0
  14. package/dist/printers.js +312 -0
  15. package/dist/proto/gqldb.proto +689 -0
  16. package/dist/response.d.ts +256 -0
  17. package/dist/response.js +723 -0
  18. package/dist/services/admin-service.d.ts +44 -0
  19. package/dist/services/admin-service.js +168 -0
  20. package/dist/services/bulk-import-service.d.ts +35 -0
  21. package/dist/services/bulk-import-service.js +105 -0
  22. package/dist/services/converters.d.ts +57 -0
  23. package/dist/services/converters.js +254 -0
  24. package/dist/services/data-service.d.ts +44 -0
  25. package/dist/services/data-service.js +206 -0
  26. package/dist/services/graph-service.d.ts +32 -0
  27. package/dist/services/graph-service.js +127 -0
  28. package/dist/services/health-service.d.ts +50 -0
  29. package/dist/services/health-service.js +78 -0
  30. package/dist/services/index.d.ts +13 -0
  31. package/dist/services/index.js +30 -0
  32. package/dist/services/query-service.d.ts +39 -0
  33. package/dist/services/query-service.js +112 -0
  34. package/dist/services/service-context.d.ts +39 -0
  35. package/dist/services/service-context.js +73 -0
  36. package/dist/services/session-service.d.ts +24 -0
  37. package/dist/services/session-service.js +66 -0
  38. package/dist/services/transaction-service.d.ts +33 -0
  39. package/dist/services/transaction-service.js +100 -0
  40. package/dist/services.d.ts +28 -0
  41. package/dist/services.js +122 -0
  42. package/dist/session.d.ts +45 -0
  43. package/dist/session.js +75 -0
  44. package/dist/transaction.d.ts +42 -0
  45. package/dist/transaction.js +89 -0
  46. package/dist/types/bulk_import.d.ts +53 -0
  47. package/dist/types/bulk_import.js +6 -0
  48. package/dist/types/data_types.d.ts +116 -0
  49. package/dist/types/data_types.js +122 -0
  50. package/dist/types/enums.d.ts +59 -0
  51. package/dist/types/enums.js +67 -0
  52. package/dist/types/graph_models.d.ts +54 -0
  53. package/dist/types/graph_models.js +6 -0
  54. package/dist/types/index.d.ts +11 -5
  55. package/dist/types/index.js +36 -37
  56. package/dist/types/metadata.d.ts +107 -0
  57. package/dist/types/metadata.js +6 -0
  58. package/dist/types/schema.d.ts +31 -0
  59. package/dist/types/schema.js +6 -0
  60. package/dist/types/typed_value.d.ts +25 -0
  61. package/dist/types/typed_value.js +1176 -0
  62. package/dist/types/wrappers.d.ts +23 -0
  63. package/dist/types/wrappers.js +39 -0
  64. package/dist/types.d.ts +7 -0
  65. package/dist/types.js +24 -0
  66. package/package.json +50 -63
  67. package/dist/connection/connection.final.d.ts +0 -14
  68. package/dist/connection/connection.final.js +0 -94
  69. package/dist/connection/connection.final.js.map +0 -1
  70. package/dist/connection/connection.pool.d.ts +0 -21
  71. package/dist/connection/connection.pool.js +0 -103
  72. package/dist/connection/connection.pool.js.map +0 -1
  73. package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
  74. package/dist/connection/extra/algos/algo.extra.js +0 -69
  75. package/dist/connection/extra/algos/algo.extra.js.map +0 -1
  76. package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
  77. package/dist/connection/extra/algos/algo.utils.js +0 -54
  78. package/dist/connection/extra/algos/algo.utils.js.map +0 -1
  79. package/dist/connection/extra/algos/community.d.ts +0 -27
  80. package/dist/connection/extra/algos/community.js +0 -76
  81. package/dist/connection/extra/algos/community.js.map +0 -1
  82. package/dist/connection/extra/algos/degrees.d.ts +0 -10
  83. package/dist/connection/extra/algos/degrees.js +0 -24
  84. package/dist/connection/extra/algos/degrees.js.map +0 -1
  85. package/dist/connection/extra/algos/embedding.d.ts +0 -13
  86. package/dist/connection/extra/algos/embedding.js +0 -33
  87. package/dist/connection/extra/algos/embedding.js.map +0 -1
  88. package/dist/connection/extra/algos/index.d.ts +0 -5
  89. package/dist/connection/extra/algos/index.js +0 -14
  90. package/dist/connection/extra/algos/index.js.map +0 -1
  91. package/dist/connection/extra/base.extra.d.ts +0 -18
  92. package/dist/connection/extra/base.extra.js +0 -111
  93. package/dist/connection/extra/base.extra.js.map +0 -1
  94. package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
  95. package/dist/connection/extra/batch.insert.extra.js +0 -354
  96. package/dist/connection/extra/batch.insert.extra.js.map +0 -1
  97. package/dist/connection/extra/connection.base.d.ts +0 -112
  98. package/dist/connection/extra/connection.base.js +0 -530
  99. package/dist/connection/extra/connection.base.js.map +0 -1
  100. package/dist/connection/extra/connection.d.ts +0 -17
  101. package/dist/connection/extra/connection.js +0 -44
  102. package/dist/connection/extra/connection.js.map +0 -1
  103. package/dist/connection/extra/graph.extra.d.ts +0 -54
  104. package/dist/connection/extra/graph.extra.js +0 -151
  105. package/dist/connection/extra/graph.extra.js.map +0 -1
  106. package/dist/connection/extra/hdc.extra.d.ts +0 -89
  107. package/dist/connection/extra/hdc.extra.js +0 -322
  108. package/dist/connection/extra/hdc.extra.js.map +0 -1
  109. package/dist/connection/extra/index.extra.d.ts +0 -102
  110. package/dist/connection/extra/index.extra.js +0 -210
  111. package/dist/connection/extra/index.extra.js.map +0 -1
  112. package/dist/connection/extra/job.extra.d.ts +0 -32
  113. package/dist/connection/extra/job.extra.js +0 -122
  114. package/dist/connection/extra/job.extra.js.map +0 -1
  115. package/dist/connection/extra/meta.extra.d.ts +0 -36
  116. package/dist/connection/extra/meta.extra.js +0 -123
  117. package/dist/connection/extra/meta.extra.js.map +0 -1
  118. package/dist/connection/extra/policy.extra.d.ts +0 -32
  119. package/dist/connection/extra/policy.extra.js +0 -114
  120. package/dist/connection/extra/policy.extra.js.map +0 -1
  121. package/dist/connection/extra/privilege.extra.d.ts +0 -8
  122. package/dist/connection/extra/privilege.extra.js +0 -20
  123. package/dist/connection/extra/privilege.extra.js.map +0 -1
  124. package/dist/connection/extra/property.extra.d.ts +0 -66
  125. package/dist/connection/extra/property.extra.js +0 -190
  126. package/dist/connection/extra/property.extra.js.map +0 -1
  127. package/dist/connection/extra/schema.extra.d.ts +0 -108
  128. package/dist/connection/extra/schema.extra.js +0 -253
  129. package/dist/connection/extra/schema.extra.js.map +0 -1
  130. package/dist/connection/extra/search.extra.d.ts +0 -12
  131. package/dist/connection/extra/search.extra.js +0 -117
  132. package/dist/connection/extra/search.extra.js.map +0 -1
  133. package/dist/connection/extra/task.extra.d.ts +0 -24
  134. package/dist/connection/extra/task.extra.js +0 -107
  135. package/dist/connection/extra/task.extra.js.map +0 -1
  136. package/dist/connection/extra/user.extra.d.ts +0 -28
  137. package/dist/connection/extra/user.extra.js +0 -91
  138. package/dist/connection/extra/user.extra.js.map +0 -1
  139. package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
  140. package/dist/connection/extra/user.privilege.extra.js +0 -273
  141. package/dist/connection/extra/user.privilege.extra.js.map +0 -1
  142. package/dist/connection/index.d.ts +0 -5
  143. package/dist/connection/index.js +0 -13
  144. package/dist/connection/index.js.map +0 -1
  145. package/dist/connection/network.manager.d.ts +0 -28
  146. package/dist/connection/network.manager.js +0 -179
  147. package/dist/connection/network.manager.js.map +0 -1
  148. package/dist/index.js.map +0 -1
  149. package/dist/printers/alias.d.ts +0 -2
  150. package/dist/printers/alias.js +0 -39
  151. package/dist/printers/alias.js.map +0 -1
  152. package/dist/printers/any.d.ts +0 -2
  153. package/dist/printers/any.js +0 -63
  154. package/dist/printers/any.js.map +0 -1
  155. package/dist/printers/array.aio.d.ts +0 -3
  156. package/dist/printers/array.aio.js +0 -259
  157. package/dist/printers/array.aio.js.map +0 -1
  158. package/dist/printers/common.d.ts +0 -0
  159. package/dist/printers/common.js +0 -1
  160. package/dist/printers/common.js.map +0 -1
  161. package/dist/printers/edge.d.ts +0 -5
  162. package/dist/printers/edge.js +0 -78
  163. package/dist/printers/edge.js.map +0 -1
  164. package/dist/printers/explain.plan.d.ts +0 -2
  165. package/dist/printers/explain.plan.js +0 -46
  166. package/dist/printers/explain.plan.js.map +0 -1
  167. package/dist/printers/index.d.ts +0 -24
  168. package/dist/printers/index.js +0 -43
  169. package/dist/printers/index.js.map +0 -1
  170. package/dist/printers/node.d.ts +0 -5
  171. package/dist/printers/node.js +0 -77
  172. package/dist/printers/node.js.map +0 -1
  173. package/dist/printers/path.d.ts +0 -3
  174. package/dist/printers/path.js +0 -62
  175. package/dist/printers/path.js.map +0 -1
  176. package/dist/printers/status.d.ts +0 -3
  177. package/dist/printers/status.js +0 -68
  178. package/dist/printers/status.js.map +0 -1
  179. package/dist/printers/table.d.ts +0 -2
  180. package/dist/printers/table.js +0 -56
  181. package/dist/printers/table.js.map +0 -1
  182. package/dist/proto/tmp.js +0 -366
  183. package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
  184. package/dist/proto/ultipa_grpc_pb.js +0 -366
  185. package/dist/proto/ultipa_grpc_pb.js.map +0 -1
  186. package/dist/proto/ultipa_pb.d.ts +0 -1
  187. package/dist/proto/ultipa_pb.js +0 -12119
  188. package/dist/proto/ultipa_pb.js.map +0 -1
  189. package/dist/types/index.js.map +0 -1
  190. package/dist/types/types.algos.params.d.ts +0 -545
  191. package/dist/types/types.algos.params.js +0 -16
  192. package/dist/types/types.algos.params.js.map +0 -1
  193. package/dist/types/types.d.ts +0 -1214
  194. package/dist/types/types.extra.d.ts +0 -146
  195. package/dist/types/types.extra.js +0 -27
  196. package/dist/types/types.extra.js.map +0 -1
  197. package/dist/types/types.js +0 -1606
  198. package/dist/types/types.js.map +0 -1
  199. package/dist/types/util.d.ts +0 -15
  200. package/dist/types/util.js +0 -136
  201. package/dist/types/util.js.map +0 -1
  202. package/dist/utils/common.d.ts +0 -3
  203. package/dist/utils/common.js +0 -22
  204. package/dist/utils/common.js.map +0 -1
  205. package/dist/utils/config.d.ts +0 -3
  206. package/dist/utils/config.js +0 -7
  207. package/dist/utils/config.js.map +0 -1
  208. package/dist/utils/format.d.ts +0 -45
  209. package/dist/utils/format.js +0 -879
  210. package/dist/utils/format.js.map +0 -1
  211. package/dist/utils/index.d.ts +0 -10
  212. package/dist/utils/index.js +0 -30
  213. package/dist/utils/index.js.map +0 -1
  214. package/dist/utils/params.validate.d.ts +0 -4
  215. package/dist/utils/params.validate.js +0 -14
  216. package/dist/utils/params.validate.js.map +0 -1
  217. package/dist/utils/property.d.ts +0 -24
  218. package/dist/utils/property.js +0 -203
  219. package/dist/utils/property.js.map +0 -1
  220. package/dist/utils/raft.retry.d.ts +0 -0
  221. package/dist/utils/raft.retry.js +0 -1
  222. package/dist/utils/raft.retry.js.map +0 -1
  223. package/dist/utils/serialize/commont.d.ts +0 -12
  224. package/dist/utils/serialize/commont.js +0 -46
  225. package/dist/utils/serialize/commont.js.map +0 -1
  226. package/dist/utils/serialize/deserialize.d.ts +0 -10
  227. package/dist/utils/serialize/deserialize.js +0 -288
  228. package/dist/utils/serialize/deserialize.js.map +0 -1
  229. package/dist/utils/serialize/null.d.ts +0 -32
  230. package/dist/utils/serialize/null.js +0 -178
  231. package/dist/utils/serialize/null.js.map +0 -1
  232. package/dist/utils/serialize/serialize.d.ts +0 -10
  233. package/dist/utils/serialize/serialize.js +0 -146
  234. package/dist/utils/serialize/serialize.js.map +0 -1
  235. package/dist/utils/stream.helper.d.ts +0 -10
  236. package/dist/utils/stream.helper.js +0 -71
  237. package/dist/utils/stream.helper.js.map +0 -1
  238. package/dist/utils/time.record.d.ts +0 -15
  239. package/dist/utils/time.record.js +0 -52
  240. package/dist/utils/time.record.js.map +0 -1
  241. package/dist/utils/timezone.d.ts +0 -7
  242. package/dist/utils/timezone.js +0 -21
  243. package/dist/utils/timezone.js.map +0 -1
  244. package/dist/utils/ultipa.datetime.d.ts +0 -14
  245. package/dist/utils/ultipa.datetime.js +0 -160
  246. package/dist/utils/ultipa.datetime.js.map +0 -1
  247. package/dist/utils/uql-maker.d.ts +0 -165
  248. package/dist/utils/uql-maker.js +0 -402
  249. package/dist/utils/uql-maker.js.map +0 -1
  250. package/dist/utils/uql.parse.d.ts +0 -27
  251. package/dist/utils/uql.parse.js +0 -205
  252. package/dist/utils/uql.parse.js.map +0 -1
  253. package/readme.md +0 -65
  254. package/src/proto/build.sh +0 -41
  255. package/src/proto/build_windows.sh +0 -40
  256. package/src/proto/ultipa.proto +0 -531
  257. package/src/proto/ultipa_grpc_pb.d.ts +0 -92
  258. package/src/proto/ultipa_grpc_pb.js +0 -414
  259. package/src/proto/ultipa_pb.d.ts +0 -1983
  260. package/src/proto/ultipa_pb.js +0 -14852
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Type conversion utilities between gRPC proto types and JavaScript types.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildGqlRequest = buildGqlRequest;
7
+ exports.buildParameters = buildParameters;
8
+ exports.convertGqlResponse = convertGqlResponse;
9
+ exports.convertTypedValue = convertTypedValue;
10
+ exports.convertProtoProperties = convertProtoProperties;
11
+ exports.convertGraphInfo = convertGraphInfo;
12
+ exports.graphTypeToProto = graphTypeToProto;
13
+ exports.protoToGraphType = protoToGraphType;
14
+ exports.protoToHealthStatus = protoToHealthStatus;
15
+ exports.cacheTypeToProto = cacheTypeToProto;
16
+ exports.nodeDataToProto = nodeDataToProto;
17
+ exports.edgeDataToProto = edgeDataToProto;
18
+ const response_1 = require("../response");
19
+ const types_1 = require("../types");
20
+ /**
21
+ * Build a GQL request from config.
22
+ */
23
+ function buildGqlRequest(query, session, config, queryConfig) {
24
+ return {
25
+ gql: query,
26
+ graph_name: queryConfig?.graphName || session?.defaultGraph || config.defaultGraph || '',
27
+ parameters: buildParameters(queryConfig?.parameters),
28
+ session_id: session?.id?.toString() || '0',
29
+ transaction_id: queryConfig?.transactionId?.toString() || '0',
30
+ timeout: Math.floor((queryConfig?.timeout || config.timeout || 30000) / 1000), // Convert ms to seconds for gRPC
31
+ read_only: queryConfig?.readOnly || false,
32
+ max_path_results: queryConfig?.maxPathResults || 0,
33
+ };
34
+ }
35
+ /**
36
+ * Build parameters array for gRPC.
37
+ */
38
+ function buildParameters(params) {
39
+ if (!params)
40
+ return [];
41
+ return Object.entries(params).map(([name, value]) => ({
42
+ name,
43
+ value: (0, types_1.createTypedValue)(value),
44
+ }));
45
+ }
46
+ /**
47
+ * Convert gRPC response to Response object.
48
+ */
49
+ function convertGqlResponse(grpcResponse) {
50
+ const columns = grpcResponse.columns || [];
51
+ const rows = (grpcResponse.rows || []).map((row) => {
52
+ const rawValues = row.values || [];
53
+ const values = rawValues.map((tv) => convertTypedValue(tv));
54
+ const types = rawValues.map((tv) => protoTypeToEnum(tv?.type));
55
+ return new response_1.Row(values, types);
56
+ });
57
+ return new response_1.Response(columns, rows, parseInt(grpcResponse.row_count || '0', 10), grpcResponse.has_more || false, grpcResponse.warnings || [], parseInt(grpcResponse.rows_affected || '0', 10));
58
+ }
59
+ /**
60
+ * Map proto type string or number to PropertyType enum.
61
+ * Handles both string enum names (e.g., 'PROPERTY_TYPE_STRING') and numeric values.
62
+ */
63
+ function protoTypeToEnum(protoType) {
64
+ // Handle numeric enum values directly
65
+ if (typeof protoType === 'number') {
66
+ // If it's already a valid PropertyType number, return it directly
67
+ // PropertyType ranges from UNSET(0) to EDGE(33)
68
+ if (protoType >= types_1.PropertyType.UNSET && protoType <= types_1.PropertyType.EDGE) {
69
+ return protoType;
70
+ }
71
+ return types_1.PropertyType.NULL;
72
+ }
73
+ const typeMap = {
74
+ 'PROPERTY_TYPE_NULL': types_1.PropertyType.NULL,
75
+ 'PROPERTY_TYPE_UNSET': types_1.PropertyType.UNSET,
76
+ 'PROPERTY_TYPE_BOOL': types_1.PropertyType.BOOL,
77
+ 'PROPERTY_TYPE_INT32': types_1.PropertyType.INT32,
78
+ 'PROPERTY_TYPE_UINT32': types_1.PropertyType.UINT32,
79
+ 'PROPERTY_TYPE_INT64': types_1.PropertyType.INT64,
80
+ 'PROPERTY_TYPE_UINT64': types_1.PropertyType.UINT64,
81
+ 'PROPERTY_TYPE_FLOAT': types_1.PropertyType.FLOAT,
82
+ 'PROPERTY_TYPE_DOUBLE': types_1.PropertyType.DOUBLE,
83
+ 'PROPERTY_TYPE_STRING': types_1.PropertyType.STRING,
84
+ 'PROPERTY_TYPE_TEXT': types_1.PropertyType.TEXT,
85
+ 'PROPERTY_TYPE_BLOB': types_1.PropertyType.BLOB,
86
+ 'PROPERTY_TYPE_TIMESTAMP': types_1.PropertyType.TIMESTAMP,
87
+ 'PROPERTY_TYPE_DATETIME': types_1.PropertyType.DATETIME,
88
+ 'PROPERTY_TYPE_DATE': types_1.PropertyType.DATE,
89
+ 'PROPERTY_TYPE_LOCAL_DATETIME': types_1.PropertyType.LOCAL_DATETIME,
90
+ 'PROPERTY_TYPE_ZONED_DATETIME': types_1.PropertyType.ZONED_DATETIME,
91
+ 'PROPERTY_TYPE_LOCAL_TIME': types_1.PropertyType.LOCAL_TIME,
92
+ 'PROPERTY_TYPE_ZONED_TIME': types_1.PropertyType.ZONED_TIME,
93
+ 'PROPERTY_TYPE_YEAR_TO_MONTH': types_1.PropertyType.YEAR_TO_MONTH,
94
+ 'PROPERTY_TYPE_DAY_TO_SECOND': types_1.PropertyType.DAY_TO_SECOND,
95
+ 'PROPERTY_TYPE_DECIMAL': types_1.PropertyType.DECIMAL,
96
+ 'PROPERTY_TYPE_POINT': types_1.PropertyType.POINT,
97
+ 'PROPERTY_TYPE_POINT3D': types_1.PropertyType.POINT3D,
98
+ 'PROPERTY_TYPE_VECTOR': types_1.PropertyType.VECTOR,
99
+ 'PROPERTY_TYPE_LIST': types_1.PropertyType.LIST,
100
+ 'PROPERTY_TYPE_SET': types_1.PropertyType.SET,
101
+ 'PROPERTY_TYPE_MAP': types_1.PropertyType.MAP,
102
+ 'PROPERTY_TYPE_NODE': types_1.PropertyType.NODE,
103
+ 'PROPERTY_TYPE_EDGE': types_1.PropertyType.EDGE,
104
+ 'PROPERTY_TYPE_PATH': types_1.PropertyType.PATH,
105
+ 'PROPERTY_TYPE_RECORD': types_1.PropertyType.RECORD,
106
+ 'PROPERTY_TYPE_TABLE': types_1.PropertyType.TABLE,
107
+ 'PROPERTY_TYPE_ERROR': types_1.PropertyType.ERROR,
108
+ };
109
+ return typeMap[protoType] ?? types_1.PropertyType.NULL;
110
+ }
111
+ /**
112
+ * Convert gRPC TypedValue to JS value.
113
+ * Uses the same decoding logic as typedValueToJS for consistency.
114
+ */
115
+ function convertTypedValue(tv) {
116
+ if (!tv || tv.is_null || tv.isNull)
117
+ return null;
118
+ const data = tv.data;
119
+ const protoType = tv.type;
120
+ // Handle null types (both string and numeric enum values)
121
+ if (protoType === 'PROPERTY_TYPE_NULL' || protoType === 'PROPERTY_TYPE_UNSET' ||
122
+ protoType === types_1.PropertyType.NULL || protoType === types_1.PropertyType.UNSET) {
123
+ return null;
124
+ }
125
+ // Handle empty data - but STRING type with empty data should return ""
126
+ if (!data || data.length === 0) {
127
+ const isStringType = protoType === 'PROPERTY_TYPE_STRING' || protoType === 'PROPERTY_TYPE_TEXT' ||
128
+ protoType === types_1.PropertyType.STRING || protoType === types_1.PropertyType.TEXT;
129
+ const isBlobType = protoType === 'PROPERTY_TYPE_BLOB' || protoType === types_1.PropertyType.BLOB;
130
+ if (isStringType) {
131
+ return '';
132
+ }
133
+ if (isBlobType) {
134
+ return Buffer.alloc(0);
135
+ }
136
+ return null;
137
+ }
138
+ const buf = Buffer.from(data);
139
+ const enumType = protoTypeToEnum(protoType);
140
+ // Use typedValueToJS for consistent decoding
141
+ return (0, types_1.typedValueToJS)({ type: enumType, data: buf, isNull: false });
142
+ }
143
+ /**
144
+ * Convert proto properties map to JS object.
145
+ */
146
+ function convertProtoProperties(protoProps) {
147
+ const result = {};
148
+ for (const [key, tv] of Object.entries(protoProps)) {
149
+ result[key] = convertTypedValue(tv);
150
+ }
151
+ return result;
152
+ }
153
+ /**
154
+ * Convert GraphInfo from proto to JS object.
155
+ */
156
+ function convertGraphInfo(g) {
157
+ return {
158
+ name: g.name || '',
159
+ graphType: protoToGraphType(g.graph_type),
160
+ nodeCount: parseInt(g.node_count || '0', 10),
161
+ edgeCount: parseInt(g.edge_count || '0', 10),
162
+ description: g.description || '',
163
+ };
164
+ }
165
+ /**
166
+ * Map GraphType enum to proto string.
167
+ */
168
+ function graphTypeToProto(graphType) {
169
+ switch (graphType) {
170
+ case types_1.GraphType.OPEN:
171
+ return 'GRAPH_TYPE_OPEN';
172
+ case types_1.GraphType.CLOSED:
173
+ return 'GRAPH_TYPE_CLOSED';
174
+ case types_1.GraphType.ONTOLOGY:
175
+ return 'GRAPH_TYPE_ONTOLOGY';
176
+ default:
177
+ return 'GRAPH_TYPE_OPEN';
178
+ }
179
+ }
180
+ /**
181
+ * Map proto string to GraphType enum.
182
+ */
183
+ function protoToGraphType(proto) {
184
+ switch (proto) {
185
+ case 'GRAPH_TYPE_CLOSED':
186
+ return types_1.GraphType.CLOSED;
187
+ case 'GRAPH_TYPE_ONTOLOGY':
188
+ return types_1.GraphType.ONTOLOGY;
189
+ default:
190
+ return types_1.GraphType.OPEN;
191
+ }
192
+ }
193
+ /**
194
+ * Map proto HealthStatus to enum.
195
+ */
196
+ function protoToHealthStatus(proto) {
197
+ switch (proto) {
198
+ case 'HEALTH_STATUS_SERVING':
199
+ return types_1.HealthStatus.SERVING;
200
+ case 'HEALTH_STATUS_NOT_SERVING':
201
+ return types_1.HealthStatus.NOT_SERVING;
202
+ case 'HEALTH_STATUS_SERVICE_UNKNOWN':
203
+ return types_1.HealthStatus.SERVICE_UNKNOWN;
204
+ default:
205
+ return types_1.HealthStatus.UNKNOWN;
206
+ }
207
+ }
208
+ /**
209
+ * Map CacheType to proto string.
210
+ */
211
+ function cacheTypeToProto(cacheType) {
212
+ switch (cacheType) {
213
+ case types_1.CacheType.AST:
214
+ return 'CACHE_TYPE_AST';
215
+ case types_1.CacheType.PLAN:
216
+ return 'CACHE_TYPE_PLAN';
217
+ default:
218
+ return 'CACHE_TYPE_ALL';
219
+ }
220
+ }
221
+ /**
222
+ * Convert NodeData to proto format.
223
+ */
224
+ function nodeDataToProto(node) {
225
+ const properties = {};
226
+ if (node.properties) {
227
+ for (const [key, value] of Object.entries(node.properties)) {
228
+ properties[key] = (0, types_1.createTypedValue)(value);
229
+ }
230
+ }
231
+ return {
232
+ id: node.id || '',
233
+ labels: node.labels || [],
234
+ properties,
235
+ };
236
+ }
237
+ /**
238
+ * Convert EdgeData to proto format.
239
+ */
240
+ function edgeDataToProto(edge) {
241
+ const properties = {};
242
+ if (edge.properties) {
243
+ for (const [key, value] of Object.entries(edge.properties)) {
244
+ properties[key] = (0, types_1.createTypedValue)(value);
245
+ }
246
+ }
247
+ return {
248
+ label: edge.label || '',
249
+ from_node_id: edge.fromNodeId || '',
250
+ to_node_id: edge.toNodeId || '',
251
+ properties,
252
+ };
253
+ }
254
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jb252ZXJ0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFtQkgsMENBZ0JDO0FBS0QsMENBTUM7QUFLRCxnREFnQkM7QUE0REQsOENBZ0NDO0FBS0Qsd0RBTUM7QUFLRCw0Q0FRQztBQUtELDRDQVdDO0FBS0QsNENBU0M7QUFLRCxrREFXQztBQUtELDRDQVNDO0FBS0QsMENBWUM7QUFLRCwwQ0FhQztBQXBSRCwwQ0FBNEM7QUFDNUMsb0NBUWtCO0FBS2xCOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFhLEVBQ2IsT0FBdUIsRUFDdkIsTUFBbUIsRUFDbkIsV0FBeUI7SUFFekIsT0FBTztRQUNMLEdBQUcsRUFBRSxLQUFLO1FBQ1YsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDeEYsVUFBVSxFQUFFLGVBQWUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBQ3BELFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEdBQUc7UUFDMUMsY0FBYyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRztRQUM3RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxpQ0FBaUM7UUFDaEgsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLElBQUksS0FBSztRQUN6QyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxJQUFJLENBQUM7S0FDbkQsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxNQUE0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QU87UUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFO1FBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUU7UUFDekIsVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixlQUFlLENBQUMsSUFBUztJQUN2QyxNQUFNLFVBQVUsR0FBd0IsRUFBRSxDQUFDO0lBQzNDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFBLHdCQUFnQixFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTztRQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtRQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO1FBQy9CLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZSBjb252ZXJzaW9uIHV0aWxpdGllcyBiZXR3ZWVuIGdSUEMgcHJvdG8gdHlwZXMgYW5kIEphdmFTY3JpcHQgdHlwZXMuXG4gKi9cblxuaW1wb3J0IHsgUmVzcG9uc2UsIFJvdyB9IGZyb20gJy4uL3Jlc3BvbnNlJztcbmltcG9ydCB7XG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVR5cGUsXG4gIEdyYXBoSW5mbyxcbiAgY3JlYXRlVHlwZWRWYWx1ZSxcbiAgUHJvcGVydHlUeXBlLFxuICB0eXBlZFZhbHVlVG9KUyxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgR3FsZGJDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4uL3Nlc3Npb24nO1xuaW1wb3J0IHsgUXVlcnlDb25maWcgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIEJ1aWxkIGEgR1FMIHJlcXVlc3QgZnJvbSBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEdxbFJlcXVlc3QoXG4gIHF1ZXJ5OiBzdHJpbmcsXG4gIHNlc3Npb246IFNlc3Npb24gfCBudWxsLFxuICBjb25maWc6IEdxbGRiQ29uZmlnLFxuICBxdWVyeUNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4pOiBhbnkge1xuICByZXR1cm4ge1xuICAgIGdxbDogcXVlcnksXG4gICAgZ3JhcGhfbmFtZTogcXVlcnlDb25maWc/LmdyYXBoTmFtZSB8fCBzZXNzaW9uPy5kZWZhdWx0R3JhcGggfHwgY29uZmlnLmRlZmF1bHRHcmFwaCB8fCAnJyxcbiAgICBwYXJhbWV0ZXJzOiBidWlsZFBhcmFtZXRlcnMocXVlcnlDb25maWc/LnBhcmFtZXRlcnMpLFxuICAgIHNlc3Npb25faWQ6IHNlc3Npb24/LmlkPy50b1N0cmluZygpIHx8ICcwJyxcbiAgICB0cmFuc2FjdGlvbl9pZDogcXVlcnlDb25maWc/LnRyYW5zYWN0aW9uSWQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgIHRpbWVvdXQ6IE1hdGguZmxvb3IoKHF1ZXJ5Q29uZmlnPy50aW1lb3V0IHx8IGNvbmZpZy50aW1lb3V0IHx8IDMwMDAwKSAvIDEwMDApLCAvLyBDb252ZXJ0IG1zIHRvIHNlY29uZHMgZm9yIGdSUENcbiAgICByZWFkX29ubHk6IHF1ZXJ5Q29uZmlnPy5yZWFkT25seSB8fCBmYWxzZSxcbiAgICBtYXhfcGF0aF9yZXN1bHRzOiBxdWVyeUNvbmZpZz8ubWF4UGF0aFJlc3VsdHMgfHwgMCxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBwYXJhbWV0ZXJzIGFycmF5IGZvciBnUlBDLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQYXJhbWV0ZXJzKHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBhbnlbXSB7XG4gIGlmICghcGFyYW1zKSByZXR1cm4gW107XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhwYXJhbXMpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gKHtcbiAgICBuYW1lLFxuICAgIHZhbHVlOiBjcmVhdGVUeXBlZFZhbHVlKHZhbHVlKSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgZ1JQQyByZXNwb25zZSB0byBSZXNwb25zZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0R3FsUmVzcG9uc2UoZ3JwY1Jlc3BvbnNlOiBhbnkpOiBSZXNwb25zZSB7XG4gIGNvbnN0IGNvbHVtbnMgPSBncnBjUmVzcG9uc2UuY29sdW1ucyB8fCBbXTtcbiAgY29uc3Qgcm93czogUm93W10gPSAoZ3JwY1Jlc3BvbnNlLnJvd3MgfHwgW10pLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICBjb25zdCByYXdWYWx1ZXMgPSByb3cudmFsdWVzIHx8IFtdO1xuICAgIGNvbnN0IHZhbHVlcyA9IHJhd1ZhbHVlcy5tYXAoKHR2OiBhbnkpID0+IGNvbnZlcnRUeXBlZFZhbHVlKHR2KSk7XG4gICAgY29uc3QgdHlwZXMgPSByYXdWYWx1ZXMubWFwKCh0djogYW55KSA9PiBwcm90b1R5cGVUb0VudW0odHY/LnR5cGUpKTtcbiAgICByZXR1cm4gbmV3IFJvdyh2YWx1ZXMsIHR5cGVzKTtcbiAgfSk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoXG4gICAgY29sdW1ucyxcbiAgICByb3dzLFxuICAgIHBhcnNlSW50KGdycGNSZXNwb25zZS5yb3dfY291bnQgfHwgJzAnLCAxMCksXG4gICAgZ3JwY1Jlc3BvbnNlLmhhc19tb3JlIHx8IGZhbHNlLFxuICAgIGdycGNSZXNwb25zZS53YXJuaW5ncyB8fCBbXSxcbiAgICBwYXJzZUludChncnBjUmVzcG9uc2Uucm93c19hZmZlY3RlZCB8fCAnMCcsIDEwKVxuICApO1xufVxuXG4vKipcbiAqIE1hcCBwcm90byB0eXBlIHN0cmluZyBvciBudW1iZXIgdG8gUHJvcGVydHlUeXBlIGVudW0uXG4gKiBIYW5kbGVzIGJvdGggc3RyaW5nIGVudW0gbmFtZXMgKGUuZy4sICdQUk9QRVJUWV9UWVBFX1NUUklORycpIGFuZCBudW1lcmljIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcHJvdG9UeXBlVG9FbnVtKHByb3RvVHlwZTogc3RyaW5nIHwgbnVtYmVyKTogUHJvcGVydHlUeXBlIHtcbiAgLy8gSGFuZGxlIG51bWVyaWMgZW51bSB2YWx1ZXMgZGlyZWN0bHlcbiAgaWYgKHR5cGVvZiBwcm90b1R5cGUgPT09ICdudW1iZXInKSB7XG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEgdmFsaWQgUHJvcGVydHlUeXBlIG51bWJlciwgcmV0dXJuIGl0IGRpcmVjdGx5XG4gICAgLy8gUHJvcGVydHlUeXBlIHJhbmdlcyBmcm9tIFVOU0VUKDApIHRvIEVER0UoMzMpXG4gICAgaWYgKHByb3RvVHlwZSA+PSBQcm9wZXJ0eVR5cGUuVU5TRVQgJiYgcHJvdG9UeXBlIDw9IFByb3BlcnR5VHlwZS5FREdFKSB7XG4gICAgICByZXR1cm4gcHJvdG9UeXBlIGFzIFByb3BlcnR5VHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIFByb3BlcnR5VHlwZS5OVUxMO1xuICB9XG5cbiAgY29uc3QgdHlwZU1hcDogUmVjb3JkPHN0cmluZywgUHJvcGVydHlUeXBlPiA9IHtcbiAgICAnUFJPUEVSVFlfVFlQRV9OVUxMJzogUHJvcGVydHlUeXBlLk5VTEwsXG4gICAgJ1BST1BFUlRZX1RZUEVfVU5TRVQnOiBQcm9wZXJ0eVR5cGUuVU5TRVQsXG4gICAgJ1BST1BFUlRZX1RZUEVfQk9PTCc6IFByb3BlcnR5VHlwZS5CT09MLFxuICAgICdQUk9QRVJUWV9UWVBFX0lOVDMyJzogUHJvcGVydHlUeXBlLklOVDMyLFxuICAgICdQUk9QRVJUWV9UWVBFX1VJTlQzMic6IFByb3BlcnR5VHlwZS5VSU5UMzIsXG4gICAgJ1BST1BFUlRZX1RZUEVfSU5UNjQnOiBQcm9wZXJ0eVR5cGUuSU5UNjQsXG4gICAgJ1BST1BFUlRZX1RZUEVfVUlOVDY0JzogUHJvcGVydHlUeXBlLlVJTlQ2NCxcbiAgICAnUFJPUEVSVFlfVFlQRV9GTE9BVCc6IFByb3BlcnR5VHlwZS5GTE9BVCxcbiAgICAnUFJPUEVSVFlfVFlQRV9ET1VCTEUnOiBQcm9wZXJ0eVR5cGUuRE9VQkxFLFxuICAgICdQUk9QRVJUWV9UWVBFX1NUUklORyc6IFByb3BlcnR5VHlwZS5TVFJJTkcsXG4gICAgJ1BST1BFUlRZX1RZUEVfVEVYVCc6IFByb3BlcnR5VHlwZS5URVhULFxuICAgICdQUk9QRVJUWV9UWVBFX0JMT0InOiBQcm9wZXJ0eVR5cGUuQkxPQixcbiAgICAnUFJPUEVSVFlfVFlQRV9USU1FU1RBTVAnOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLFxuICAgICdQUk9QRVJUWV9UWVBFX0RBVEVUSU1FJzogUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxuICAgICdQUk9QRVJUWV9UWVBFX0RBVEUnOiBQcm9wZXJ0eVR5cGUuREFURSxcbiAgICAnUFJPUEVSVFlfVFlQRV9MT0NBTF9EQVRFVElNRSc6IFByb3BlcnR5VHlwZS5MT0NBTF9EQVRFVElNRSxcbiAgICAnUFJPUEVSVFlfVFlQRV9aT05FRF9EQVRFVElNRSc6IFByb3BlcnR5VHlwZS5aT05FRF9EQVRFVElNRSxcbiAgICAnUFJPUEVSVFlfVFlQRV9MT0NBTF9USU1FJzogUHJvcGVydHlUeXBlLkxPQ0FMX1RJTUUsXG4gICAgJ1BST1BFUlRZX1RZUEVfWk9ORURfVElNRSc6IFByb3BlcnR5VHlwZS5aT05FRF9USU1FLFxuICAgICdQUk9QRVJUWV9UWVBFX1lFQVJfVE9fTU9OVEgnOiBQcm9wZXJ0eVR5cGUuWUVBUl9UT19NT05USCxcbiAgICAnUFJPUEVSVFlfVFlQRV9EQVlfVE9fU0VDT05EJzogUHJvcGVydHlUeXBlLkRBWV9UT19TRUNPTkQsXG4gICAgJ1BST1BFUlRZX1RZUEVfREVDSU1BTCc6IFByb3BlcnR5VHlwZS5ERUNJTUFMLFxuICAgICdQUk9QRVJUWV9UWVBFX1BPSU5UJzogUHJvcGVydHlUeXBlLlBPSU5ULFxuICAgICdQUk9QRVJUWV9UWVBFX1BPSU5UM0QnOiBQcm9wZXJ0eVR5cGUuUE9JTlQzRCxcbiAgICAnUFJPUEVSVFlfVFlQRV9WRUNUT1InOiBQcm9wZXJ0eVR5cGUuVkVDVE9SLFxuICAgICdQUk9QRVJUWV9UWVBFX0xJU1QnOiBQcm9wZXJ0eVR5cGUuTElTVCxcbiAgICAnUFJPUEVSVFlfVFlQRV9TRVQnOiBQcm9wZXJ0eVR5cGUuU0VULFxuICAgICdQUk9QRVJUWV9UWVBFX01BUCc6IFByb3BlcnR5VHlwZS5NQVAsXG4gICAgJ1BST1BFUlRZX1RZUEVfTk9ERSc6IFByb3BlcnR5VHlwZS5OT0RFLFxuICAgICdQUk9QRVJUWV9UWVBFX0VER0UnOiBQcm9wZXJ0eVR5cGUuRURHRSxcbiAgICAnUFJPUEVSVFlfVFlQRV9QQVRIJzogUHJvcGVydHlUeXBlLlBBVEgsXG4gICAgJ1BST1BFUlRZX1RZUEVfUkVDT1JEJzogUHJvcGVydHlUeXBlLlJFQ09SRCxcbiAgICAnUFJPUEVSVFlfVFlQRV9UQUJMRSc6IFByb3BlcnR5VHlwZS5UQUJMRSxcbiAgICAnUFJPUEVSVFlfVFlQRV9FUlJPUic6IFByb3BlcnR5VHlwZS5FUlJPUixcbiAgfTtcbiAgcmV0dXJuIHR5cGVNYXBbcHJvdG9UeXBlXSA/PyBQcm9wZXJ0eVR5cGUuTlVMTDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGdSUEMgVHlwZWRWYWx1ZSB0byBKUyB2YWx1ZS5cbiAqIFVzZXMgdGhlIHNhbWUgZGVjb2RpbmcgbG9naWMgYXMgdHlwZWRWYWx1ZVRvSlMgZm9yIGNvbnNpc3RlbmN5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFR5cGVkVmFsdWUodHY6IGFueSk6IGFueSB7XG4gIGlmICghdHYgfHwgdHYuaXNfbnVsbCB8fCB0di5pc051bGwpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IGRhdGEgPSB0di5kYXRhO1xuICBjb25zdCBwcm90b1R5cGUgPSB0di50eXBlO1xuXG4gIC8vIEhhbmRsZSBudWxsIHR5cGVzIChib3RoIHN0cmluZyBhbmQgbnVtZXJpYyBlbnVtIHZhbHVlcylcbiAgaWYgKHByb3RvVHlwZSA9PT0gJ1BST1BFUlRZX1RZUEVfTlVMTCcgfHwgcHJvdG9UeXBlID09PSAnUFJPUEVSVFlfVFlQRV9VTlNFVCcgfHxcbiAgICAgIHByb3RvVHlwZSA9PT0gUHJvcGVydHlUeXBlLk5VTEwgfHwgcHJvdG9UeXBlID09PSBQcm9wZXJ0eVR5cGUuVU5TRVQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBlbXB0eSBkYXRhIC0gYnV0IFNUUklORyB0eXBlIHdpdGggZW1wdHkgZGF0YSBzaG91bGQgcmV0dXJuIFwiXCJcbiAgaWYgKCFkYXRhIHx8IGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc3QgaXNTdHJpbmdUeXBlID0gcHJvdG9UeXBlID09PSAnUFJPUEVSVFlfVFlQRV9TVFJJTkcnIHx8IHByb3RvVHlwZSA9PT0gJ1BST1BFUlRZX1RZUEVfVEVYVCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1R5cGUgPT09IFByb3BlcnR5VHlwZS5TVFJJTkcgfHwgcHJvdG9UeXBlID09PSBQcm9wZXJ0eVR5cGUuVEVYVDtcbiAgICBjb25zdCBpc0Jsb2JUeXBlID0gcHJvdG9UeXBlID09PSAnUFJPUEVSVFlfVFlQRV9CTE9CJyB8fCBwcm90b1R5cGUgPT09IFByb3BlcnR5VHlwZS5CTE9CO1xuXG4gICAgaWYgKGlzU3RyaW5nVHlwZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoaXNCbG9iVHlwZSkge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBidWYgPSBCdWZmZXIuZnJvbShkYXRhKTtcbiAgY29uc3QgZW51bVR5cGUgPSBwcm90b1R5cGVUb0VudW0ocHJvdG9UeXBlKTtcblxuICAvLyBVc2UgdHlwZWRWYWx1ZVRvSlMgZm9yIGNvbnNpc3RlbnQgZGVjb2RpbmdcbiAgcmV0dXJuIHR5cGVkVmFsdWVUb0pTKHsgdHlwZTogZW51bVR5cGUsIGRhdGE6IGJ1ZiwgaXNOdWxsOiBmYWxzZSB9KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHByb3RvIHByb3BlcnRpZXMgbWFwIHRvIEpTIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRQcm90b1Byb3BlcnRpZXMocHJvdG9Qcm9wczogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCB0dl0gb2YgT2JqZWN0LmVudHJpZXMocHJvdG9Qcm9wcykpIHtcbiAgICByZXN1bHRba2V5XSA9IGNvbnZlcnRUeXBlZFZhbHVlKHR2KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgR3JhcGhJbmZvIGZyb20gcHJvdG8gdG8gSlMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEdyYXBoSW5mbyhnOiBhbnkpOiBHcmFwaEluZm8ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGcubmFtZSB8fCAnJyxcbiAgICBncmFwaFR5cGU6IHByb3RvVG9HcmFwaFR5cGUoZy5ncmFwaF90eXBlKSxcbiAgICBub2RlQ291bnQ6IHBhcnNlSW50KGcubm9kZV9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICBlZGdlQ291bnQ6IHBhcnNlSW50KGcuZWRnZV9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICBkZXNjcmlwdGlvbjogZy5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgfTtcbn1cblxuLyoqXG4gKiBNYXAgR3JhcGhUeXBlIGVudW0gdG8gcHJvdG8gc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhcGhUeXBlVG9Qcm90byhncmFwaFR5cGU6IEdyYXBoVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoZ3JhcGhUeXBlKSB7XG4gICAgY2FzZSBHcmFwaFR5cGUuT1BFTjpcbiAgICAgIHJldHVybiAnR1JBUEhfVFlQRV9PUEVOJztcbiAgICBjYXNlIEdyYXBoVHlwZS5DTE9TRUQ6XG4gICAgICByZXR1cm4gJ0dSQVBIX1RZUEVfQ0xPU0VEJztcbiAgICBjYXNlIEdyYXBoVHlwZS5PTlRPTE9HWTpcbiAgICAgIHJldHVybiAnR1JBUEhfVFlQRV9PTlRPTE9HWSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnR1JBUEhfVFlQRV9PUEVOJztcbiAgfVxufVxuXG4vKipcbiAqIE1hcCBwcm90byBzdHJpbmcgdG8gR3JhcGhUeXBlIGVudW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm90b1RvR3JhcGhUeXBlKHByb3RvOiBzdHJpbmcpOiBHcmFwaFR5cGUge1xuICBzd2l0Y2ggKHByb3RvKSB7XG4gICAgY2FzZSAnR1JBUEhfVFlQRV9DTE9TRUQnOlxuICAgICAgcmV0dXJuIEdyYXBoVHlwZS5DTE9TRUQ7XG4gICAgY2FzZSAnR1JBUEhfVFlQRV9PTlRPTE9HWSc6XG4gICAgICByZXR1cm4gR3JhcGhUeXBlLk9OVE9MT0dZO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gR3JhcGhUeXBlLk9QRU47XG4gIH1cbn1cblxuLyoqXG4gKiBNYXAgcHJvdG8gSGVhbHRoU3RhdHVzIHRvIGVudW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm90b1RvSGVhbHRoU3RhdHVzKHByb3RvOiBzdHJpbmcpOiBIZWFsdGhTdGF0dXMge1xuICBzd2l0Y2ggKHByb3RvKSB7XG4gICAgY2FzZSAnSEVBTFRIX1NUQVRVU19TRVJWSU5HJzpcbiAgICAgIHJldHVybiBIZWFsdGhTdGF0dXMuU0VSVklORztcbiAgICBjYXNlICdIRUFMVEhfU1RBVFVTX05PVF9TRVJWSU5HJzpcbiAgICAgIHJldHVybiBIZWFsdGhTdGF0dXMuTk9UX1NFUlZJTkc7XG4gICAgY2FzZSAnSEVBTFRIX1NUQVRVU19TRVJWSUNFX1VOS05PV04nOlxuICAgICAgcmV0dXJuIEhlYWx0aFN0YXR1cy5TRVJWSUNFX1VOS05PV047XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIZWFsdGhTdGF0dXMuVU5LTk9XTjtcbiAgfVxufVxuXG4vKipcbiAqIE1hcCBDYWNoZVR5cGUgdG8gcHJvdG8gc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVUeXBlVG9Qcm90byhjYWNoZVR5cGU6IENhY2hlVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoY2FjaGVUeXBlKSB7XG4gICAgY2FzZSBDYWNoZVR5cGUuQVNUOlxuICAgICAgcmV0dXJuICdDQUNIRV9UWVBFX0FTVCc7XG4gICAgY2FzZSBDYWNoZVR5cGUuUExBTjpcbiAgICAgIHJldHVybiAnQ0FDSEVfVFlQRV9QTEFOJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdDQUNIRV9UWVBFX0FMTCc7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IE5vZGVEYXRhIHRvIHByb3RvIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vZGVEYXRhVG9Qcm90byhub2RlOiBhbnkpOiBhbnkge1xuICBjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmIChub2RlLnByb3BlcnRpZXMpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhub2RlLnByb3BlcnRpZXMpKSB7XG4gICAgICBwcm9wZXJ0aWVzW2tleV0gPSBjcmVhdGVUeXBlZFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBpZDogbm9kZS5pZCB8fCAnJyxcbiAgICBsYWJlbHM6IG5vZGUubGFiZWxzIHx8IFtdLFxuICAgIHByb3BlcnRpZXMsXG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydCBFZGdlRGF0YSB0byBwcm90byBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlZGdlRGF0YVRvUHJvdG8oZWRnZTogYW55KTogYW55IHtcbiAgY29uc3QgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBpZiAoZWRnZS5wcm9wZXJ0aWVzKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZWRnZS5wcm9wZXJ0aWVzKSkge1xuICAgICAgcHJvcGVydGllc1trZXldID0gY3JlYXRlVHlwZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgbGFiZWw6IGVkZ2UubGFiZWwgfHwgJycsXG4gICAgZnJvbV9ub2RlX2lkOiBlZGdlLmZyb21Ob2RlSWQgfHwgJycsXG4gICAgdG9fbm9kZV9pZDogZWRnZS50b05vZGVJZCB8fCAnJyxcbiAgICBwcm9wZXJ0aWVzLFxuICB9O1xufVxuIl19
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Data service handles node and edge insert/delete/export operations.
3
+ */
4
+ import { ServiceContext } from './service-context';
5
+ import { InsertNodesResult, InsertEdgesResult, DeleteResult, ExportNodesResult, ExportEdgesResult, ExportConfig, ExportChunk } from '../response';
6
+ import { NodeData, EdgeData } from '../types';
7
+ import { InsertNodesConfig, InsertEdgesConfig } from '../client';
8
+ /**
9
+ * Data service for inserting, deleting, and exporting graph data.
10
+ */
11
+ export declare class DataService {
12
+ private ctx;
13
+ constructor(ctx: ServiceContext);
14
+ /**
15
+ * Insert multiple nodes into a graph.
16
+ */
17
+ insertNodes(graphName: string, nodes: NodeData[], config?: InsertNodesConfig): Promise<InsertNodesResult>;
18
+ /**
19
+ * Insert multiple edges into a graph.
20
+ */
21
+ insertEdges(graphName: string, edges: EdgeData[], config?: InsertEdgesConfig): Promise<InsertEdgesResult>;
22
+ /**
23
+ * Delete nodes from a graph.
24
+ */
25
+ deleteNodes(graphName: string, nodeIds?: string[], labels?: string[], where?: string): Promise<DeleteResult>;
26
+ /**
27
+ * Delete edges from a graph.
28
+ */
29
+ deleteEdges(graphName: string, edgeIds?: string[], label?: string, where?: string): Promise<DeleteResult>;
30
+ /**
31
+ * Export graph data in JSON Lines format (streaming).
32
+ */
33
+ export(config: ExportConfig, callback?: (chunk: ExportChunk) => void): Promise<void>;
34
+ /**
35
+ * Stream nodes from a graph.
36
+ * @deprecated Use export() with ExportConfig instead
37
+ */
38
+ exportNodes(graphName: string, labels?: string[], limit?: number, callback?: (result: ExportNodesResult) => void): Promise<void>;
39
+ /**
40
+ * Stream edges from a graph.
41
+ * @deprecated Use export() with ExportConfig instead
42
+ */
43
+ exportEdges(graphName: string, labels?: string[], limit?: number, callback?: (result: ExportEdgesResult) => void): Promise<void>;
44
+ }
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Data service handles node and edge insert/delete/export operations.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DataService = void 0;
7
+ const services_1 = require("../services");
8
+ const converters_1 = require("./converters");
9
+ /**
10
+ * Data service for inserting, deleting, and exporting graph data.
11
+ */
12
+ class DataService {
13
+ ctx;
14
+ constructor(ctx) {
15
+ this.ctx = ctx;
16
+ }
17
+ /**
18
+ * Insert multiple nodes into a graph.
19
+ */
20
+ async insertNodes(graphName, nodes, config) {
21
+ const request = {
22
+ graph_name: graphName,
23
+ nodes: nodes.map((n) => (0, converters_1.nodeDataToProto)(n)),
24
+ };
25
+ // ALWAYS set options (even when undefined) to avoid deprecated bulk operations error
26
+ request.options = { overwrite: config?.options?.overwrite || false };
27
+ if (config?.bulkImportSessionId) {
28
+ request.bulk_import_session_id = config.bulkImportSessionId;
29
+ }
30
+ const metadata = this.ctx.getSessionMetadata();
31
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'InsertNodes', request, metadata);
32
+ return {
33
+ success: response.success || false,
34
+ nodeIds: response.node_ids || [],
35
+ nodeCount: parseInt(response.node_count || '0', 10),
36
+ message: response.message || '',
37
+ };
38
+ }
39
+ /**
40
+ * Insert multiple edges into a graph.
41
+ */
42
+ async insertEdges(graphName, edges, config) {
43
+ const request = {
44
+ graph_name: graphName,
45
+ edges: edges.map((e) => (0, converters_1.edgeDataToProto)(e)),
46
+ };
47
+ // ALWAYS set options (even when undefined) to avoid deprecated bulk operations error
48
+ request.options = {
49
+ skip_invalid_nodes: config?.options?.skipInvalidNodes || false,
50
+ };
51
+ if (config?.bulkImportSessionId) {
52
+ request.bulk_import_session_id = config.bulkImportSessionId;
53
+ }
54
+ const metadata = this.ctx.getSessionMetadata();
55
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'InsertEdges', request, metadata);
56
+ return {
57
+ success: response.success || false,
58
+ edgeIds: response.edge_ids || [],
59
+ edgeCount: parseInt(response.edge_count || '0', 10),
60
+ message: response.message || '',
61
+ skippedCount: parseInt(response.skipped_count || '0', 10),
62
+ };
63
+ }
64
+ /**
65
+ * Delete nodes from a graph.
66
+ */
67
+ async deleteNodes(graphName, nodeIds, labels, where) {
68
+ const request = {
69
+ graph_name: graphName,
70
+ node_ids: nodeIds || [],
71
+ labels: labels || [],
72
+ where: where || '',
73
+ };
74
+ const metadata = this.ctx.getSessionMetadata();
75
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'DeleteNodes', request, metadata);
76
+ return {
77
+ success: response.success || false,
78
+ deletedCount: parseInt(response.deleted_count || '0', 10),
79
+ message: response.message || '',
80
+ };
81
+ }
82
+ /**
83
+ * Delete edges from a graph.
84
+ */
85
+ async deleteEdges(graphName, edgeIds, label, where) {
86
+ const request = {
87
+ graph_name: graphName,
88
+ edge_ids: edgeIds || [],
89
+ label: label || '',
90
+ where: where || '',
91
+ };
92
+ const metadata = this.ctx.getSessionMetadata();
93
+ const response = await (0, services_1.promisifyCall)(this.ctx.clients.dataService, 'DeleteEdges', request, metadata);
94
+ return {
95
+ success: response.success || false,
96
+ deletedCount: parseInt(response.deleted_count || '0', 10),
97
+ message: response.message || '',
98
+ };
99
+ }
100
+ /**
101
+ * Export graph data in JSON Lines format (streaming).
102
+ */
103
+ async export(config, callback) {
104
+ const request = {
105
+ graph_name: config.graphName,
106
+ batch_size: config.batchSize || 0,
107
+ export_nodes: config.exportNodes !== false,
108
+ export_edges: config.exportEdges !== false,
109
+ node_labels: config.nodeLabels || [],
110
+ edge_labels: config.edgeLabels || [],
111
+ include_metadata: config.includeMetadata || false,
112
+ };
113
+ const metadata = this.ctx.getSessionMetadata();
114
+ return new Promise((resolve, reject) => {
115
+ const stream = this.ctx.clients.dataService.Export(request, metadata);
116
+ stream.on('data', (response) => {
117
+ if (callback) {
118
+ let stats;
119
+ if (response.stats) {
120
+ stats = {
121
+ nodesExported: parseInt(response.stats.nodes_exported || '0', 10),
122
+ edgesExported: parseInt(response.stats.edges_exported || '0', 10),
123
+ bytesWritten: parseInt(response.stats.bytes_written || '0', 10),
124
+ durationMs: parseInt(response.stats.duration_ms || '0', 10),
125
+ };
126
+ }
127
+ const chunk = {
128
+ data: Buffer.from(response.data || []),
129
+ isFinal: response.is_final || false,
130
+ stats,
131
+ };
132
+ callback(chunk);
133
+ }
134
+ if (response.is_final) {
135
+ stream.cancel();
136
+ }
137
+ });
138
+ stream.on('end', () => resolve());
139
+ stream.on('error', (error) => reject(error));
140
+ });
141
+ }
142
+ /**
143
+ * Stream nodes from a graph.
144
+ * @deprecated Use export() with ExportConfig instead
145
+ */
146
+ async exportNodes(graphName, labels, limit = 0, callback) {
147
+ console.warn('exportNodes is deprecated, use export() with ExportConfig instead');
148
+ const request = {
149
+ graph_name: graphName,
150
+ labels: labels || [],
151
+ limit: limit.toString(),
152
+ };
153
+ const metadata = this.ctx.getSessionMetadata();
154
+ return new Promise((resolve, reject) => {
155
+ const stream = this.ctx.clients.dataService.ExportNodes(request, metadata);
156
+ stream.on('data', (response) => {
157
+ if (callback) {
158
+ callback({
159
+ nodes: (response.nodes || []).map((n) => ({
160
+ id: n.id || '',
161
+ labels: n.labels || [],
162
+ properties: (0, converters_1.convertProtoProperties)(n.properties || {}),
163
+ })),
164
+ hasMore: response.has_more || false,
165
+ });
166
+ }
167
+ });
168
+ stream.on('end', () => resolve());
169
+ stream.on('error', (error) => reject(error));
170
+ });
171
+ }
172
+ /**
173
+ * Stream edges from a graph.
174
+ * @deprecated Use export() with ExportConfig instead
175
+ */
176
+ async exportEdges(graphName, labels, limit = 0, callback) {
177
+ console.warn('exportEdges is deprecated, use export() with ExportConfig instead');
178
+ const request = {
179
+ graph_name: graphName,
180
+ labels: labels || [],
181
+ limit: limit.toString(),
182
+ };
183
+ const metadata = this.ctx.getSessionMetadata();
184
+ return new Promise((resolve, reject) => {
185
+ const stream = this.ctx.clients.dataService.ExportEdges(request, metadata);
186
+ stream.on('data', (response) => {
187
+ if (callback) {
188
+ callback({
189
+ edges: (response.edges || []).map((e) => ({
190
+ id: e.id || '',
191
+ label: e.label || '',
192
+ fromNodeId: e.from_node_id || '',
193
+ toNodeId: e.to_node_id || '',
194
+ properties: (0, converters_1.convertProtoProperties)(e.properties || {}),
195
+ })),
196
+ hasMore: response.has_more || false,
197
+ });
198
+ }
199
+ });
200
+ stream.on('end', () => resolve());
201
+ stream.on('error', (error) => reject(error));
202
+ });
203
+ }
204
+ }
205
+ exports.DataService = DataService;
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2RhdGEtc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQWNILDBDQUE0QztBQUM1Qyw2Q0FBd0Y7QUFHeEY7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDRjtJQUFwQixZQUFvQixHQUFtQjtRQUFuQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtJQUFHLENBQUM7SUFFM0M7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLEtBQWlCLEVBQ2pCLE1BQTBCO1FBRTFCLE1BQU0sT0FBTyxHQUFRO1lBQ25CLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDRCQUFlLEVBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUMsQ0FBQztRQUVGLHFGQUFxRjtRQUNyRixPQUFPLENBQUMsT0FBTyxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRXJFLElBQUksTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM5RCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFRLE1BQU0sSUFBQSx3QkFBYSxFQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQzVCLGFBQWEsRUFDYixPQUFPLEVBQ1AsUUFBUSxDQUNULENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSztZQUNsQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxFQUFFO1lBQ2hDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsU0FBaUIsRUFDakIsS0FBaUIsRUFDakIsTUFBMEI7UUFFMUIsTUFBTSxPQUFPLEdBQVE7WUFDbkIsVUFBVSxFQUFFLFNBQVM7WUFDckIsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsNEJBQWUsRUFBQyxDQUFDLENBQUMsQ0FBQztTQUM1QyxDQUFDO1FBRUYscUZBQXFGO1FBQ3JGLE9BQU8sQ0FBQyxPQUFPLEdBQUc7WUFDaEIsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxLQUFLO1NBQy9ELENBQUM7UUFFRixJQUFJLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDOUQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBUSxNQUFNLElBQUEsd0JBQWEsRUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUM1QixhQUFhLEVBQ2IsT0FBTyxFQUNQLFFBQVEsQ0FDVCxDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEtBQUs7WUFDbEMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksRUFBRTtZQUNoQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNuRCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxFQUFFO1lBQy9CLFlBQVksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLFNBQWlCLEVBQ2pCLE9BQWtCLEVBQ2xCLE1BQWlCLEVBQ2pCLEtBQWM7UUFFZCxNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFFBQVEsRUFBRSxPQUFPLElBQUksRUFBRTtZQUN2QixNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUU7WUFDcEIsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1NBQ25CLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQVEsTUFBTSxJQUFBLHdCQUFhLEVBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDNUIsYUFBYSxFQUNiLE9BQU8sRUFDUCxRQUFRLENBQ1QsQ0FBQztRQUVGLE9BQU87WUFDTCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxLQUFLO1lBQ2xDLFlBQVksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3pELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsU0FBaUIsRUFDakIsT0FBa0IsRUFDbEIsS0FBYyxFQUNkLEtBQWM7UUFFZCxNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFFBQVEsRUFBRSxPQUFPLElBQUksRUFBRTtZQUN2QixLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbEIsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFO1NBQ25CLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQVEsTUFBTSxJQUFBLHdCQUFhLEVBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDNUIsYUFBYSxFQUNiLE9BQU8sRUFDUCxRQUFRLENBQ1QsQ0FBQztRQUVGLE9BQU87WUFDTCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxLQUFLO1lBQ2xDLFlBQVksRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3pELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUU7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQ1YsTUFBb0IsRUFDcEIsUUFBdUM7UUFFdkMsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDNUIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQztZQUNqQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsS0FBSyxLQUFLO1lBQzFDLFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVyxLQUFLLEtBQUs7WUFDMUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRTtZQUNwQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFO1lBQ3BDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksS0FBSztTQUNsRCxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9DLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRS9FLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxLQUE4QixDQUFDO29CQUNuQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxHQUFHOzRCQUNOLGFBQWEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxjQUFjLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQzs0QkFDakUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDOzRCQUNqRSxZQUFZLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7NEJBQy9ELFVBQVUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQzt5QkFDNUQsQ0FBQztvQkFDSixDQUFDO29CQUVELE1BQU0sS0FBSyxHQUFnQjt3QkFDekIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ3RDLE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLEtBQUs7d0JBQ25DLEtBQUs7cUJBQ04sQ0FBQztvQkFFRixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7Z0JBRUQsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FDZixTQUFpQixFQUNqQixNQUFpQixFQUNqQixRQUFnQixDQUFDLEVBQ2pCLFFBQThDO1FBRTlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUVBQW1FLENBQUMsQ0FBQztRQUVsRixNQUFNLE9BQU8sR0FBRztZQUNkLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRTtZQUNwQixLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTtTQUN4QixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRS9DLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBbUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXBGLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsUUFBUSxDQUFDO3dCQUNQLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFOzRCQUNkLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUU7NEJBQ3RCLFVBQVUsRUFBRSxJQUFBLG1DQUFzQixFQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO3lCQUN2RCxDQUFDLENBQUM7d0JBQ0gsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksS0FBSztxQkFDcEMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsU0FBaUIsRUFDakIsTUFBaUIsRUFDakIsUUFBZ0IsQ0FBQyxFQUNqQixRQUE4QztRQUU5QyxPQUFPLENBQUMsSUFBSSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFFbEYsTUFBTSxPQUFPLEdBQUc7WUFDZCxVQUFVLEVBQUUsU0FBUztZQUNyQixNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUU7WUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7U0FDeEIsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUvQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQW1CLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUVwRixNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLFFBQVEsQ0FBQzt3QkFDUCxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRTs0QkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFOzRCQUNwQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFOzRCQUNoQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLFVBQVUsSUFBSSxFQUFFOzRCQUM1QixVQUFVLEVBQUUsSUFBQSxtQ0FBc0IsRUFBQyxDQUFDLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQzt5QkFDdkQsQ0FBQyxDQUFDO3dCQUNILE9BQU8sRUFBRSxRQUFRLENBQUMsUUFBUSxJQUFJLEtBQUs7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXBSRCxrQ0FvUkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGEgc2VydmljZSBoYW5kbGVzIG5vZGUgYW5kIGVkZ2UgaW5zZXJ0L2RlbGV0ZS9leHBvcnQgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gJy4vc2VydmljZS1jb250ZXh0JztcbmltcG9ydCB7XG4gIEluc2VydE5vZGVzUmVzdWx0LFxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcbiAgRGVsZXRlUmVzdWx0LFxuICBFeHBvcnROb2Rlc1Jlc3VsdCxcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXG4gIEV4cG9ydENvbmZpZyxcbiAgRXhwb3J0Q2h1bmssXG4gIEV4cG9ydFN0YXRzLFxufSBmcm9tICcuLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBOb2RlRGF0YSwgRWRnZURhdGEgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBwcm9taXNpZnlDYWxsIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgbm9kZURhdGFUb1Byb3RvLCBlZGdlRGF0YVRvUHJvdG8sIGNvbnZlcnRQcm90b1Byb3BlcnRpZXMgfSBmcm9tICcuL2NvbnZlcnRlcnMnO1xuaW1wb3J0IHsgSW5zZXJ0Tm9kZXNDb25maWcsIEluc2VydEVkZ2VzQ29uZmlnIH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBEYXRhIHNlcnZpY2UgZm9yIGluc2VydGluZywgZGVsZXRpbmcsIGFuZCBleHBvcnRpbmcgZ3JhcGggZGF0YS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjdHg6IFNlcnZpY2VDb250ZXh0KSB7fVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD4ge1xuICAgIGNvbnN0IHJlcXVlc3Q6IGFueSA9IHtcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcbiAgICAgIG5vZGVzOiBub2Rlcy5tYXAoKG4pID0+IG5vZGVEYXRhVG9Qcm90byhuKSksXG4gICAgfTtcblxuICAgIC8vIEFMV0FZUyBzZXQgb3B0aW9ucyAoZXZlbiB3aGVuIHVuZGVmaW5lZCkgdG8gYXZvaWQgZGVwcmVjYXRlZCBidWxrIG9wZXJhdGlvbnMgZXJyb3JcbiAgICByZXF1ZXN0Lm9wdGlvbnMgPSB7IG92ZXJ3cml0ZTogY29uZmlnPy5vcHRpb25zPy5vdmVyd3JpdGUgfHwgZmFsc2UgfTtcblxuICAgIGlmIChjb25maWc/LmJ1bGtJbXBvcnRTZXNzaW9uSWQpIHtcbiAgICAgIHJlcXVlc3QuYnVsa19pbXBvcnRfc2Vzc2lvbl9pZCA9IGNvbmZpZy5idWxrSW1wb3J0U2Vzc2lvbklkO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmRhdGFTZXJ2aWNlLFxuICAgICAgJ0luc2VydE5vZGVzJyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogcmVzcG9uc2Uuc3VjY2VzcyB8fCBmYWxzZSxcbiAgICAgIG5vZGVJZHM6IHJlc3BvbnNlLm5vZGVfaWRzIHx8IFtdLFxuICAgICAgbm9kZUNvdW50OiBwYXJzZUludChyZXNwb25zZS5ub2RlX2NvdW50IHx8ICcwJywgMTApLFxuICAgICAgbWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSB8fCAnJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGguXG4gICAqL1xuICBhc3luYyBpbnNlcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PiB7XG4gICAgY29uc3QgcmVxdWVzdDogYW55ID0ge1xuICAgICAgZ3JhcGhfbmFtZTogZ3JhcGhOYW1lLFxuICAgICAgZWRnZXM6IGVkZ2VzLm1hcCgoZSkgPT4gZWRnZURhdGFUb1Byb3RvKGUpKSxcbiAgICB9O1xuXG4gICAgLy8gQUxXQVlTIHNldCBvcHRpb25zIChldmVuIHdoZW4gdW5kZWZpbmVkKSB0byBhdm9pZCBkZXByZWNhdGVkIGJ1bGsgb3BlcmF0aW9ucyBlcnJvclxuICAgIHJlcXVlc3Qub3B0aW9ucyA9IHtcbiAgICAgIHNraXBfaW52YWxpZF9ub2RlczogY29uZmlnPy5vcHRpb25zPy5za2lwSW52YWxpZE5vZGVzIHx8IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnPy5idWxrSW1wb3J0U2Vzc2lvbklkKSB7XG4gICAgICByZXF1ZXN0LmJ1bGtfaW1wb3J0X3Nlc3Npb25faWQgPSBjb25maWcuYnVsa0ltcG9ydFNlc3Npb25JZDtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY3R4LmdldFNlc3Npb25NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCBwcm9taXNpZnlDYWxsKFxuICAgICAgdGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSxcbiAgICAgICdJbnNlcnRFZGdlcycsXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlLnN1Y2Nlc3MgfHwgZmFsc2UsXG4gICAgICBlZGdlSWRzOiByZXNwb25zZS5lZGdlX2lkcyB8fCBbXSxcbiAgICAgIGVkZ2VDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZWRnZV9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLm1lc3NhZ2UgfHwgJycsXG4gICAgICBza2lwcGVkQ291bnQ6IHBhcnNlSW50KHJlc3BvbnNlLnNraXBwZWRfY291bnQgfHwgJzAnLCAxMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbm9kZXMgZnJvbSBhIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcbiAgICAgIG5vZGVfaWRzOiBub2RlSWRzIHx8IFtdLFxuICAgICAgbGFiZWxzOiBsYWJlbHMgfHwgW10sXG4gICAgICB3aGVyZTogd2hlcmUgfHwgJycsXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG4gICAgY29uc3QgcmVzcG9uc2U6IGFueSA9IGF3YWl0IHByb21pc2lmeUNhbGwoXG4gICAgICB0aGlzLmN0eC5jbGllbnRzLmRhdGFTZXJ2aWNlLFxuICAgICAgJ0RlbGV0ZU5vZGVzJyxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBtZXRhZGF0YVxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogcmVzcG9uc2Uuc3VjY2VzcyB8fCBmYWxzZSxcbiAgICAgIGRlbGV0ZWRDb3VudDogcGFyc2VJbnQocmVzcG9uc2UuZGVsZXRlZF9jb3VudCB8fCAnMCcsIDEwKSxcbiAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLm1lc3NhZ2UgfHwgJycsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZWRnZXMgZnJvbSBhIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcbiAgICAgIGVkZ2VfaWRzOiBlZGdlSWRzIHx8IFtdLFxuICAgICAgbGFiZWw6IGxhYmVsIHx8ICcnLFxuICAgICAgd2hlcmU6IHdoZXJlIHx8ICcnLFxuICAgIH07XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY3R4LmdldFNlc3Npb25NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBhd2FpdCBwcm9taXNpZnlDYWxsKFxuICAgICAgdGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSxcbiAgICAgICdEZWxldGVFZGdlcycsXG4gICAgICByZXF1ZXN0LFxuICAgICAgbWV0YWRhdGFcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlLnN1Y2Nlc3MgfHwgZmFsc2UsXG4gICAgICBkZWxldGVkQ291bnQ6IHBhcnNlSW50KHJlc3BvbnNlLmRlbGV0ZWRfY291bnQgfHwgJzAnLCAxMCksXG4gICAgICBtZXNzYWdlOiByZXNwb25zZS5tZXNzYWdlIHx8ICcnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGdyYXBoIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKHN0cmVhbWluZykuXG4gICAqL1xuICBhc3luYyBleHBvcnQoXG4gICAgY29uZmlnOiBFeHBvcnRDb25maWcsXG4gICAgY2FsbGJhY2s/OiAoY2h1bms6IEV4cG9ydENodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBncmFwaF9uYW1lOiBjb25maWcuZ3JhcGhOYW1lLFxuICAgICAgYmF0Y2hfc2l6ZTogY29uZmlnLmJhdGNoU2l6ZSB8fCAwLFxuICAgICAgZXhwb3J0X25vZGVzOiBjb25maWcuZXhwb3J0Tm9kZXMgIT09IGZhbHNlLFxuICAgICAgZXhwb3J0X2VkZ2VzOiBjb25maWcuZXhwb3J0RWRnZXMgIT09IGZhbHNlLFxuICAgICAgbm9kZV9sYWJlbHM6IGNvbmZpZy5ub2RlTGFiZWxzIHx8IFtdLFxuICAgICAgZWRnZV9sYWJlbHM6IGNvbmZpZy5lZGdlTGFiZWxzIHx8IFtdLFxuICAgICAgaW5jbHVkZV9tZXRhZGF0YTogY29uZmlnLmluY2x1ZGVNZXRhZGF0YSB8fCBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmN0eC5nZXRTZXNzaW9uTWV0YWRhdGEoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdHJlYW0gPSAodGhpcy5jdHguY2xpZW50cy5kYXRhU2VydmljZSBhcyBhbnkpLkV4cG9ydChyZXF1ZXN0LCBtZXRhZGF0YSk7XG5cbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCBzdGF0czogRXhwb3J0U3RhdHMgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXRzKSB7XG4gICAgICAgICAgICBzdGF0cyA9IHtcbiAgICAgICAgICAgICAgbm9kZXNFeHBvcnRlZDogcGFyc2VJbnQocmVzcG9uc2Uuc3RhdHMubm9kZXNfZXhwb3J0ZWQgfHwgJzAnLCAxMCksXG4gICAgICAgICAgICAgIGVkZ2VzRXhwb3J0ZWQ6IHBhcnNlSW50KHJlc3BvbnNlLnN0YXRzLmVkZ2VzX2V4cG9ydGVkIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgICBieXRlc1dyaXR0ZW46IHBhcnNlSW50KHJlc3BvbnNlLnN0YXRzLmJ5dGVzX3dyaXR0ZW4gfHwgJzAnLCAxMCksXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IHBhcnNlSW50KHJlc3BvbnNlLnN0YXRzLmR1cmF0aW9uX21zIHx8ICcwJywgMTApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjaHVuazogRXhwb3J0Q2h1bmsgPSB7XG4gICAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShyZXNwb25zZS5kYXRhIHx8IFtdKSxcbiAgICAgICAgICAgIGlzRmluYWw6IHJlc3BvbnNlLmlzX2ZpbmFsIHx8IGZhbHNlLFxuICAgICAgICAgICAgc3RhdHMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNhbGxiYWNrKGNodW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5pc19maW5hbCkge1xuICAgICAgICAgIHN0cmVhbS5jYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICAgIHN0cmVhbS5vbignZXJyb3InLCAoZXJyb3I6IGFueSkgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaC5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0Tm9kZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS53YXJuKCdleHBvcnROb2RlcyBpcyBkZXByZWNhdGVkLCB1c2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZCcpO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIGdyYXBoX25hbWU6IGdyYXBoTmFtZSxcbiAgICAgIGxhYmVsczogbGFiZWxzIHx8IFtdLFxuICAgICAgbGltaXQ6IGxpbWl0LnRvU3RyaW5nKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5jdHguZ2V0U2Vzc2lvbk1ldGFkYXRhKCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RyZWFtID0gKHRoaXMuY3R4LmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5FeHBvcnROb2RlcyhyZXF1ZXN0LCBtZXRhZGF0YSk7XG5cbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgICAgIG5vZGVzOiAocmVzcG9uc2Uubm9kZXMgfHwgW10pLm1hcCgobjogYW55KSA9PiAoe1xuICAgICAgICAgICAgICBpZDogbi5pZCB8fCAnJyxcbiAgICAgICAgICAgICAgbGFiZWxzOiBuLmxhYmVscyB8fCBbXSxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogY29udmVydFByb3RvUHJvcGVydGllcyhuLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgaGFzTW9yZTogcmVzcG9uc2UuaGFzX21vcmUgfHwgZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGguXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydEVkZ2VzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnNvbGUud2FybignZXhwb3J0RWRnZXMgaXMgZGVwcmVjYXRlZCwgdXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWQnKTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBncmFwaF9uYW1lOiBncmFwaE5hbWUsXG4gICAgICBsYWJlbHM6IGxhYmVscyB8fCBbXSxcbiAgICAgIGxpbWl0OiBsaW1pdC50b1N0cmluZygpLFxuICAgIH07XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuY3R4LmdldFNlc3Npb25NZXRhZGF0YSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9ICh0aGlzLmN0eC5jbGllbnRzLmRhdGFTZXJ2aWNlIGFzIGFueSkuRXhwb3J0RWRnZXMocmVxdWVzdCwgbWV0YWRhdGEpO1xuXG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgICBlZGdlczogKHJlc3BvbnNlLmVkZ2VzIHx8IFtdKS5tYXAoKGU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgaWQ6IGUuaWQgfHwgJycsXG4gICAgICAgICAgICAgIGxhYmVsOiBlLmxhYmVsIHx8ICcnLFxuICAgICAgICAgICAgICBmcm9tTm9kZUlkOiBlLmZyb21fbm9kZV9pZCB8fCAnJyxcbiAgICAgICAgICAgICAgdG9Ob2RlSWQ6IGUudG9fbm9kZV9pZCB8fCAnJyxcbiAgICAgICAgICAgICAgcHJvcGVydGllczogY29udmVydFByb3RvUHJvcGVydGllcyhlLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgaGFzTW9yZTogcmVzcG9uc2UuaGFzX21vcmUgfHwgZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSk7XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycm9yOiBhbnkpID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Graph service handles graph management operations.
3
+ */
4
+ import { ServiceContext } from './service-context';
5
+ import { GraphInfo, GraphType } from '../types';
6
+ /**
7
+ * Graph service for managing graphs.
8
+ */
9
+ export declare class GraphService {
10
+ private ctx;
11
+ constructor(ctx: ServiceContext);
12
+ /**
13
+ * Create a new graph.
14
+ */
15
+ createGraph(name: string, graphType?: GraphType, description?: string): Promise<void>;
16
+ /**
17
+ * Delete a graph.
18
+ */
19
+ dropGraph(name: string, ifExists?: boolean): Promise<void>;
20
+ /**
21
+ * Set the current graph for the session.
22
+ */
23
+ useGraph(name: string): Promise<void>;
24
+ /**
25
+ * Return all available graphs.
26
+ */
27
+ listGraphs(): Promise<GraphInfo[]>;
28
+ /**
29
+ * Return information about a specific graph.
30
+ */
31
+ getGraphInfo(name: string): Promise<GraphInfo>;
32
+ }