@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.20
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/dist/cjs/commands/add-column-command.js +192 -0
- package/dist/cjs/commands/basemap-command.js +80 -0
- package/dist/cjs/commands/boundary-command.js +81 -0
- package/dist/cjs/commands/command-wrappers.js +122 -0
- package/dist/cjs/commands/dataset-context-command.js +87 -0
- package/dist/cjs/commands/index.js +230 -0
- package/dist/cjs/commands/layer-creation-command.js +534 -0
- package/dist/cjs/commands/layer-style-command.js +136 -0
- package/dist/cjs/commands/load-data-command.js +270 -0
- package/dist/cjs/commands/save-data-command.js +118 -0
- package/dist/cjs/commands/split-view-command.js +261 -0
- package/dist/cjs/commands/table-command.js +199 -0
- package/dist/cjs/commands/time-filter-command.js +289 -0
- package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
- package/dist/cjs/commands/types.js +6 -0
- package/dist/cjs/commands/utils.js +536 -0
- package/dist/cjs/commands/view-mode-command.js +94 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/map-contract.js +6 -0
- package/dist/cjs/server/bridge-server.js +435 -0
- package/dist/cjs/server/index.js +31 -0
- package/dist/cjs/server/stdio.js +201 -0
- package/dist/cjs/types.js +30 -0
- package/dist/commands/add-column-command.d.ts +4 -0
- package/dist/commands/basemap-command.d.ts +4 -0
- package/dist/commands/boundary-command.d.ts +4 -0
- package/dist/commands/command-wrappers.d.ts +52 -0
- package/dist/commands/dataset-context-command.d.ts +4 -0
- package/dist/commands/index.d.ts +31 -0
- package/dist/commands/layer-creation-command.d.ts +8 -0
- package/dist/commands/layer-style-command.d.ts +4 -0
- package/dist/commands/load-data-command.d.ts +4 -0
- package/dist/commands/save-data-command.d.ts +4 -0
- package/dist/commands/split-view-command.d.ts +4 -0
- package/dist/commands/table-command.d.ts +4 -0
- package/dist/commands/time-filter-command.d.ts +13 -0
- package/dist/commands/toggle-time-filter-command.d.ts +4 -0
- package/dist/commands/types.d.ts +132 -0
- package/dist/commands/utils.d.ts +138 -0
- package/dist/commands/view-mode-command.d.ts +4 -0
- package/dist/esm/commands/add-column-command.js +185 -0
- package/dist/esm/commands/basemap-command.js +72 -0
- package/dist/esm/commands/boundary-command.js +73 -0
- package/dist/esm/commands/command-wrappers.js +114 -0
- package/dist/esm/commands/dataset-context-command.js +79 -0
- package/dist/esm/commands/index.js +51 -0
- package/dist/esm/commands/layer-creation-command.js +527 -0
- package/dist/esm/commands/layer-style-command.js +130 -0
- package/dist/esm/commands/load-data-command.js +264 -0
- package/dist/esm/commands/save-data-command.js +112 -0
- package/dist/esm/commands/split-view-command.js +255 -0
- package/dist/esm/commands/table-command.js +194 -0
- package/dist/esm/commands/time-filter-command.js +280 -0
- package/dist/esm/commands/toggle-time-filter-command.js +147 -0
- package/dist/esm/commands/types.js +3 -0
- package/dist/esm/commands/utils.js +521 -0
- package/dist/esm/commands/view-mode-command.js +86 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/map-contract.js +3 -0
- package/dist/esm/server/bridge-server.js +428 -0
- package/dist/esm/server/index.js +13 -0
- package/dist/esm/server/stdio.js +198 -0
- package/dist/esm/types.js +24 -0
- package/dist/index.d.ts +15 -0
- package/dist/map-contract.d.ts +31 -0
- package/dist/server/bridge-server.d.ts +53 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/stdio.d.ts +2 -0
- package/dist/types.d.ts +24 -0
- package/package.json +84 -4
- package/skill/kepler/SKILL.md +438 -0
- package/skill/kepler/skill.yaml +4 -0
- package/README.md +0 -3
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.KeplerMcpBridge = void 0;
|
|
8
|
+
exports.formatResult = formatResult;
|
|
9
|
+
exports.getMapTools = getMapTools;
|
|
10
|
+
exports.toToolName = toToolName;
|
|
11
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
14
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
15
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
18
|
+
var _nodeCrypto = require("node:crypto");
|
|
19
|
+
var _nodeHttp = require("node:http");
|
|
20
|
+
var _ws = require("ws");
|
|
21
|
+
var _zod = require("zod");
|
|
22
|
+
var _commands = require("../commands");
|
|
23
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
24
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
25
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
|
|
26
|
+
// Copyright contributors to the kepler.gl project
|
|
27
|
+
/**
|
|
28
|
+
* The bridge between an MCP client and a kepler.gl page.
|
|
29
|
+
*
|
|
30
|
+
* Browsers cannot listen on a port, so the page is a WebSocket CLIENT that
|
|
31
|
+
* connects OUT to `ws://127.0.0.1:<port>/ws?token=...` (the reverse-connect
|
|
32
|
+
* pattern). This server holds that socket, advertises the `map.*` tools to the
|
|
33
|
+
* MCP client, and forwards each call to the page, where the command registry
|
|
34
|
+
* executes against the live map.
|
|
35
|
+
*
|
|
36
|
+
* The tool list comes from the package itself (`getKeplerCommands`), so tools
|
|
37
|
+
* exist before a page connects; a call without a page returns a clear error.
|
|
38
|
+
* Once a page says `hello` its own catalog replaces the static one, because a
|
|
39
|
+
* page may not serve every command (the demo app omits the DuckDB-backed ones).
|
|
40
|
+
*/
|
|
41
|
+
var DEFAULT_PORT = 8765;
|
|
42
|
+
var DEFAULT_HOST = '127.0.0.1';
|
|
43
|
+
var DEFAULT_CALL_TIMEOUT_MS = 60000;
|
|
44
|
+
/** MCP tool names are commonly restricted to [A-Za-z0-9_-]; `map.add-layer` → `map_add_layer`. */
|
|
45
|
+
function toToolName(commandId) {
|
|
46
|
+
return commandId.replace(/\./g, '_');
|
|
47
|
+
}
|
|
48
|
+
function toInputSchema(command) {
|
|
49
|
+
if (command.inputSchema) {
|
|
50
|
+
try {
|
|
51
|
+
var schema = _zod.z.toJSONSchema(command.inputSchema);
|
|
52
|
+
if (schema) return schema;
|
|
53
|
+
} catch (_unused) {
|
|
54
|
+
// Not every command ships a zod schema; fall back to a free-form object.
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
type: 'object'
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The map surface as declared by this package, independent of any page. */
|
|
63
|
+
function getMapTools() {
|
|
64
|
+
var commands = (0, _commands.getKeplerCommands)({});
|
|
65
|
+
return Object.values(commands).map(function (command) {
|
|
66
|
+
return {
|
|
67
|
+
name: toToolName(command.id),
|
|
68
|
+
commandId: command.id,
|
|
69
|
+
description: command.description || command.name,
|
|
70
|
+
inputSchema: toInputSchema(command)
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function toolsFromDescriptors(descriptors) {
|
|
75
|
+
return descriptors.filter(function (descriptor) {
|
|
76
|
+
return descriptor && descriptor.id;
|
|
77
|
+
}).map(function (descriptor) {
|
|
78
|
+
return {
|
|
79
|
+
name: toToolName(descriptor.id),
|
|
80
|
+
commandId: descriptor.id,
|
|
81
|
+
description: descriptor.description || descriptor.name || descriptor.id,
|
|
82
|
+
inputSchema: descriptor.inputSchema || {
|
|
83
|
+
type: 'object'
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** RoomCommandResult → the text an MCP client shows for a tool call. */
|
|
90
|
+
function formatResult(result) {
|
|
91
|
+
var _ref, _result$data;
|
|
92
|
+
if (result && (0, _typeof2["default"])(result) === 'object' && result.success === false) {
|
|
93
|
+
var _result$error;
|
|
94
|
+
return {
|
|
95
|
+
text: "\u2717 ".concat(result.commandId, ": ").concat((_result$error = result.error) !== null && _result$error !== void 0 ? _result$error : 'failed'),
|
|
96
|
+
isError: true
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (result && (0, _typeof2["default"])(result) === 'object' && result.error) {
|
|
100
|
+
return {
|
|
101
|
+
text: "\u2717 ".concat(result.commandId, ": ").concat(result.error),
|
|
102
|
+
isError: true
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
var data = result === null || result === void 0 ? void 0 : result.data;
|
|
106
|
+
if (data && typeof data.details === 'string') return {
|
|
107
|
+
text: data.details,
|
|
108
|
+
isError: false
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
text: JSON.stringify((_ref = (_result$data = result === null || result === void 0 ? void 0 : result.data) !== null && _result$data !== void 0 ? _result$data : result) !== null && _ref !== void 0 ? _ref : null, null, 2),
|
|
112
|
+
isError: false
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
var KeplerMcpBridge = exports.KeplerMcpBridge = /*#__PURE__*/function () {
|
|
116
|
+
function KeplerMcpBridge() {
|
|
117
|
+
var _options$port, _options$host, _options$mapUrl, _options$callTimeoutM;
|
|
118
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
119
|
+
(0, _classCallCheck2["default"])(this, KeplerMcpBridge);
|
|
120
|
+
(0, _defineProperty2["default"])(this, "options", void 0);
|
|
121
|
+
(0, _defineProperty2["default"])(this, "staticTools", void 0);
|
|
122
|
+
(0, _defineProperty2["default"])(this, "pageTools", null);
|
|
123
|
+
(0, _defineProperty2["default"])(this, "socket", null);
|
|
124
|
+
(0, _defineProperty2["default"])(this, "wss", null);
|
|
125
|
+
(0, _defineProperty2["default"])(this, "httpServer", null);
|
|
126
|
+
(0, _defineProperty2["default"])(this, "pending", new Map());
|
|
127
|
+
(0, _defineProperty2["default"])(this, "token", '');
|
|
128
|
+
(0, _defineProperty2["default"])(this, "pageUrl", '');
|
|
129
|
+
this.options = {
|
|
130
|
+
port: (_options$port = options.port) !== null && _options$port !== void 0 ? _options$port : DEFAULT_PORT,
|
|
131
|
+
host: (_options$host = options.host) !== null && _options$host !== void 0 ? _options$host : DEFAULT_HOST,
|
|
132
|
+
mapUrl: (_options$mapUrl = options.mapUrl) !== null && _options$mapUrl !== void 0 ? _options$mapUrl : 'http://localhost:8080',
|
|
133
|
+
callTimeoutMs: (_options$callTimeoutM = options.callTimeoutMs) !== null && _options$callTimeoutM !== void 0 ? _options$callTimeoutM : DEFAULT_CALL_TIMEOUT_MS
|
|
134
|
+
};
|
|
135
|
+
this.staticTools = getMapTools();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Tools the MCP client can call right now. */
|
|
139
|
+
return (0, _createClass2["default"])(KeplerMcpBridge, [{
|
|
140
|
+
key: "getTools",
|
|
141
|
+
value: function getTools() {
|
|
142
|
+
var _this$pageTools;
|
|
143
|
+
return (_this$pageTools = this.pageTools) !== null && _this$pageTools !== void 0 ? _this$pageTools : this.staticTools;
|
|
144
|
+
}
|
|
145
|
+
}, {
|
|
146
|
+
key: "connected",
|
|
147
|
+
get: function get() {
|
|
148
|
+
var _this$socket;
|
|
149
|
+
return ((_this$socket = this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.readyState) === _ws.WebSocket.OPEN;
|
|
150
|
+
}
|
|
151
|
+
}, {
|
|
152
|
+
key: "start",
|
|
153
|
+
value: function () {
|
|
154
|
+
var _start = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
155
|
+
var _this = this;
|
|
156
|
+
var httpServer, wss, address, port, mapUrl;
|
|
157
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
158
|
+
while (1) switch (_context.prev = _context.next) {
|
|
159
|
+
case 0:
|
|
160
|
+
if (!this.wss) {
|
|
161
|
+
_context.next = 2;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
throw new Error('The kepler.gl bridge is already running.');
|
|
165
|
+
case 2:
|
|
166
|
+
this.token = (0, _nodeCrypto.randomUUID)().replace(/-/g, '');
|
|
167
|
+
|
|
168
|
+
// A plain HTTP GET on `/` redirects to the map page carrying the token, so
|
|
169
|
+
// the user can open `http://127.0.0.1:<port>/` even when the MCP client
|
|
170
|
+
// never shows the server's stderr. Only `/ws` upgrades to a WebSocket.
|
|
171
|
+
httpServer = (0, _nodeHttp.createServer)(function (request, response) {
|
|
172
|
+
var _request$url;
|
|
173
|
+
if (request.url === '/' || (_request$url = request.url) !== null && _request$url !== void 0 && _request$url.startsWith('/?')) {
|
|
174
|
+
response.writeHead(302, {
|
|
175
|
+
Location: _this.pageUrl
|
|
176
|
+
});
|
|
177
|
+
response.end();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
response.writeHead(404, {
|
|
181
|
+
'content-type': 'text/plain'
|
|
182
|
+
});
|
|
183
|
+
response.end('kepler-mcp: the map page connects at /ws');
|
|
184
|
+
});
|
|
185
|
+
this.httpServer = httpServer;
|
|
186
|
+
wss = new _ws.WebSocketServer({
|
|
187
|
+
server: httpServer,
|
|
188
|
+
path: '/ws'
|
|
189
|
+
});
|
|
190
|
+
this.wss = wss;
|
|
191
|
+
wss.on('connection', function (socket, request) {
|
|
192
|
+
return _this.handleConnection(socket, request.url);
|
|
193
|
+
});
|
|
194
|
+
_context.next = 10;
|
|
195
|
+
return new Promise(function (resolve, reject) {
|
|
196
|
+
httpServer.once('error', reject);
|
|
197
|
+
httpServer.listen(_this.options.port, _this.options.host, function () {
|
|
198
|
+
return resolve();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
case 10:
|
|
202
|
+
address = httpServer.address();
|
|
203
|
+
port = (0, _typeof2["default"])(address) === 'object' && address ? address.port : this.options.port;
|
|
204
|
+
mapUrl = this.options.mapUrl.replace(/\/$/, '');
|
|
205
|
+
this.pageUrl = "".concat(mapUrl).concat(mapUrl.includes('?') ? '&' : '?', "mcp=").concat(encodeURIComponent(this.token));
|
|
206
|
+
return _context.abrupt("return", {
|
|
207
|
+
host: this.options.host,
|
|
208
|
+
port: port,
|
|
209
|
+
token: this.token,
|
|
210
|
+
pageUrl: this.pageUrl
|
|
211
|
+
});
|
|
212
|
+
case 15:
|
|
213
|
+
case "end":
|
|
214
|
+
return _context.stop();
|
|
215
|
+
}
|
|
216
|
+
}, _callee, this);
|
|
217
|
+
}));
|
|
218
|
+
function start() {
|
|
219
|
+
return _start.apply(this, arguments);
|
|
220
|
+
}
|
|
221
|
+
return start;
|
|
222
|
+
}()
|
|
223
|
+
}, {
|
|
224
|
+
key: "callTool",
|
|
225
|
+
value: function () {
|
|
226
|
+
var _callTool = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(name) {
|
|
227
|
+
var _this$getTools$find,
|
|
228
|
+
_this2 = this;
|
|
229
|
+
var input,
|
|
230
|
+
tool,
|
|
231
|
+
socket,
|
|
232
|
+
callId,
|
|
233
|
+
reply,
|
|
234
|
+
_args2 = arguments;
|
|
235
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
236
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
237
|
+
case 0:
|
|
238
|
+
input = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
|
|
239
|
+
tool = (_this$getTools$find = this.getTools().find(function (candidate) {
|
|
240
|
+
return candidate.name === name;
|
|
241
|
+
})) !== null && _this$getTools$find !== void 0 ? _this$getTools$find : this.staticTools.find(function (candidate) {
|
|
242
|
+
return candidate.name === name;
|
|
243
|
+
});
|
|
244
|
+
if (tool) {
|
|
245
|
+
_context2.next = 4;
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
throw new Error("Unknown map tool \"".concat(name, "\". Available: ").concat(this.getTools().map(function (candidate) {
|
|
249
|
+
return candidate.name;
|
|
250
|
+
}).join(', '), "."));
|
|
251
|
+
case 4:
|
|
252
|
+
socket = this.socket;
|
|
253
|
+
if (!(!socket || socket.readyState !== _ws.WebSocket.OPEN)) {
|
|
254
|
+
_context2.next = 7;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
throw new Error('No kepler.gl map page is connected. Open the page URL printed at startup ' + '(it carries ?mcp=<token>), then call the tool again.');
|
|
258
|
+
case 7:
|
|
259
|
+
callId = (0, _nodeCrypto.randomUUID)();
|
|
260
|
+
reply = new Promise(function (resolve, reject) {
|
|
261
|
+
var timer = setTimeout(function () {
|
|
262
|
+
_this2.pending["delete"](callId);
|
|
263
|
+
reject(new Error("Timed out after ".concat(_this2.options.callTimeoutMs, " ms waiting for the map page.")));
|
|
264
|
+
}, _this2.options.callTimeoutMs);
|
|
265
|
+
_this2.pending.set(callId, {
|
|
266
|
+
resolve: resolve,
|
|
267
|
+
reject: reject,
|
|
268
|
+
timer: timer
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
socket.send(JSON.stringify({
|
|
272
|
+
type: 'call',
|
|
273
|
+
callId: callId,
|
|
274
|
+
tool: tool.commandId,
|
|
275
|
+
input: input
|
|
276
|
+
}));
|
|
277
|
+
return _context2.abrupt("return", reply);
|
|
278
|
+
case 11:
|
|
279
|
+
case "end":
|
|
280
|
+
return _context2.stop();
|
|
281
|
+
}
|
|
282
|
+
}, _callee2, this);
|
|
283
|
+
}));
|
|
284
|
+
function callTool(_x) {
|
|
285
|
+
return _callTool.apply(this, arguments);
|
|
286
|
+
}
|
|
287
|
+
return callTool;
|
|
288
|
+
}()
|
|
289
|
+
}, {
|
|
290
|
+
key: "close",
|
|
291
|
+
value: function () {
|
|
292
|
+
var _close = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
293
|
+
var _this$socket2;
|
|
294
|
+
var wss, httpServer, _iterator, _step, client;
|
|
295
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
296
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
297
|
+
case 0:
|
|
298
|
+
this.rejectPending('The bridge was closed.');
|
|
299
|
+
this.pageTools = null;
|
|
300
|
+
(_this$socket2 = this.socket) === null || _this$socket2 === void 0 || _this$socket2.close(1000, 'bridge closed');
|
|
301
|
+
this.socket = null;
|
|
302
|
+
wss = this.wss;
|
|
303
|
+
httpServer = this.httpServer;
|
|
304
|
+
this.wss = null;
|
|
305
|
+
this.httpServer = null;
|
|
306
|
+
if (wss) {
|
|
307
|
+
_context3.next = 10;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
return _context3.abrupt("return");
|
|
311
|
+
case 10:
|
|
312
|
+
// close() only stops listening and waits for clients; terminate them so
|
|
313
|
+
// shutdown (and tests) do not hang on a page that never closes its socket.
|
|
314
|
+
_iterator = _createForOfIteratorHelper(wss.clients);
|
|
315
|
+
try {
|
|
316
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
317
|
+
client = _step.value;
|
|
318
|
+
client.terminate();
|
|
319
|
+
}
|
|
320
|
+
} catch (err) {
|
|
321
|
+
_iterator.e(err);
|
|
322
|
+
} finally {
|
|
323
|
+
_iterator.f();
|
|
324
|
+
}
|
|
325
|
+
_context3.next = 14;
|
|
326
|
+
return new Promise(function (resolve) {
|
|
327
|
+
return wss.close(function () {
|
|
328
|
+
return resolve();
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
case 14:
|
|
332
|
+
if (!httpServer) {
|
|
333
|
+
_context3.next = 17;
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
_context3.next = 17;
|
|
337
|
+
return new Promise(function (resolve) {
|
|
338
|
+
return httpServer.close(function () {
|
|
339
|
+
return resolve();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
case 17:
|
|
343
|
+
case "end":
|
|
344
|
+
return _context3.stop();
|
|
345
|
+
}
|
|
346
|
+
}, _callee3, this);
|
|
347
|
+
}));
|
|
348
|
+
function close() {
|
|
349
|
+
return _close.apply(this, arguments);
|
|
350
|
+
}
|
|
351
|
+
return close;
|
|
352
|
+
}()
|
|
353
|
+
}, {
|
|
354
|
+
key: "handleConnection",
|
|
355
|
+
value: function handleConnection(socket, requestUrl) {
|
|
356
|
+
var _this$socket3,
|
|
357
|
+
_this3 = this;
|
|
358
|
+
var token = null;
|
|
359
|
+
try {
|
|
360
|
+
token = new URL(requestUrl !== null && requestUrl !== void 0 ? requestUrl : '/ws', 'http://127.0.0.1').searchParams.get('token');
|
|
361
|
+
} catch (_unused2) {
|
|
362
|
+
token = null;
|
|
363
|
+
}
|
|
364
|
+
// The token is the only thing keeping other local pages/processes from
|
|
365
|
+
// driving the map; reject a mismatch before accepting any message.
|
|
366
|
+
if (token !== this.token) {
|
|
367
|
+
socket.close(1008, 'invalid token');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// One map page at a time: a second tab takes over so calls never race
|
|
372
|
+
// between two live maps.
|
|
373
|
+
(_this$socket3 = this.socket) === null || _this$socket3 === void 0 || _this$socket3.close(1000, 'replaced by a newer connection');
|
|
374
|
+
this.socket = socket;
|
|
375
|
+
this.pageTools = null;
|
|
376
|
+
socket.on('message', function (data) {
|
|
377
|
+
return _this3.handleMessage(data);
|
|
378
|
+
});
|
|
379
|
+
socket.on('close', function () {
|
|
380
|
+
if (_this3.socket === socket) {
|
|
381
|
+
_this3.socket = null;
|
|
382
|
+
_this3.pageTools = null;
|
|
383
|
+
_this3.rejectPending('The kepler.gl page disconnected.');
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
// Errors are followed by close; the close handler resets state.
|
|
387
|
+
socket.on('error', function () {
|
|
388
|
+
return undefined;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}, {
|
|
392
|
+
key: "handleMessage",
|
|
393
|
+
value: function handleMessage(raw) {
|
|
394
|
+
var _message, _message2;
|
|
395
|
+
var message;
|
|
396
|
+
try {
|
|
397
|
+
message = JSON.parse(String(raw));
|
|
398
|
+
} catch (_unused3) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (((_message = message) === null || _message === void 0 ? void 0 : _message.type) === 'hello' && Array.isArray(message.commands)) {
|
|
402
|
+
this.pageTools = toolsFromDescriptors(message.commands);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (((_message2 = message) === null || _message2 === void 0 ? void 0 : _message2.type) === 'result' && typeof message.callId === 'string') {
|
|
406
|
+
var pendingCall = this.pending.get(message.callId);
|
|
407
|
+
if (!pendingCall) return;
|
|
408
|
+
clearTimeout(pendingCall.timer);
|
|
409
|
+
this.pending["delete"](message.callId);
|
|
410
|
+
pendingCall.resolve(message.result);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}, {
|
|
414
|
+
key: "rejectPending",
|
|
415
|
+
value: function rejectPending(reason) {
|
|
416
|
+
var _iterator2 = _createForOfIteratorHelper(this.pending),
|
|
417
|
+
_step2;
|
|
418
|
+
try {
|
|
419
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
420
|
+
var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
|
|
421
|
+
callId = _step2$value[0],
|
|
422
|
+
pendingCall = _step2$value[1];
|
|
423
|
+
clearTimeout(pendingCall.timer);
|
|
424
|
+
this.pending["delete"](callId);
|
|
425
|
+
pendingCall.reject(new Error(reason));
|
|
426
|
+
}
|
|
427
|
+
} catch (err) {
|
|
428
|
+
_iterator2.e(err);
|
|
429
|
+
} finally {
|
|
430
|
+
_iterator2.f();
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}]);
|
|
434
|
+
}();
|
|
435
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZUNyeXB0byIsInJlcXVpcmUiLCJfbm9kZUh0dHAiLCJfd3MiLCJfem9kIiwiX2NvbW1hbmRzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX0hPU1QiLCJERUZBVUxUX0NBTExfVElNRU9VVF9NUyIsInRvVG9vbE5hbWUiLCJjb21tYW5kSWQiLCJyZXBsYWNlIiwidG9JbnB1dFNjaGVtYSIsImNvbW1hbmQiLCJpbnB1dFNjaGVtYSIsInNjaGVtYSIsInoiLCJ0b0pTT05TY2hlbWEiLCJfdW51c2VkIiwidHlwZSIsImdldE1hcFRvb2xzIiwiY29tbWFuZHMiLCJnZXRLZXBsZXJDb21tYW5kcyIsIk9iamVjdCIsInZhbHVlcyIsIm1hcCIsImlkIiwiZGVzY3JpcHRpb24iLCJ0b29sc0Zyb21EZXNjcmlwdG9ycyIsImRlc2NyaXB0b3JzIiwiZmlsdGVyIiwiZGVzY3JpcHRvciIsImZvcm1hdFJlc3VsdCIsInJlc3VsdCIsIl9yZWYiLCJfcmVzdWx0JGRhdGEiLCJfdHlwZW9mMiIsInN1Y2Nlc3MiLCJfcmVzdWx0JGVycm9yIiwidGV4dCIsImNvbmNhdCIsImVycm9yIiwiaXNFcnJvciIsImRhdGEiLCJkZXRhaWxzIiwiSlNPTiIsInN0cmluZ2lmeSIsIktlcGxlck1jcEJyaWRnZSIsImV4cG9ydHMiLCJfb3B0aW9ucyRwb3J0IiwiX29wdGlvbnMkaG9zdCIsIl9vcHRpb25zJG1hcFVybCIsIl9vcHRpb25zJGNhbGxUaW1lb3V0TSIsIm9wdGlvbnMiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsIk1hcCIsInBvcnQiLCJob3N0IiwibWFwVXJsIiwiY2FsbFRpbWVvdXRNcyIsInN0YXRpY1Rvb2xzIiwiX2NyZWF0ZUNsYXNzMiIsImtleSIsImdldFRvb2xzIiwiX3RoaXMkcGFnZVRvb2xzIiwicGFnZVRvb2xzIiwiZ2V0IiwiX3RoaXMkc29ja2V0Iiwic29ja2V0IiwicmVhZHlTdGF0ZSIsIldlYlNvY2tldCIsIk9QRU4iLCJfc3RhcnQiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl90aGlzIiwiaHR0cFNlcnZlciIsIndzcyIsImFkZHJlc3MiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJFcnJvciIsInRva2VuIiwicmFuZG9tVVVJRCIsImNyZWF0ZVNlcnZlciIsInJlcXVlc3QiLCJyZXNwb25zZSIsIl9yZXF1ZXN0JHVybCIsInVybCIsInN0YXJ0c1dpdGgiLCJ3cml0ZUhlYWQiLCJMb2NhdGlvbiIsInBhZ2VVcmwiLCJlbmQiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJzZXJ2ZXIiLCJwYXRoIiwib24iLCJoYW5kbGVDb25uZWN0aW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbmNlIiwibGlzdGVuIiwiaW5jbHVkZXMiLCJlbmNvZGVVUklDb21wb25lbnQiLCJhYnJ1cHQiLCJzdG9wIiwic3RhcnQiLCJhcHBseSIsIl9jYWxsVG9vbCIsIl9jYWxsZWUyIiwiX3RoaXMkZ2V0VG9vbHMkZmluZCIsIl90aGlzMiIsImlucHV0IiwidG9vbCIsImNhbGxJZCIsInJlcGx5IiwiX2FyZ3MyIiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiZmluZCIsImNhbmRpZGF0ZSIsImpvaW4iLCJ0aW1lciIsInNldFRpbWVvdXQiLCJwZW5kaW5nIiwic2V0Iiwic2VuZCIsImNhbGxUb29sIiwiX3giLCJfY2xvc2UiLCJfY2FsbGVlMyIsIl90aGlzJHNvY2tldDIiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImNsaWVudCIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsInJlamVjdFBlbmRpbmciLCJjbG9zZSIsImNsaWVudHMiLCJ0ZXJtaW5hdGUiLCJlcnIiLCJyZXF1ZXN0VXJsIiwiX3RoaXMkc29ja2V0MyIsIl90aGlzMyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIl91bnVzZWQyIiwiaGFuZGxlTWVzc2FnZSIsInJhdyIsIl9tZXNzYWdlIiwiX21lc3NhZ2UyIiwibWVzc2FnZSIsInBhcnNlIiwiU3RyaW5nIiwiX3VudXNlZDMiLCJwZW5kaW5nQ2FsbCIsImNsZWFyVGltZW91dCIsInJlYXNvbiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfc2xpY2VkVG9BcnJheTIiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL2JyaWRnZS1zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBUaGUgYnJpZGdlIGJldHdlZW4gYW4gTUNQIGNsaWVudCBhbmQgYSBrZXBsZXIuZ2wgcGFnZS5cbiAqXG4gKiBCcm93c2VycyBjYW5ub3QgbGlzdGVuIG9uIGEgcG9ydCwgc28gdGhlIHBhZ2UgaXMgYSBXZWJTb2NrZXQgQ0xJRU5UIHRoYXRcbiAqIGNvbm5lY3RzIE9VVCB0byBgd3M6Ly8xMjcuMC4wLjE6PHBvcnQ+L3dzP3Rva2VuPS4uLmAgKHRoZSByZXZlcnNlLWNvbm5lY3RcbiAqIHBhdHRlcm4pLiBUaGlzIHNlcnZlciBob2xkcyB0aGF0IHNvY2tldCwgYWR2ZXJ0aXNlcyB0aGUgYG1hcC4qYCB0b29scyB0byB0aGVcbiAqIE1DUCBjbGllbnQsIGFuZCBmb3J3YXJkcyBlYWNoIGNhbGwgdG8gdGhlIHBhZ2UsIHdoZXJlIHRoZSBjb21tYW5kIHJlZ2lzdHJ5XG4gKiBleGVjdXRlcyBhZ2FpbnN0IHRoZSBsaXZlIG1hcC5cbiAqXG4gKiBUaGUgdG9vbCBsaXN0IGNvbWVzIGZyb20gdGhlIHBhY2thZ2UgaXRzZWxmIChgZ2V0S2VwbGVyQ29tbWFuZHNgKSwgc28gdG9vbHNcbiAqIGV4aXN0IGJlZm9yZSBhIHBhZ2UgY29ubmVjdHM7IGEgY2FsbCB3aXRob3V0IGEgcGFnZSByZXR1cm5zIGEgY2xlYXIgZXJyb3IuXG4gKiBPbmNlIGEgcGFnZSBzYXlzIGBoZWxsb2AgaXRzIG93biBjYXRhbG9nIHJlcGxhY2VzIHRoZSBzdGF0aWMgb25lLCBiZWNhdXNlIGFcbiAqIHBhZ2UgbWF5IG5vdCBzZXJ2ZSBldmVyeSBjb21tYW5kICh0aGUgZGVtbyBhcHAgb21pdHMgdGhlIER1Y2tEQi1iYWNrZWQgb25lcykuXG4gKi9cblxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQge2NyZWF0ZVNlcnZlcn0gZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB0eXBlIHtTZXJ2ZXIgYXMgSHR0cFNlcnZlcn0gZnJvbSAnbm9kZTpodHRwJztcbmltcG9ydCB7V2ViU29ja2V0LCBXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gJ3dzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB7Z2V0S2VwbGVyQ29tbWFuZHN9IGZyb20gJy4uL2NvbW1hbmRzJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0LCBSb29tQ29tbWFuZFJlc3VsdCwgVG9vbERlc2NyaXB0b3J9IGZyb20gJy4uL2NvbW1hbmRzL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9QT1JUID0gODc2NTtcbmNvbnN0IERFRkFVTFRfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9DQUxMX1RJTUVPVVRfTVMgPSA2MF8wMDA7XG5cbmV4cG9ydCB0eXBlIE1hcFRvb2wgPSB7XG4gIC8qKiBNQ1AgdG9vbCBuYW1lLCBlLmcuIGBtYXBfYWRkX2xheWVyYCAoZG90cyBhcmUgbm90IGFsbG93ZWQgaW4gdG9vbCBuYW1lcykuICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRoZSBgbWFwLipgIGNvbW1hbmQgaWQgdGhlIGNhbGwgaXMgZm9yd2FyZGVkIHRvLiAqL1xuICBjb21tYW5kSWQ6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaW5wdXRTY2hlbWE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgS2VwbGVyTWNwQnJpZGdlT3B0aW9ucyA9IHtcbiAgcG9ydD86IG51bWJlcjtcbiAgaG9zdD86IHN0cmluZztcbiAgLyoqIEJhc2UgVVJMIG9mIHRoZSBtYXAgcGFnZSwgcHJpbnRlZCB3aXRoIHRoZSB0b2tlbi4gKi9cbiAgbWFwVXJsPzogc3RyaW5nO1xuICBjYWxsVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgS2VwbGVyTWNwQnJpZGdlU3RhcnQgPSB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogV2hhdCBhIGh1bWFuIHNob3VsZCBvcGVuOiBgPG1hcFVybD4/bWNwPTx0b2tlbj5gLiAqL1xuICBwYWdlVXJsOiBzdHJpbmc7XG59O1xuXG50eXBlIFBlbmRpbmdDYWxsID0ge1xuICByZXNvbHZlOiAocmVzdWx0OiBSb29tQ29tbWFuZFJlc3VsdCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG59O1xuXG4vKiogTUNQIHRvb2wgbmFtZXMgYXJlIGNvbW1vbmx5IHJlc3RyaWN0ZWQgdG8gW0EtWmEtejAtOV8tXTsgYG1hcC5hZGQtbGF5ZXJgIOKGkiBgbWFwX2FkZF9sYXllcmAuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ub29sTmFtZShjb21tYW5kSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kSWQucmVwbGFjZSgvXFwuL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIHRvSW5wdXRTY2hlbWEoY29tbWFuZDoge2lucHV0U2NoZW1hPzogdW5rbm93bn0pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmIChjb21tYW5kLmlucHV0U2NoZW1hKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IHoudG9KU09OU2NoZW1hKGNvbW1hbmQuaW5wdXRTY2hlbWEgYXMgei5ab2RUeXBlKTtcbiAgICAgIGlmIChzY2hlbWEpIHJldHVybiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb3QgZXZlcnkgY29tbWFuZCBzaGlwcyBhIHpvZCBzY2hlbWE7IGZhbGwgYmFjayB0byBhIGZyZWUtZm9ybSBvYmplY3QuXG4gICAgfVxuICB9XG4gIHJldHVybiB7dHlwZTogJ29iamVjdCd9O1xufVxuXG4vKiogVGhlIG1hcCBzdXJmYWNlIGFzIGRlY2xhcmVkIGJ5IHRoaXMgcGFja2FnZSwgaW5kZXBlbmRlbnQgb2YgYW55IHBhZ2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwVG9vbHMoKTogTWFwVG9vbFtdIHtcbiAgY29uc3QgY29tbWFuZHMgPSBnZXRLZXBsZXJDb21tYW5kcyh7fSBhcyBLZXBsZXJDb250ZXh0KTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29tbWFuZHMpLm1hcChjb21tYW5kID0+ICh7XG4gICAgbmFtZTogdG9Ub29sTmFtZShjb21tYW5kLmlkKSxcbiAgICBjb21tYW5kSWQ6IGNvbW1hbmQuaWQsXG4gICAgZGVzY3JpcHRpb246IGNvbW1hbmQuZGVzY3JpcHRpb24gfHwgY29tbWFuZC5uYW1lLFxuICAgIGlucHV0U2NoZW1hOiB0b0lucHV0U2NoZW1hKGNvbW1hbmQpXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gdG9vbHNGcm9tRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnM6IFRvb2xEZXNjcmlwdG9yW10pOiBNYXBUb29sW10ge1xuICByZXR1cm4gZGVzY3JpcHRvcnNcbiAgICAuZmlsdGVyKGRlc2NyaXB0b3IgPT4gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLmlkKVxuICAgIC5tYXAoZGVzY3JpcHRvciA9PiAoe1xuICAgICAgbmFtZTogdG9Ub29sTmFtZShkZXNjcmlwdG9yLmlkKSxcbiAgICAgIGNvbW1hbmRJZDogZGVzY3JpcHRvci5pZCxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdG9yLmRlc2NyaXB0aW9uIHx8IGRlc2NyaXB0b3IubmFtZSB8fCBkZXNjcmlwdG9yLmlkLFxuICAgICAgaW5wdXRTY2hlbWE6IChkZXNjcmlwdG9yLmlucHV0U2NoZW1hIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB8fCB7dHlwZTogJ29iamVjdCd9XG4gICAgfSkpO1xufVxuXG4vKiogUm9vbUNvbW1hbmRSZXN1bHQg4oaSIHRoZSB0ZXh0IGFuIE1DUCBjbGllbnQgc2hvd3MgZm9yIGEgdG9vbCBjYWxsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlc3VsdChyZXN1bHQ6IFJvb21Db21tYW5kUmVzdWx0KToge3RleHQ6IHN0cmluZzsgaXNFcnJvcjogYm9vbGVhbn0ge1xuICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSkge1xuICAgIHJldHVybiB7dGV4dDogYOKclyAke3Jlc3VsdC5jb21tYW5kSWR9OiAke3Jlc3VsdC5lcnJvciA/PyAnZmFpbGVkJ31gLCBpc0Vycm9yOiB0cnVlfTtcbiAgfVxuICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiB7dGV4dDogYOKclyAke3Jlc3VsdC5jb21tYW5kSWR9OiAke3Jlc3VsdC5lcnJvcn1gLCBpc0Vycm9yOiB0cnVlfTtcbiAgfVxuICBjb25zdCBkYXRhID0gcmVzdWx0Py5kYXRhIGFzIHtkZXRhaWxzPzogc3RyaW5nfSB8IHVuZGVmaW5lZDtcbiAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEuZGV0YWlscyA9PT0gJ3N0cmluZycpIHJldHVybiB7dGV4dDogZGF0YS5kZXRhaWxzLCBpc0Vycm9yOiBmYWxzZX07XG4gIHJldHVybiB7dGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0Py5kYXRhID8/IHJlc3VsdCA/PyBudWxsLCBudWxsLCAyKSwgaXNFcnJvcjogZmFsc2V9O1xufVxuXG5leHBvcnQgY2xhc3MgS2VwbGVyTWNwQnJpZGdlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxLZXBsZXJNY3BCcmlkZ2VPcHRpb25zPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGF0aWNUb29sczogTWFwVG9vbFtdO1xuICBwcml2YXRlIHBhZ2VUb29sczogTWFwVG9vbFtdIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc29ja2V0OiBXZWJTb2NrZXQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3c3M6IFdlYlNvY2tldFNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGh0dHBTZXJ2ZXI6IEh0dHBTZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdDYWxsPigpO1xuICBwcml2YXRlIHRva2VuID0gJyc7XG4gIHByaXZhdGUgcGFnZVVybCA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEtlcGxlck1jcEJyaWRnZU9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIHBvcnQ6IG9wdGlvbnMucG9ydCA/PyBERUZBVUxUX1BPUlQsXG4gICAgICBob3N0OiBvcHRpb25zLmhvc3QgPz8gREVGQVVMVF9IT1NULFxuICAgICAgbWFwVXJsOiBvcHRpb25zLm1hcFVybCA/PyAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJyxcbiAgICAgIGNhbGxUaW1lb3V0TXM6IG9wdGlvbnMuY2FsbFRpbWVvdXRNcyA/PyBERUZBVUxUX0NBTExfVElNRU9VVF9NU1xuICAgIH07XG4gICAgdGhpcy5zdGF0aWNUb29scyA9IGdldE1hcFRvb2xzKCk7XG4gIH1cblxuICAvKiogVG9vbHMgdGhlIE1DUCBjbGllbnQgY2FuIGNhbGwgcmlnaHQgbm93LiAqL1xuICBnZXRUb29scygpOiBNYXBUb29sW10ge1xuICAgIHJldHVybiB0aGlzLnBhZ2VUb29scyA/PyB0aGlzLnN0YXRpY1Rvb2xzO1xuICB9XG5cbiAgZ2V0IGNvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zb2NrZXQ/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTxLZXBsZXJNY3BCcmlkZ2VTdGFydD4ge1xuICAgIGlmICh0aGlzLndzcykgdGhyb3cgbmV3IEVycm9yKCdUaGUga2VwbGVyLmdsIGJyaWRnZSBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7XG5cbiAgICB0aGlzLnRva2VuID0gcmFuZG9tVVVJRCgpLnJlcGxhY2UoLy0vZywgJycpO1xuXG4gICAgLy8gQSBwbGFpbiBIVFRQIEdFVCBvbiBgL2AgcmVkaXJlY3RzIHRvIHRoZSBtYXAgcGFnZSBjYXJyeWluZyB0aGUgdG9rZW4sIHNvXG4gICAgLy8gdGhlIHVzZXIgY2FuIG9wZW4gYGh0dHA6Ly8xMjcuMC4wLjE6PHBvcnQ+L2AgZXZlbiB3aGVuIHRoZSBNQ1AgY2xpZW50XG4gICAgLy8gbmV2ZXIgc2hvd3MgdGhlIHNlcnZlcidzIHN0ZGVyci4gT25seSBgL3dzYCB1cGdyYWRlcyB0byBhIFdlYlNvY2tldC5cbiAgICBjb25zdCBodHRwU2VydmVyID0gY3JlYXRlU2VydmVyKChyZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QudXJsID09PSAnLycgfHwgcmVxdWVzdC51cmw/LnN0YXJ0c1dpdGgoJy8/JykpIHtcbiAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDMwMiwge0xvY2F0aW9uOiB0aGlzLnBhZ2VVcmx9KTtcbiAgICAgICAgcmVzcG9uc2UuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQsIHsnY29udGVudC10eXBlJzogJ3RleHQvcGxhaW4nfSk7XG4gICAgICByZXNwb25zZS5lbmQoJ2tlcGxlci1tY3A6IHRoZSBtYXAgcGFnZSBjb25uZWN0cyBhdCAvd3MnKTtcbiAgICB9KTtcbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyO1xuXG4gICAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7c2VydmVyOiBodHRwU2VydmVyLCBwYXRoOiAnL3dzJ30pO1xuICAgIHRoaXMud3NzID0gd3NzO1xuICAgIHdzcy5vbignY29ubmVjdGlvbicsIChzb2NrZXQsIHJlcXVlc3QpID0+IHRoaXMuaGFuZGxlQ29ubmVjdGlvbihzb2NrZXQsIHJlcXVlc3QudXJsKSk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBodHRwU2VydmVyLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIGh0dHBTZXJ2ZXIubGlzdGVuKHRoaXMub3B0aW9ucy5wb3J0LCB0aGlzLm9wdGlvbnMuaG9zdCwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFkZHJlc3MgPSBodHRwU2VydmVyLmFkZHJlc3MoKTtcbiAgICBjb25zdCBwb3J0ID0gdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiB0aGlzLm9wdGlvbnMucG9ydDtcbiAgICBjb25zdCBtYXBVcmwgPSB0aGlzLm9wdGlvbnMubWFwVXJsLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgdGhpcy5wYWdlVXJsID0gYCR7bWFwVXJsfSR7bWFwVXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyd9bWNwPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgdGhpcy50b2tlblxuICAgICl9YDtcbiAgICByZXR1cm4ge2hvc3Q6IHRoaXMub3B0aW9ucy5ob3N0LCBwb3J0LCB0b2tlbjogdGhpcy50b2tlbiwgcGFnZVVybDogdGhpcy5wYWdlVXJsfTtcbiAgfVxuXG4gIGFzeW5jIGNhbGxUb29sKG5hbWU6IHN0cmluZywgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFJvb21Db21tYW5kUmVzdWx0PiB7XG4gICAgY29uc3QgdG9vbCA9XG4gICAgICB0aGlzLmdldFRvb2xzKCkuZmluZChjYW5kaWRhdGUgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpID8/XG4gICAgICB0aGlzLnN0YXRpY1Rvb2xzLmZpbmQoY2FuZGlkYXRlID0+IGNhbmRpZGF0ZS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoIXRvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gbWFwIHRvb2wgXCIke25hbWV9XCIuIEF2YWlsYWJsZTogJHt0aGlzLmdldFRvb2xzKClcbiAgICAgICAgICAubWFwKGNhbmRpZGF0ZSA9PiBjYW5kaWRhdGUubmFtZSlcbiAgICAgICAgICAuam9pbignLCAnKX0uYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc29ja2V0ID0gdGhpcy5zb2NrZXQ7XG4gICAgaWYgKCFzb2NrZXQgfHwgc29ja2V0LnJlYWR5U3RhdGUgIT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBrZXBsZXIuZ2wgbWFwIHBhZ2UgaXMgY29ubmVjdGVkLiBPcGVuIHRoZSBwYWdlIFVSTCBwcmludGVkIGF0IHN0YXJ0dXAgJyArXG4gICAgICAgICAgJyhpdCBjYXJyaWVzID9tY3A9PHRva2VuPiksIHRoZW4gY2FsbCB0aGUgdG9vbCBhZ2Fpbi4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbGxJZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCByZXBseSA9IG5ldyBQcm9taXNlPFJvb21Db21tYW5kUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGNhbGxJZCk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoYFRpbWVkIG91dCBhZnRlciAke3RoaXMub3B0aW9ucy5jYWxsVGltZW91dE1zfSBtcyB3YWl0aW5nIGZvciB0aGUgbWFwIHBhZ2UuYClcbiAgICAgICAgKTtcbiAgICAgIH0sIHRoaXMub3B0aW9ucy5jYWxsVGltZW91dE1zKTtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoY2FsbElkLCB7cmVzb2x2ZSwgcmVqZWN0LCB0aW1lcn0pO1xuICAgIH0pO1xuXG4gICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe3R5cGU6ICdjYWxsJywgY2FsbElkLCB0b29sOiB0b29sLmNvbW1hbmRJZCwgaW5wdXR9KSk7XG4gICAgcmV0dXJuIHJlcGx5O1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZWplY3RQZW5kaW5nKCdUaGUgYnJpZGdlIHdhcyBjbG9zZWQuJyk7XG4gICAgdGhpcy5wYWdlVG9vbHMgPSBudWxsO1xuICAgIHRoaXMuc29ja2V0Py5jbG9zZSgxMDAwLCAnYnJpZGdlIGNsb3NlZCcpO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICBjb25zdCB3c3MgPSB0aGlzLndzcztcbiAgICBjb25zdCBodHRwU2VydmVyID0gdGhpcy5odHRwU2VydmVyO1xuICAgIHRoaXMud3NzID0gbnVsbDtcbiAgICB0aGlzLmh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIGlmICghd3NzKSByZXR1cm47XG4gICAgLy8gY2xvc2UoKSBvbmx5IHN0b3BzIGxpc3RlbmluZyBhbmQgd2FpdHMgZm9yIGNsaWVudHM7IHRlcm1pbmF0ZSB0aGVtIHNvXG4gICAgLy8gc2h1dGRvd24gKGFuZCB0ZXN0cykgZG8gbm90IGhhbmcgb24gYSBwYWdlIHRoYXQgbmV2ZXIgY2xvc2VzIGl0cyBzb2NrZXQuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2Ygd3NzLmNsaWVudHMpIGNsaWVudC50ZXJtaW5hdGUoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHdzcy5jbG9zZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICBpZiAoaHR0cFNlcnZlcikge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBodHRwU2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUoKSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29ubmVjdGlvbihzb2NrZXQ6IFdlYlNvY2tldCwgcmVxdWVzdFVybDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgbGV0IHRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdG9rZW4gPSBuZXcgVVJMKHJlcXVlc3RVcmwgPz8gJy93cycsICdodHRwOi8vMTI3LjAuMC4xJykuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRva2VuID0gbnVsbDtcbiAgICB9XG4gICAgLy8gVGhlIHRva2VuIGlzIHRoZSBvbmx5IHRoaW5nIGtlZXBpbmcgb3RoZXIgbG9jYWwgcGFnZXMvcHJvY2Vzc2VzIGZyb21cbiAgICAvLyBkcml2aW5nIHRoZSBtYXA7IHJlamVjdCBhIG1pc21hdGNoIGJlZm9yZSBhY2NlcHRpbmcgYW55IG1lc3NhZ2UuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLnRva2VuKSB7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwOCwgJ2ludmFsaWQgdG9rZW4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmUgbWFwIHBhZ2UgYXQgYSB0aW1lOiBhIHNlY29uZCB0YWIgdGFrZXMgb3ZlciBzbyBjYWxscyBuZXZlciByYWNlXG4gICAgLy8gYmV0d2VlbiB0d28gbGl2ZSBtYXBzLlxuICAgIHRoaXMuc29ja2V0Py5jbG9zZSgxMDAwLCAncmVwbGFjZWQgYnkgYSBuZXdlciBjb25uZWN0aW9uJyk7XG4gICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgdGhpcy5wYWdlVG9vbHMgPSBudWxsO1xuXG4gICAgc29ja2V0Lm9uKCdtZXNzYWdlJywgZGF0YSA9PiB0aGlzLmhhbmRsZU1lc3NhZ2UoZGF0YSkpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zb2NrZXQgPT09IHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgICAgIHRoaXMucGFnZVRvb2xzID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWplY3RQZW5kaW5nKCdUaGUga2VwbGVyLmdsIHBhZ2UgZGlzY29ubmVjdGVkLicpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEVycm9ycyBhcmUgZm9sbG93ZWQgYnkgY2xvc2U7IHRoZSBjbG9zZSBoYW5kbGVyIHJlc2V0cyBzdGF0ZS5cbiAgICBzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZShyYXc6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbWVzc2FnZTogYW55O1xuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcocmF3KSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChtZXNzYWdlPy50eXBlID09PSAnaGVsbG8nICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb21tYW5kcykpIHtcbiAgICAgIHRoaXMucGFnZVRvb2xzID0gdG9vbHNGcm9tRGVzY3JpcHRvcnMobWVzc2FnZS5jb21tYW5kcyBhcyBUb29sRGVzY3JpcHRvcltdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09ICdyZXN1bHQnICYmIHR5cGVvZiBtZXNzYWdlLmNhbGxJZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmdDYWxsID0gdGhpcy5wZW5kaW5nLmdldChtZXNzYWdlLmNhbGxJZCk7XG4gICAgICBpZiAoIXBlbmRpbmdDYWxsKSByZXR1cm47XG4gICAgICBjbGVhclRpbWVvdXQocGVuZGluZ0NhbGwudGltZXIpO1xuICAgICAgdGhpcy5wZW5kaW5nLmRlbGV0ZShtZXNzYWdlLmNhbGxJZCk7XG4gICAgICBwZW5kaW5nQ2FsbC5yZXNvbHZlKG1lc3NhZ2UucmVzdWx0IGFzIFJvb21Db21tYW5kUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlamVjdFBlbmRpbmcocmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtjYWxsSWQsIHBlbmRpbmdDYWxsXSBvZiB0aGlzLnBlbmRpbmcpIHtcbiAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nQ2FsbC50aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGNhbGxJZCk7XG4gICAgICBwZW5kaW5nQ2FsbC5yZWplY3QobmV3IEVycm9yKHJlYXNvbikpO1xuICAgIH1cbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxHQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxJQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxTQUFBLEdBQUFKLE9BQUE7QUFBOEMsU0FBQUssMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FB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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "KeplerMcpBridge", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _bridgeServer.KeplerMcpBridge;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "formatResult", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _bridgeServer.formatResult;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "getMapTools", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function get() {
|
|
21
|
+
return _bridgeServer.getMapTools;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(exports, "toToolName", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function get() {
|
|
27
|
+
return _bridgeServer.toToolName;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
var _bridgeServer = require("./bridge-server");
|
|
31
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYnJpZGdlU2VydmVyIiwicmVxdWlyZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBTZXJ2ZXItc2lkZSBlbnRyeSBwb2ludCBvZiBgQGtlcGxlci5nbC9tY3BgLlxuICpcbiAqIEJyb3dzZXIgYnVuZGxlcyBtdXN0IG5vdCBpbXBvcnQgdGhpcyBtb2R1bGU6IGl0IHB1bGxzIGluIGB3c2AgYW5kIE5vZGUgQVBJcy5cbiAqIFRoZSBtYXAgY29udHJhY3RzIGFuZCBjb21tYW5kcyBzdGF5IGluIHRoZSBwYWNrYWdlIHJvb3Q7IHRoaXMgc3VicGF0aCBpcyBmb3JcbiAqIHRoZSBzdGRpbyBNQ1Agc2VydmVyIChga2VwbGVyLW1jcGApIGFuZCBmb3IgdGVzdHMuXG4gKi9cblxuZXhwb3J0IHtLZXBsZXJNY3BCcmlkZ2UsIGZvcm1hdFJlc3VsdCwgZ2V0TWFwVG9vbHMsIHRvVG9vbE5hbWV9IGZyb20gJy4vYnJpZGdlLXNlcnZlcic7XG5leHBvcnQgdHlwZSB7S2VwbGVyTWNwQnJpZGdlT3B0aW9ucywgS2VwbGVyTWNwQnJpZGdlU3RhcnQsIE1hcFRvb2x9IGZyb20gJy4vYnJpZGdlLXNlcnZlcic7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0EsSUFBQUEsYUFBQSxHQUFBQyxPQUFBIiwiaWdub3JlTGlzdCI6W119
|