socket-function 1.1.49 → 1.2.1

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 (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -1,6 +1,6 @@
1
- /// <reference path="require/RequireController.d.ts" />
2
1
  /// <reference types="node" />
3
2
  /// <reference types="node" />
3
+ /// <reference types="socket-function/require/requirecontroller" />
4
4
  import { SocketExposedInterface, SocketFunctionHook, SocketFunctionClientHook, SocketExposedShape, SocketRegistered, CallerContext, FullCallType, SocketRegisterType } from "./SocketFunctionTypes";
5
5
  import { SocketServerConfig } from "./src/webSocketServer";
6
6
  import { Args, MaybePromise } from "./src/types";
@@ -1,4 +1,4 @@
1
- /// <reference path="require/RequireController.d.ts" />
1
+ /// <reference types="socket-function/require/requirecontroller" />
2
2
  import { getCallObj } from "./src/nodeProxy";
3
3
  import { Args, MaybePromise } from "./src/types";
4
4
  export declare const socket: unique symbol;
@@ -0,0 +1,9 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ module.allowclient = true;
4
+ const misc_1 = require("./src/misc");
5
+ if (!(0, misc_1.isNode)()) {
6
+ process.env.CBOR_NATIVE_ACCELERATION_DISABLED = "true";
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2V0UHJvY2Vzc1ZhcmlhYmxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlNldFByb2Nlc3NWYXJpYWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUMxQixxQ0FBb0M7QUFFcEMsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFLEVBQUUsQ0FBQztJQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLEdBQUcsTUFBTSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIi4vc3JjL21pc2NcIjtcblxuaWYgKCFpc05vZGUoKSkge1xuICAgIHByb2Nlc3MuZW52LkNCT1JfTkFUSVZFX0FDQ0VMRVJBVElPTl9ESVNBQkxFRCA9IFwidHJ1ZVwiO1xufSJdfQ=//=
9
+ /* _JS_SOURCE_HASH = "249631df8c5cbb77a37aa988d0d9d058d467b254000e31ac2a58f9161b5a8626"; */
@@ -0,0 +1,467 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ /// <reference path="./require/RequireController.ts" />
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
30
+ exports._setSocketContext = exports.SocketFunction = void 0;
31
+ const callManager_1 = require("./src/callManager");
32
+ const webSocketServer_1 = require("./src/webSocketServer");
33
+ const nodeCache_1 = require("./src/nodeCache");
34
+ const nodeProxy_1 = require("./src/nodeProxy");
35
+ const callHTTPHandler_1 = require("./src/callHTTPHandler");
36
+ const caching_1 = require("./src/caching");
37
+ const createSingleton_1 = require("./src/createSingleton");
38
+ const batching_1 = require("./src/batching");
39
+ const logColors_1 = require("./src/formatting/logColors");
40
+ require("./SetProcessVariables");
41
+ const cbor_x_1 = __importDefault(require("cbor-x"));
42
+ const compileFlags_1 = require("./require/compileFlags");
43
+ const misc_1 = require("./src/misc");
44
+ const CallFactory_1 = require("./src/CallFactory");
45
+ const measure_1 = require("./src/profiling/measure");
46
+ (0, compileFlags_1.setFlag)(require, "cbor-x", "allowclient", true);
47
+ let cborxInstance = new cbor_x_1.default.Encoder({ structuredClone: true });
48
+ if ((0, misc_1.isNode)()) {
49
+ // Do not crash on unhandled errors. SocketFunction is made to run a webserver,
50
+ // which will run perfectly after 99.9% of errors. Crashing the process is
51
+ // not a good alternative to proper error log and notifications. Do you guys
52
+ // not get automated emails when unexpected errors are logged? I do.
53
+ process.on("unhandledRejection", (e) => {
54
+ console.error("Unhandled rejection" + ((e === null || e === void 0 ? void 0 : e.stack) || e));
55
+ });
56
+ process.on("uncaughtException", (e) => {
57
+ console.error("Uncaught exception" + ((e === null || e === void 0 ? void 0 : e.stack) || e));
58
+ });
59
+ }
60
+ module.allowclient = true;
61
+ // The active call's caller, plus a sequence number used to reset it synchronously (see
62
+ // _setSocketContext). Shared across copies of this package, so SocketFunction.getCaller()
63
+ // returns the right caller even when the call was set up by a different copy. See createSingleton.
64
+ const socketContext = (0, createSingleton_1.createSingleton)("SocketFunction.socketContext", 1, () => ({
65
+ seqNum: 1,
66
+ caller: undefined,
67
+ }));
68
+ class SocketFunction {
69
+ // Places where we decide if we want to act as a client. Most places we check for is node, but some places it's not, depending on if we're in Node.js or not, it's depending on if we're a client or not.
70
+ static isClient() { return !(0, misc_1.isNode)() || SocketFunction.ENABLE_CLIENT_MODE; }
71
+ static get exposedClasses() { return SocketFunction.exposedClassesSingleton.get(); }
72
+ static get callerContext() { return socketContext.get().caller; }
73
+ static set callerContext(value) { socketContext.get().caller = value; }
74
+ static getCaller() {
75
+ const caller = SocketFunction.callerContext;
76
+ if (!caller)
77
+ throw new Error(`Tried to access caller when not in the synchronous phase of a function call`);
78
+ return caller;
79
+ }
80
+ // NOTE: We use callbacks we don't run into issues with cyclic dependencies
81
+ // (ex, using a hook in a controller where the hook also calls the controller).
82
+ /*
83
+ export const DiskLoggerController = SocketFunction.register(
84
+ // Can be anything, but should be unique amongst other controllers on your server.
85
+ "DiskLoggerController-f76a6fdf-3bd5-4bd4-a183-55a8be0a5a32",
86
+ // Contains the functions that can be exposed, which must all be async.
87
+ // Only those listed below will be exposed.
88
+ new DiskLoggerControllerBase(),
89
+ () => ({
90
+ // Only functions listed here will be exposed
91
+ getRemoteLogFiles: {},
92
+ getRemoteLogBuffer: {
93
+ compress: true,
94
+ // SocketFunctionClientHook[]
95
+ clientHooks: [
96
+ (x) => {
97
+ // If overrideResult is set, it skips the call and returns overrideResult
98
+ x.overrideResult = Buffer.from(...);
99
+ }
100
+ ]
101
+ },
102
+ }),
103
+ () => ({
104
+ // Default hooks for all functions
105
+ // SocketFunctionHook[]
106
+ hooks: [assertIsManagementUser],
107
+ }),
108
+ {
109
+ // Additionaly flags
110
+ }
111
+ );
112
+ */
113
+ static register(classGuid, instance, shapeFnc, defaultHooksFnc, config) {
114
+ let instanceFnc = (0, caching_1.lazy)(typeof instance === "function" ? instance : () => instance);
115
+ void Promise.resolve().then(() => {
116
+ let onMount = getDefaultHooks === null || getDefaultHooks === void 0 ? void 0 : getDefaultHooks().onMount;
117
+ if (onMount) {
118
+ let callbacks = SocketFunction.onMountCallbacks.get(classGuid);
119
+ if (!callbacks) {
120
+ callbacks = [];
121
+ SocketFunction.onMountCallbacks.set(classGuid, callbacks);
122
+ }
123
+ callbacks.push(onMount);
124
+ }
125
+ });
126
+ let getDefaultHooks = defaultHooksFnc && (0, caching_1.lazy)(defaultHooksFnc);
127
+ const getShape = (0, caching_1.lazy)(() => {
128
+ var _a;
129
+ let shape = shapeFnc();
130
+ let defaultHooks = getDefaultHooks === null || getDefaultHooks === void 0 ? void 0 : getDefaultHooks();
131
+ for (let value of Object.values(shape)) {
132
+ if (!value)
133
+ continue;
134
+ if (!value.noClientHooks) {
135
+ value.clientHooks = [...((defaultHooks === null || defaultHooks === void 0 ? void 0 : defaultHooks.clientHooks) || []), ...(value.clientHooks || [])];
136
+ }
137
+ if (value.noDefaultHooks) {
138
+ value.hooks = [...(value.hooks || [])];
139
+ }
140
+ else {
141
+ value.hooks = [...((defaultHooks === null || defaultHooks === void 0 ? void 0 : defaultHooks.hooks) || []), ...(value.hooks || [])];
142
+ }
143
+ value.dataImmutable = (_a = defaultHooks === null || defaultHooks === void 0 ? void 0 : defaultHooks.dataImmutable) !== null && _a !== void 0 ? _a : value.dataImmutable;
144
+ }
145
+ return shape;
146
+ });
147
+ // Wait, so any constants referenced by the base shapeFnc will be fully resolved
148
+ // by now. This is IMPORTANT, as it allows permissions functions to be moved
149
+ // to a common module, instead of all being inline.
150
+ void Promise.resolve().then(() => {
151
+ (0, callManager_1.registerClass)(classGuid, instanceFnc(), getShape(), {
152
+ noFunctionMeasure: config === null || config === void 0 ? void 0 : config.noFunctionMeasure,
153
+ });
154
+ });
155
+ let socketCaller = SocketFunction.rehydrateSocketCaller({
156
+ _classGuid: classGuid,
157
+ _internalType: null,
158
+ }, getShape);
159
+ if (!(config === null || config === void 0 ? void 0 : config.noAutoExpose)) {
160
+ this.expose(socketCaller);
161
+ }
162
+ return Object.assign(socketCaller, config === null || config === void 0 ? void 0 : config.statics);
163
+ }
164
+ static rehydrateSocketCaller(socketRegistered,
165
+ // Shape is required for client hooks.
166
+ shapeFnc) {
167
+ let cached = this.socketCache.get(socketRegistered._classGuid);
168
+ if (!cached) {
169
+ let getShape = (0, caching_1.lazy)(() => shapeFnc === null || shapeFnc === void 0 ? void 0 : shapeFnc());
170
+ let classGuid = socketRegistered._classGuid;
171
+ let nodeProxy = (0, nodeProxy_1.getCallProxy)(classGuid, async (call) => {
172
+ return await SocketFunction.callFromGuid(call, classGuid, getShape());
173
+ });
174
+ cached = {
175
+ nodes: nodeProxy,
176
+ _classGuid: classGuid,
177
+ _internalType: null,
178
+ };
179
+ this.socketCache.set(classGuid, cached);
180
+ }
181
+ return cached;
182
+ }
183
+ static async callFromGuid(call, classGuid, shape) {
184
+ let nodeId = call.nodeId;
185
+ let functionName = call.functionName;
186
+ let time = Date.now();
187
+ if (SocketFunction.logMessages) {
188
+ console.log(`START\t\t\t${classGuid}.${functionName} at ${Date.now()}`);
189
+ }
190
+ try {
191
+ let callFactory = await (0, nodeCache_1.getCreateCallFactory)(nodeId);
192
+ let shapeObj = shape === null || shape === void 0 ? void 0 : shape[functionName];
193
+ if (!shapeObj) {
194
+ shapeObj = {};
195
+ }
196
+ // NOTE: Actually... this just means the client doesn't have a definition for it. The server
197
+ // might, so call it, and let them throw if it is unrecognized.
198
+ // if (!shapeObj) {
199
+ // throw new Error(`Function ${functionName} is not in shape`);
200
+ // }
201
+ let hookResult = await (0, callManager_1.runClientHooks)(call, shapeObj, callFactory.connectionId);
202
+ if ("overrideResult" in hookResult) {
203
+ for (let callback of hookResult.onResult) {
204
+ await callback(hookResult.overrideResult);
205
+ }
206
+ if ("overrideResult" in hookResult) {
207
+ return hookResult.overrideResult;
208
+ }
209
+ }
210
+ let result = await callFactory.performCall(call);
211
+ for (let callback of hookResult.onResult) {
212
+ await callback(result);
213
+ }
214
+ if ("overrideResult" in hookResult) {
215
+ return hookResult.overrideResult;
216
+ }
217
+ return result;
218
+ }
219
+ finally {
220
+ time = Date.now() - time;
221
+ if (SocketFunction.logMessages) {
222
+ console.log(`FINISHED\t${time}ms\t${classGuid}.${functionName} at ${Date.now()}`);
223
+ }
224
+ }
225
+ }
226
+ /** Will dedupe callbacks, so if you call with the same callback it won't call it multiple times (otherwise it's difficult to manage this, as this only calls on the NEXT callback).
227
+ IMPORTANT! Client node ids will NEVER reconnect, so this can full cleanup. However full nodeIds might if we try to use that nodeId again, so this cannot fully clean them up.
228
+ */
229
+ static onNextDisconnect(nodeId, callback,
230
+ // NOTE: It's important to know that unlike client ids, server ids (a nodeId YOU connect to, instead of connecting to you), might be alive again, and so you need some kind of logic to try it again or in some way reconnect. For clients you don't need to, as it's their job to reconnect to you, and they will reconnect with a NEW nodeId.
231
+ noServerNodeIdWarning) {
232
+ if (!(0, nodeCache_1.isClientNodeId)(nodeId) && !noServerNodeIdWarning) {
233
+ console.error(`Watching for disconnections of ${nodeId}. This is a server nodeId and may be alive again after disconnection. Please set the noServerNodeIdWarning flag in this argument to confirm you are handling reconnecting if the server becomes available again.`);
234
+ }
235
+ (async () => {
236
+ let factory = await (0, nodeCache_1.getCallFactory)(nodeId);
237
+ if (!factory) {
238
+ for (let i = 0; i < 30; i++) {
239
+ await (0, batching_1.delay)(1000);
240
+ factory = await (0, nodeCache_1.getCallFactory)(nodeId);
241
+ if (factory)
242
+ break;
243
+ }
244
+ if (!factory) {
245
+ console.error(`Failed to get call factory for ${nodeId} after 30 seconds, giving up.`);
246
+ callback();
247
+ return;
248
+ }
249
+ }
250
+ factory.onNextDisconnect(callback);
251
+ })().catch(() => {
252
+ callback();
253
+ });
254
+ }
255
+ static getLastDisconnectTime(nodeId) {
256
+ let factory = (0, nodeCache_1.getCallFactory)(nodeId);
257
+ if (!factory) {
258
+ return undefined;
259
+ }
260
+ if (factory instanceof Promise) {
261
+ return undefined;
262
+ }
263
+ return factory.lastClosed;
264
+ }
265
+ static isNodeConnected(nodeId) {
266
+ let factory = (0, nodeCache_1.getCallFactory)(nodeId);
267
+ if (!factory) {
268
+ return false;
269
+ }
270
+ if (factory instanceof Promise) {
271
+ return false;
272
+ }
273
+ return !!factory.isConnected;
274
+ }
275
+ /** NOTE: Only works if the nodeIs used is from SocketFunction.connect (we can't convert arbitrary nodeIds into urls,
276
+ * as we have no way of knowing how to contain a nodeId).
277
+ * */
278
+ static getHTTPCallLink(call) {
279
+ let location = (0, nodeCache_1.getNodeIdLocation)(call.nodeId);
280
+ if (!location) {
281
+ throw new Error(`Cannot find call location for nodeId, and so do not know where call location is. NodeId ${call.nodeId}`);
282
+ }
283
+ let url = new URL(`https://${location.address}:${location.port}`);
284
+ url.searchParams.set("classGuid", call.classGuid);
285
+ url.searchParams.set("functionName", call.functionName);
286
+ url.searchParams.set("args", JSON.stringify(call.args));
287
+ return url.toString();
288
+ }
289
+ static async ignoreExposeCalls(code) {
290
+ SocketFunction.ignoreExposeCount.get().count++;
291
+ try {
292
+ return await code();
293
+ }
294
+ finally {
295
+ SocketFunction.ignoreExposeCount.get().count--;
296
+ }
297
+ }
298
+ /** Expose should be called before your mounting occurs. It mostly just exists to ensure you include the class type,
299
+ * so the class type's module construction runs, which should trigger register. Otherwise you would have
300
+ * to add additional imports to ensure the register call runs.
301
+ */
302
+ static expose(socketRegistered) {
303
+ if (SocketFunction.ignoreExposeCount.get().count > 0)
304
+ return;
305
+ if (!socketRegistered._classGuid) {
306
+ throw new Error("SocketFunction.expose must be called with a classGuid");
307
+ }
308
+ console.log(`Exposing Controller ${(0, logColors_1.blue)(socketRegistered._classGuid)}`);
309
+ (0, callManager_1.exposeClass)(socketRegistered);
310
+ this.exposedClasses.add(socketRegistered._classGuid);
311
+ if (SocketFunction.mountState.get().hasMounted) {
312
+ let mountCallbacks = SocketFunction.onMountCallbacks.get(socketRegistered._classGuid);
313
+ for (let onMount of mountCallbacks || []) {
314
+ Promise.resolve(onMount()).catch(e => {
315
+ console.error("Error in onMount callback exposed after mount", e);
316
+ });
317
+ }
318
+ }
319
+ }
320
+ static get mountedNodeId() { return SocketFunction.mountState.get().mountedNodeId; }
321
+ static set mountedNodeId(value) { SocketFunction.mountState.get().mountedNodeId = value; }
322
+ static isMounted() { return !!this.mountedNodeId; }
323
+ static get mountedIP() { return SocketFunction.mountState.get().mountedIP; }
324
+ static set mountedIP(value) { SocketFunction.mountState.get().mountedIP = value; }
325
+ static get mountPromise() { return SocketFunction.mountState.get().mountPromise; }
326
+ static async mount(config) {
327
+ if (this.mountedNodeId) {
328
+ throw new Error("SocketFunction already mounted, mounting twice in one thread is not allowed.");
329
+ }
330
+ this.mountedIP = config.public ? "0.0.0.0" : "127.0.0.1";
331
+ if (config.ip) {
332
+ this.mountedIP = config.ip;
333
+ }
334
+ const { waitForFirstTimeSync, shimDateNow } = await Promise.resolve().then(() => __importStar(require("./time/trueTimeShim")));
335
+ shimDateNow();
336
+ await waitForFirstTimeSync();
337
+ // Wait for any additionals functions to expose themselves
338
+ await (0, batching_1.delay)("immediate");
339
+ this.mountedNodeId = await (0, webSocketServer_1.startSocketServer)(config);
340
+ SocketFunction.mountState.get().hasMounted = true;
341
+ for (let classGuid of SocketFunction.exposedClasses) {
342
+ let callbacks = SocketFunction.onMountCallbacks.get(classGuid);
343
+ if (!callbacks)
344
+ continue;
345
+ for (let callback of callbacks) {
346
+ await callback();
347
+ }
348
+ }
349
+ SocketFunction.mountState.get().mountResolve();
350
+ return this.mountedNodeId;
351
+ }
352
+ /** Sets the default call when an http request is made, but no classGuid is set.
353
+ * NOTE: All other calls should be endpoint calls, even if those endpoints return a static file with an HTML content type.
354
+ * - However, to load new content, you should probably just use `require("./example.ts")`, which works on any files
355
+ * clientside that have also been required serverside (and whitelisted with module.allowclient = true,
356
+ * or with an `allowclient.flag` file in the directory or parent directory).
357
+ */
358
+ static setDefaultHTTPCall(registered, functionName, ...args) {
359
+ (0, callHTTPHandler_1.setDefaultHTTPCall)({
360
+ classGuid: registered._classGuid,
361
+ functionName,
362
+ args,
363
+ });
364
+ }
365
+ static connect(location) {
366
+ return (0, nodeCache_1.getNodeId)(location.address, location.port);
367
+ }
368
+ static browserNodeId() {
369
+ if ((0, misc_1.isNode)()) {
370
+ throw new Error("Cannot get browser nodeId on server");
371
+ }
372
+ let edgeNode = getBootedEdgeNode();
373
+ if (edgeNode) {
374
+ return edgeNode.host;
375
+ }
376
+ return SocketFunction.connect({ address: location.hostname, port: +location.port || 443 });
377
+ }
378
+ static getBrowserNodeId() {
379
+ return this.browserNodeId();
380
+ }
381
+ static addGlobalHook(hook) {
382
+ (0, callManager_1.registerGlobalHook)(hook);
383
+ }
384
+ static addGlobalClientHook(hook) {
385
+ (0, callManager_1.registerGlobalClientHook)(hook);
386
+ }
387
+ }
388
+ exports.SocketFunction = SocketFunction;
389
+ SocketFunction.logMessages = false;
390
+ SocketFunction.trackMessageSizes = {
391
+ upload: [],
392
+ download: [],
393
+ callTimes: [],
394
+ };
395
+ SocketFunction.MAX_MESSAGE_SIZE = 1024 * 1024 * 32;
396
+ SocketFunction.HTTP_ETAG_CACHE = false;
397
+ SocketFunction.silent = true;
398
+ SocketFunction.HTTP_COMPRESS = false;
399
+ // If you have HTTP resources that require cookies you might to set `SocketFunction.COEP = "require-corp"`
400
+ // - Cross-origin-resource-policy.
401
+ SocketFunction.COEP = "credentialless";
402
+ // NOTE: This COOP and COEP defaults are required so window.crossOriginIsolated will be true.
403
+ SocketFunction.COOP = "same-origin";
404
+ SocketFunction.TOTAL_CALLS = 0;
405
+ SocketFunction.ENABLE_CLIENT_MODE = false;
406
+ // In retrospect... dynamically changing the wire serializer is a BAD idea. If any calls happen
407
+ // before it is changed, things just break. Also, it needs to be changed on both sides,
408
+ // or else things break. Also, it is very hard to detect when the issue is different serializers
409
+ // NOTE: The only reason this is still exposed is in case in the future we want to intercept our traffic, and we want convenient functions to know how to decode it (although there are a still few other layers under this, for compression and Buffer[] sending efficiency).
410
+ SocketFunction.WIRE_SERIALIZER = {
411
+ serialize: (0, measure_1.measureWrap)((obj) => [cborxInstance.encode(obj)], "WIRE_SERIALIZER|serialize"),
412
+ deserialize: (0, measure_1.measureWrap)((buffers) => cborxInstance.decode(buffers[0]), "WIRE_SERIALIZER|deserialize"),
413
+ };
414
+ /** We will try the alternate node IDs first, however, if they fail, we will go through all of them and then eventually try the original node ID.
415
+ * VERY useful, allowing us to change global ips to local ones, which short-circuits the router, massively increasing bandwidth and decreasing latency.
416
+ */
417
+ SocketFunction.GET_ALTERNATE_NODE_IDS = (nodeId) => undefined;
418
+ SocketFunction.WIRE_WARN_TIME = 100;
419
+ // Shared across copies of this package, so onMount callbacks registered through one copy still
420
+ // fire when another copy mounts. See createSingleton.
421
+ SocketFunction.onMountCallbacks = (0, createSingleton_1.createSingleton)("SocketFunction.onMountCallbacks", 1, () => new Map()).get();
422
+ // Shared across copies of this package, so the set of exposed classes is consistent regardless
423
+ // of which copy a class was exposed through. See createSingleton.
424
+ SocketFunction.exposedClassesSingleton = (0, createSingleton_1.createSingleton)("SocketFunction.exposedClasses", 1, () => new Set());
425
+ SocketFunction.harvestFailedCallCount = () => (0, CallFactory_1.harvestFailedCallCount)();
426
+ SocketFunction.getPendingCallCount = () => (0, CallFactory_1.getPendingCallCount)();
427
+ SocketFunction.harvestCallTimes = () => (0, CallFactory_1.harvestCallTimes)();
428
+ // Shared across copies of this package, so a given classGuid resolves to one canonical caller
429
+ // regardless of which copy rehydrated it. See createSingleton.
430
+ SocketFunction.socketCache = (0, createSingleton_1.createSingleton)("SocketFunction.socketCache", 1, () => new Map()).get();
431
+ // Shared across copies of this package, so suppressing expose calls in one copy also suppresses
432
+ // them in the others. See createSingleton.
433
+ SocketFunction.ignoreExposeCount = (0, createSingleton_1.createSingleton)("SocketFunction.ignoreExposeCount", 1, () => ({ count: 0 }));
434
+ // All mount state is shared across copies of this package, so a second mount (even from a
435
+ // different copy) is rejected, and onMount/mountPromise observers fire once across them all.
436
+ // See createSingleton.
437
+ SocketFunction.mountState = (0, createSingleton_1.createSingleton)("SocketFunction.mountState", 1, () => {
438
+ let mountResolve;
439
+ let mountPromise = new Promise(resolve => mountResolve = resolve);
440
+ return {
441
+ hasMounted: false,
442
+ mountedNodeId: "",
443
+ mountedIP: "",
444
+ mountResolve,
445
+ mountPromise,
446
+ };
447
+ });
448
+ function getBootedEdgeNode() {
449
+ return BOOTED_EDGE_NODE;
450
+ }
451
+ function _setSocketContext(caller, code) {
452
+ let ctx = socketContext.get();
453
+ ctx.seqNum++;
454
+ let seqNum = ctx.seqNum;
455
+ ctx.caller = caller;
456
+ try {
457
+ return code();
458
+ }
459
+ finally {
460
+ if (seqNum === ctx.seqNum) {
461
+ ctx.caller = undefined;
462
+ }
463
+ }
464
+ }
465
+ exports._setSocketContext = _setSocketContext;
466
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29ja2V0RnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTb2NrZXRGdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsdURBQXVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUd2RCxtREFBNkg7QUFDN0gsMkRBQThFO0FBQzlFLCtDQUFxSDtBQUNySCwrQ0FBK0M7QUFFL0MsMkRBQTJEO0FBRTNELDJDQUFxQztBQUNyQywyREFBd0Q7QUFDeEQsNkNBQXVDO0FBQ3ZDLDBEQUEyRDtBQUUzRCxpQ0FBK0I7QUFDL0Isb0RBQTJCO0FBQzNCLHlEQUFpRDtBQUNqRCxxQ0FBb0M7QUFDcEMsbURBQWtHO0FBQ2xHLHFEQUFzRDtBQUV0RCxJQUFBLHNCQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxnQkFBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO0lBQ1gsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UscUVBQXFFO0lBQ3JFLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFTLGFBQVQsQ0FBQyx1QkFBRCxDQUFDLENBQVUsS0FBSyxLQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBUyxhQUFULENBQUMsdUJBQUQsQ0FB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LENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUMzQixDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUM7QUFmRCw4Q0FlQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXIudHNcIiAvPlxuXG5pbXBvcnQgeyBTb2NrZXRFeHBvc2VkSW50ZXJmYWNlLCBTb2NrZXRGdW5jdGlvbkhvb2ssIFNvY2tldEZ1bmN0aW9uQ2xpZW50SG9vaywgU29ja2V0RXhwb3NlZFNoYXBlLCBTb2NrZXRSZWdpc3RlcmVkLCBDYWxsZXJDb250ZXh0LCBGdWxsQ2FsbFR5cGUsIENhbGxUeXBlLCBGbmNUeXBlLCBTb2NrZXRSZWdpc3RlclR5cGUgfSBmcm9tIFwiLi9Tb2NrZXRGdW5jdGlvblR5cGVzXCI7XG5pbXBvcnQgeyBleHBvc2VDbGFzcywgcmVnaXN0ZXJDbGFzcywgcmVnaXN0ZXJHbG9iYWxDbGllbnRIb29rLCByZWdpc3Rlckdsb2JhbEhvb2ssIHJ1bkNsaWVudEhvb2tzIH0gZnJvbSBcIi4vc3JjL2NhbGxNYW5hZ2VyXCI7XG5pbXBvcnQgeyBTb2NrZXRTZXJ2ZXJDb25maWcsIHN0YXJ0U29ja2V0U2VydmVyIH0gZnJvbSBcIi4vc3JjL3dlYlNvY2tldFNlcnZlclwiO1xuaW1wb3J0IHsgZ2V0Q2FsbEZhY3RvcnksIGdldENyZWF0ZUNhbGxGYWN0b3J5LCBnZXROb2RlSWQsIGdldE5vZGVJZExvY2F0aW9uLCBpc0NsaWVudE5vZGVJZCB9IGZyb20gXCIuL3NyYy9ub2RlQ2FjaGVcIjtcbmltcG9ydCB7IGdldENhbGxQcm94eSB9IGZyb20gXCIuL3NyYy9ub2RlUHJveHlcIjtcbmltcG9ydCB7IEFyZ3MsIE1heWJlUHJvbWlzZSB9IGZyb20gXCIuL3NyYy90eXBlc1wiO1xuaW1wb3J0IHsgc2V0RGVmYXVsdEhUVFBDYWxsIH0gZnJvbSBcIi4vc3JjL2NhbGxIVFRQSGFuZGxlclwiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCB7IGxhenkgfSBmcm9tIFwiLi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgY3JlYXRlU2luZ2xldG9uIH0gZnJvbSBcIi4vc3JjL2NyZWF0ZVNpbmdsZXRvblwiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiLi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGJsdWUsIG1hZ2VudGEgfSBmcm9tIFwiLi9zcmMvZm9ybWF0dGluZy9sb2dDb2xvcnNcIjtcbmltcG9ydCB7IEpTT05MQUNLUyB9IGZyb20gXCIuL3NyYy9KU09OTEFDS1MvSlNPTkxBQ0tTXCI7XG5pbXBvcnQgXCIuL1NldFByb2Nlc3NWYXJpYWJsZXNcIjtcbmltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBzZXRGbGFnIH0gZnJvbSBcIi4vcmVxdWlyZS9jb21waWxlRmxhZ3NcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCIuL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBnZXRQZW5kaW5nQ2FsbENvdW50LCBoYXJ2ZXN0Q2FsbFRpbWVzLCBoYXJ2ZXN0RmFpbGVkQ2FsbENvdW50IH0gZnJvbSBcIi4vc3JjL0NhbGxGYWN0b3J5XCI7XG5pbXBvcnQgeyBtZWFzdXJlV3JhcCB9IGZyb20gXCIuL3NyYy9wcm9maWxpbmcvbWVhc3VyZVwiO1xuXG5zZXRGbGFnKHJlcXVpcmUsIFwiY2Jvci14XCIsIFwiYWxsb3djbGllbnRcIiwgdHJ1ZSk7XG5sZXQgY2JvcnhJbnN0YW5jZSA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuaWYgKGlzTm9kZSgpKSB7XG4gICAgLy8gRG8gbm90IGNyYXNoIG9uIHVuaGFuZGxlZCBlcnJvcnMuIFNvY2tldEZ1bmN0aW9uIGlzIG1hZGUgdG8gcnVuIGEgd2Vic2VydmVyLFxuICAgIC8vICB3aGljaCB3aWxsIHJ1biBwZXJmZWN0bHkgYWZ0ZXIgOTkuOSUgb2YgZXJyb3JzLiBDcmFzaGluZyB0aGUgcHJvY2VzcyBpc1xuICAgIC8vICBub3QgYSBnb29kIGFsdGVybmF0aXZlIHRvIHByb3BlciBlcnJvciBsb2cgYW5kIG5vdGlmaWNhdGlvbnMuIERvIHlvdSBndXlzXG4gICAgLy8gIG5vdCBnZXQgYXV0b21hdGVkIGVtYWlscyB3aGVuIHVuZXhwZWN0ZWQgZXJyb3JzIGFyZSBsb2dnZWQ/IEkgZG8uXG4gICAgcHJvY2Vzcy5vbihcInVuaGFuZGxlZFJlamVjdGlvblwiLCAoZSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5oYW5kbGVkIHJlamVjdGlvblwiICsgKChlIGFzIGFueSk/LnN0YWNrIHx8IGUpKTtcbiAgICB9KTtcbiAgICBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIiwgKGUpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVuY2F1Z2h0IGV4Y2VwdGlvblwiICsgKChlIGFzIGFueSk/LnN0YWNrIHx8IGUpKTtcbiAgICB9KTtcbn1cblxubW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuLy8gVGhlIGFjdGl2ZSBjYWxsJ3MgY2FsbGVyLCBwbHVzIGEgc2VxdWVuY2UgbnVtYmVyIHVzZWQgdG8gcmVzZXQgaXQgc3luY2hyb25vdXNseSAoc2VlXG4vLyAgX3NldFNvY2tldENvbnRleHQpLiBTaGFyZWQgYWNyb3NzIGNvcGllcyBvZiB0aGlzIHBhY2thZ2UsIHNvIFNvY2tldEZ1bmN0aW9uLmdldENhbGxlcigpXG4vLyAgcmV0dXJucyB0aGUgcmlnaHQgY2FsbGVyIGV2ZW4gd2hlbiB0aGUgY2FsbCB3YXMgc2V0IHVwIGJ5IGEgZGlmZmVyZW50IGNvcHkuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBzb2NrZXRDb250ZXh0ID0gY3JlYXRlU2luZ2xldG9uKFwiU29ja2V0RnVuY3Rpb24uc29ja2V0Q29udGV4dFwiLCAxLCAoKSA9PiAoe1xuICAgIHNlcU51bTogMSxcbiAgICBjYWxsZXI6IHVuZGVmaW5lZCBhcyBDYWxsZXJDb250ZXh0IHwgdW5kZWZpbmVkLFxufSkpO1xuXG50eXBlIEV4dHJhY3RTaGFwZTxDbGFzc1R5cGUsIFNoYXBlPiA9IHtcbiAgICBba2V5IGluIGtleW9mIENsYXNzVHlwZV06IChcbiAgICAgICAga2V5IGV4dGVuZHMga2V5b2YgU2hhcGVcbiAgICAgICAgPyBDbGFzc1R5cGVba2V5XSBleHRlbmRzIFNvY2tldEV4cG9zZWRJbnRlcmZhY2VbXCJcIl1cbiAgICAgICAgPyBDbGFzc1R5cGVba2V5XVxuICAgICAgICA6IENsYXNzVHlwZVtrZXldIGV4dGVuZHMgRnVuY3Rpb24gPyBcIkFsbCBleHBvc2VkIGZ1bmN0aW9uIG11c3QgYmUgYXN5bmMgKG9yIHJldHVybiBhIFByb21pc2UpXCIgOiBuZXZlclxuICAgICAgICA6IFwiRnVuY3Rpb24gaGFzIGltcGxlbWVudGF0aW9uIGJ1dCBpcyBub3QgZXhwb3NlZCBpbiB0aGUgU29ja2V0RnVuY3Rpb24ucmVnaXN0ZXIgY2FsbFwiXG4gICAgKTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRGdW5jdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyBsb2dNZXNzYWdlcyA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgdHJhY2tNZXNzYWdlU2l6ZXMgPSB7XG4gICAgICAgIHVwbG9hZDogW10gYXMgKChzaXplOiBudW1iZXIpID0+IHZvaWQpW10sXG4gICAgICAgIGRvd25sb2FkOiBbXSBhcyAoKHNpemU6IG51bWJlcikgPT4gdm9pZClbXSxcbiAgICAgICAgY2FsbFRpbWVzOiBbXSBhcyAoKG9iajogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgfSkgPT4gdm9pZClbXSxcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBNQVhfTUVTU0FHRV9TSVpFID0gMTAyNCAqIDEwMjQgKiAzMjtcblxuICAgIHB1YmxpYyBzdGF0aWMgSFRUUF9FVEFHX0NBQ0hFID0gZmFsc2U7XG4gICAgcHVibGljIHN0YXRpYyBzaWxlbnQgPSB0cnVlO1xuXG4gICAgcHVibGljIHN0YXRpYyBIVFRQX0NPTVBSRVNTID0gZmFsc2U7XG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBIVFRQIHJlc291cmNlcyB0aGF0IHJlcXVpcmUgY29va2llcyB5b3UgbWlnaHQgdG8gc2V0IGBTb2NrZXRGdW5jdGlvbi5DT0VQID0gXCJyZXF1aXJlLWNvcnBcImBcbiAgICAvLyAgLSBDcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LlxuICAgIHB1YmxpYyBzdGF0aWMgQ09FUCA9IFwiY3JlZGVudGlhbGxlc3NcIjtcbiAgICAvLyBOT1RFOiBUaGlzIENPT1AgYW5kIENPRVAgZGVmYXVsdHMgYXJlIHJlcXVpcmVkIHNvIHdpbmRvdy5jcm9zc09yaWdpbklzb2xhdGVkIHdpbGwgYmUgdHJ1ZS5cbiAgICBwdWJsaWMgc3RhdGljIENPT1AgPSBcInNhbWUtb3JpZ2luXCI7XG5cbiAgICBwdWJsaWMgc3RhdGljIFRPVEFMX0NBTExTID0gMDtcblxuICAgIHB1YmxpYyBzdGF0aWMgRU5BQkxFX0NMSUVOVF9NT0RFID0gZmFsc2U7XG4gICAgLy8gUGxhY2VzIHdoZXJlIHdlIGRlY2lkZSBpZiB3ZSB3YW50IHRvIGFjdCBhcyBhIGNsaWVudC4gTW9zdCBwbGFjZXMgd2UgY2hlY2sgZm9yIGlzIG5vZGUsIGJ1dCBzb21lIHBsYWNlcyBpdCdzIG5vdCwgZGVwZW5kaW5nIG9uIGlmIHdlJ3JlIGluIE5vZGUuanMgb3Igbm90LCBpdCdzIGRlcGVuZGluZyBvbiBpZiB3ZSdyZSBhIGNsaWVudCBvciBub3QuXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWVudCgpIHsgcmV0dXJuICFpc05vZGUoKSB8fCBTb2NrZXRGdW5jdGlvbi5FTkFCTEVfQ0xJRU5UX01PREU7IH1cblxuICAgIC8vIEluIHJldHJvc3BlY3QuLi4gZHluYW1pY2FsbHkgY2hhbmdpbmcgdGhlIHdpcmUgc2VyaWFsaXplciBpcyBhIEJBRCBpZGVhLiBJZiBhbnkgY2FsbHMgaGFwcGVuXG4gICAgLy8gIGJlZm9yZSBpdCBpcyBjaGFuZ2VkLCB0aGluZ3MganVzdCBicmVhay4gQWxzbywgaXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBvbiBib3RoIHNpZGVzLFxuICAgIC8vICBvciBlbHNlIHRoaW5ncyBicmVhay4gQWxzbywgaXQgaXMgdmVyeSBoYXJkIHRvIGRldGVjdCB3aGVuIHRoZSBpc3N1ZSBpcyBkaWZmZXJlbnQgc2VyaWFsaXplcnNcbiAgICAvLyBOT1RFOiBUaGUgb25seSByZWFzb24gdGhpcyBpcyBzdGlsbCBleHBvc2VkIGlzIGluIGNhc2UgaW4gdGhlIGZ1dHVyZSB3ZSB3YW50IHRvIGludGVyY2VwdCBvdXIgdHJhZmZpYywgYW5kIHdlIHdhbnQgY29udmVuaWVudCBmdW5jdGlvbnMgdG8ga25vdyBob3cgdG8gZGVjb2RlIGl0IChhbHRob3VnaCB0aGVyZSBhcmUgYSBzdGlsbCBmZXcgb3RoZXIgbGF5ZXJzIHVuZGVyIHRoaXMsIGZvciBjb21wcmVzc2lvbiBhbmQgQnVmZmVyW10gc2VuZGluZyBlZmZpY2llbmN5KS5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFdJUkVfU0VSSUFMSVpFUiA9IHtcbiAgICAgICAgc2VyaWFsaXplOiBtZWFzdXJlV3JhcCgob2JqOiB1bmtub3duKTogTWF5YmVQcm9taXNlPEJ1ZmZlcltdPiA9PiBbY2JvcnhJbnN0YW5jZS5lbmNvZGUob2JqKV0sIFwiV0lSRV9TRVJJQUxJWkVSfHNlcmlhbGl6ZVwiKSxcbiAgICAgICAgZGVzZXJpYWxpemU6IG1lYXN1cmVXcmFwKChidWZmZXJzOiBCdWZmZXJbXSk6IE1heWJlUHJvbWlzZTx1bmtub3duPiA9PiBjYm9yeEluc3RhbmNlLmRlY29kZShidWZmZXJzWzBdKSwgXCJXSVJFX1NFUklBTElaRVJ8ZGVzZXJpYWxpemVcIiksXG4gICAgfTtcblxuICAgIC8qKiBXZSB3aWxsIHRyeSB0aGUgYWx0ZXJuYXRlIG5vZGUgSURzIGZpcnN0LCBob3dldmVyLCBpZiB0aGV5IGZhaWwsIHdlIHdpbGwgZ28gdGhyb3VnaCBhbGwgb2YgdGhlbSBhbmQgdGhlbiBldmVudHVhbGx5IHRyeSB0aGUgb3JpZ2luYWwgbm9kZSBJRC4gXG4gICAgICogICAgICBWRVJZIHVzZWZ1bCwgYWxsb3dpbmcgdXMgdG8gY2hhbmdlIGdsb2JhbCBpcHMgdG8gbG9jYWwgb25lcywgd2hpY2ggc2hvcnQtY2lyY3VpdHMgdGhlIHJvdXRlciwgbWFzc2l2ZWx5IGluY3JlYXNpbmcgYmFuZHdpZHRoIGFuZCBkZWNyZWFzaW5nIGxhdGVuY3kuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBHRVRfQUxURVJOQVRFX05PREVfSURTID0gKG5vZGVJZDogc3RyaW5nKTogTWF5YmVQcm9taXNlPHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9PiB1bmRlZmluZWQ7XG5cbiAgICBwdWJsaWMgc3RhdGljIFdJUkVfV0FSTl9USU1FID0gMTAwO1xuXG4gICAgLy8gU2hhcmVkIGFjcm9zcyBjb3BpZXMgb2YgdGhpcyBwYWNrYWdlLCBzbyBvbk1vdW50IGNhbGxiYWNrcyByZWdpc3RlcmVkIHRocm91Z2ggb25lIGNvcHkgc3RpbGxcbiAgICAvLyAgZmlyZSB3aGVuIGFub3RoZXIgY29weSBtb3VudHMuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG4gICAgcHJpdmF0ZSBzdGF0aWMgb25Nb3VudENhbGxiYWNrcyA9IGNyZWF0ZVNpbmdsZXRvbihcIlNvY2tldEZ1bmN0aW9uLm9uTW91bnRDYWxsYmFja3NcIiwgMSwgKCkgPT4gbmV3IE1hcDxzdHJpbmcsICgoKSA9PiBNYXliZVByb21pc2U8dm9pZD4pW10+KCkpLmdldCgpO1xuICAgIC8vIFNoYXJlZCBhY3Jvc3MgY29waWVzIG9mIHRoaXMgcGFja2FnZSwgc28gdGhlIHNldCBvZiBleHBvc2VkIGNsYXNzZXMgaXMgY29uc2lzdGVudCByZWdhcmRsZXNzXG4gICAgLy8gIG9mIHdoaWNoIGNvcHkgYSBjbGFzcyB3YXMgZXhwb3NlZCB0aHJvdWdoLiBTZWUgY3JlYXRlU2luZ2xldG9uLlxuICAgIHByaXZhdGUgc3RhdGljIGV4cG9zZWRDbGFzc2VzU2luZ2xldG9uID0gY3JlYXRlU2luZ2xldG9uKFwiU29ja2V0RnVuY3Rpb24uZXhwb3NlZENsYXNzZXNcIiwgMSwgKCkgPT4gbmV3IFNldDxzdHJpbmc+KCkpO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGV4cG9zZWRDbGFzc2VzKCkgeyByZXR1cm4gU29ja2V0RnVuY3Rpb24uZXhwb3NlZENsYXNzZXNTaW5nbGV0b24uZ2V0KCk7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IGNhbGxlckNvbnRleHQoKTogQ2FsbGVyQ29udGV4dCB8IHVuZGVmaW5lZCB7IHJldHVybiBzb2NrZXRDb250ZXh0LmdldCgpLmNhbGxlcjsgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IGNhbGxlckNvbnRleHQodmFsdWU6IENhbGxlckNvbnRleHQgfCB1bmRlZmluZWQpIHsgc29ja2V0Q29udGV4dC5nZXQoKS5jYWxsZXIgPSB2YWx1ZTsgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q2FsbGVyKCk6IENhbGxlckNvbnRleHQge1xuICAgICAgICBjb25zdCBjYWxsZXIgPSBTb2NrZXRGdW5jdGlvbi5jYWxsZXJDb250ZXh0O1xuICAgICAgICBpZiAoIWNhbGxlcikgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBhY2Nlc3MgY2FsbGVyIHdoZW4gbm90IGluIHRoZSBzeW5jaHJvbm91cyBwaGFzZSBvZiBhIGZ1bmN0aW9uIGNhbGxgKTtcbiAgICAgICAgcmV0dXJuIGNhbGxlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhcnZlc3RGYWlsZWRDYWxsQ291bnQgPSAoKSA9PiBoYXJ2ZXN0RmFpbGVkQ2FsbENvdW50KCk7XG4gICAgcHVibGljIHN0YXRpYyBnZXRQZW5kaW5nQ2FsbENvdW50ID0gKCkgPT4gZ2V0UGVuZGluZ0NhbGxDb3VudCgpO1xuICAgIHB1YmxpYyBzdGF0aWMgaGFydmVzdENhbGxUaW1lcyA9ICgpID0+IGhhcnZlc3RDYWxsVGltZXMoKTtcblxuICAgIC8vIE5PVEU6IFdlIHVzZSBjYWxsYmFja3Mgd2UgZG9uJ3QgcnVuIGludG8gaXNzdWVzIHdpdGggY3ljbGljIGRlcGVuZGVuY2llc1xuICAgIC8vICAoZXgsIHVzaW5nIGEgaG9vayBpbiBhIGNvbnRyb2xsZXIgd2hlcmUgdGhlIGhvb2sgYWxzbyBjYWxscyB0aGUgY29udHJvbGxlcikuXG4gICAgLypcbiAgICAgICAgZXhwb3J0IGNvbnN0IERpc2tMb2dnZXJDb250cm9sbGVyID0gU29ja2V0RnVuY3Rpb24ucmVnaXN0ZXIoXG4gICAgICAgICAgICAvLyBDYW4gYmUgYW55dGhpbmcsIGJ1dCBzaG91bGQgYmUgdW5pcXVlIGFtb25nc3Qgb3RoZXIgY29udHJvbGxlcnMgb24geW91ciBzZXJ2ZXIuXG4gICAgICAgICAgICBcIkRpc2tMb2dnZXJDb250cm9sbGVyLWY3NmE2ZmRmLTNiZDUtNGJkNC1hMTgzLTU1YThiZTBhNWEzMlwiLFxuICAgICAgICAgICAgLy8gQ29udGFpbnMgdGhlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBleHBvc2VkLCB3aGljaCBtdXN0IGFsbCBiZSBhc3luYy5cbiAgICAgICAgICAgIC8vICBPbmx5IHRob3NlIGxpc3RlZCBiZWxvdyB3aWxsIGJlIGV4cG9zZWQuXG4gICAgICAgICAgICBuZXcgRGlza0xvZ2dlckNvbnRyb2xsZXJCYXNlKCksXG4gICAgICAgICAgICAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgZnVuY3Rpb25zIGxpc3RlZCBoZXJlIHdpbGwgYmUgZXhwb3NlZFxuICAgICAgICAgICAgICAgIGdldFJlbW90ZUxvZ0ZpbGVzOiB7fSxcbiAgICAgICAgICAgICAgICBnZXRSZW1vdGVMb2dCdWZmZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIFNvY2tldEZ1bmN0aW9uQ2xpZW50SG9va1tdXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudEhvb2tzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG92ZXJyaWRlUmVzdWx0IGlzIHNldCwgaXQgc2tpcHMgdGhlIGNhbGwgYW5kIHJldHVybnMgb3ZlcnJpZGVSZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Lm92ZXJyaWRlUmVzdWx0ID0gQnVmZmVyLmZyb20oLi4uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBob29rcyBmb3IgYWxsIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFNvY2tldEZ1bmN0aW9uSG9va1tdXG4gICAgICAgICAgICAgICAgaG9va3M6IFthc3NlcnRJc01hbmFnZW1lbnRVc2VyXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIEFkZGl0aW9uYWx5IGZsYWdzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyPFxuICAgICAgICBDbGFzc0luc3RhbmNlIGV4dGVuZHMgb2JqZWN0LFxuICAgICAgICBTaGFwZSBleHRlbmRzIFNvY2tldEV4cG9zZWRTaGFwZTx7XG4gICAgICAgICAgICBba2V5IGluIGtleW9mIENsYXNzSW5zdGFuY2VdOiAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgICAgIH0+LFxuICAgICAgICBTdGF0aWNzXG4gICAgPihcbiAgICAgICAgY2xhc3NHdWlkOiBzdHJpbmcsXG4gICAgICAgIGluc3RhbmNlOiBDbGFzc0luc3RhbmNlIHwgKCgpID0+IENsYXNzSW5zdGFuY2UpLFxuICAgICAgICBzaGFwZUZuYzogKCkgPT4gU2hhcGUsXG4gICAgICAgIGRlZmF1bHRIb29rc0ZuYz86ICgpID0+IFNvY2tldEV4cG9zZWRTaGFwZVtcIlwiXSAmIHtcbiAgICAgICAgICAgIG9uTW91bnQ/OiAoKSA9PiBNYXliZVByb21pc2U8dm9pZD47XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZz86IHtcbiAgICAgICAgICAgIC8qKiBAbm9BdXRvRXhwb3NlIElmIHRydWUgU29ja2V0RnVuY3Rpb24uZXhwb3NlKENvbnRyb2xsZXIpIG11c3QgYmUgY2FsbGVkIGV4cGxpY2l0bHkuICovXG4gICAgICAgICAgICBub0F1dG9FeHBvc2U/OiBib29sZWFuO1xuICAgICAgICAgICAgc3RhdGljcz86IFN0YXRpY3M7XG4gICAgICAgICAgICAvKiogU2tpcCB0aW1pbmcgZnVuY3Rpb25zIGNhbGxzLiBVc2VmdWwgaWYgYSBsb3Qgb2YgZnVuY3Rpb25zIGhhdmUgd2FpdCB0aW1lIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgaXMgdW5yZWxhdGVkIHRvIHByb2Nlc3NpbmcsIGFuZCB0aGVyZWZvcmUgdGhlaXIgdGltaW5ncyB3b24ndCBiZSB1c2VmdWwuXG4gICAgICAgICAgICAgICAgICAgIC0gQWxzbyB1c2VmdWwgaWYgb3VyIGF1dG8gZnVuY3Rpb24gd3JhcHBpbmcgY29kZSBpcyBicmVha2luZyBmdW5jdGlvbmFsaXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBpZiB5b3UgaGF2ZSBhIHNpbmdsZXRvbiBmdW5jdGlvbiB3aGljaCB5b3UgY29tcGFyZSB3aXRoID09PSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYnJlYWtzIGJlY2F1c2Ugd2UgcmVwbGFjZWQgaXQgd2l0aCBhIHdyYXBwZWQgbWVhc3VyZSBmdW5jdGlvbi5cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBub0Z1bmN0aW9uTWVhc3VyZT86IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICApOiBTb2NrZXRSZWdpc3RlcmVkPEV4dHJhY3RTaGFwZTxDbGFzc0luc3RhbmNlLCBTaGFwZT4+ICYgU3RhdGljcyB7XG4gICAgICAgIGxldCBpbnN0YW5jZUZuYyA9IGxhenkodHlwZW9mIGluc3RhbmNlID09PSBcImZ1bmN0aW9uXCIgPyBpbnN0YW5jZSA6ICgpID0+IGluc3RhbmNlKTtcbiAgICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxldCBvbk1vdW50ID0gZ2V0RGVmYXVsdEhvb2tzPy4oKS5vbk1vdW50O1xuICAgICAgICAgICAgaWYgKG9uTW91bnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gU29ja2V0RnVuY3Rpb24ub25Nb3VudENhbGxiYWNrcy5nZXQoY2xhc3NHdWlkKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgU29ja2V0RnVuY3Rpb24ub25Nb3VudENhbGxiYWNrcy5zZXQoY2xhc3NHdWlkLCBjYWxsYmFja3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFja3MucHVzaChvbk1vdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGdldERlZmF1bHRIb29rcyA9IGRlZmF1bHRIb29rc0ZuYyAmJiBsYXp5KGRlZmF1bHRIb29rc0ZuYyk7XG4gICAgICAgIGNvbnN0IGdldFNoYXBlID0gbGF6eSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc2hhcGUgPSBzaGFwZUZuYygpIGFzIFNvY2tldEV4cG9zZWRTaGFwZTtcbiAgICAgICAgICAgIGxldCBkZWZhdWx0SG9va3MgPSBnZXREZWZhdWx0SG9va3M/LigpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKHNoYXBlKSkge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWUubm9DbGllbnRIb29rcykge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jbGllbnRIb29rcyA9IFsuLi4oZGVmYXVsdEhvb2tzPy5jbGllbnRIb29rcyB8fCBbXSksIC4uLih2YWx1ZS5jbGllbnRIb29rcyB8fCBbXSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubm9EZWZhdWx0SG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuaG9va3MgPSBbLi4uKHZhbHVlLmhvb2tzIHx8IFtdKV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuaG9va3MgPSBbLi4uKGRlZmF1bHRIb29rcz8uaG9va3MgfHwgW10pLCAuLi4odmFsdWUuaG9va3MgfHwgW10pXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUuZGF0YUltbXV0YWJsZSA9IGRlZmF1bHRIb29rcz8uZGF0YUltbXV0YWJsZSA/PyB2YWx1ZS5kYXRhSW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNoYXBlIGFzIGFueSBhcyBTb2NrZXRFeHBvc2VkU2hhcGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdhaXQsIHNvIGFueSBjb25zdGFudHMgcmVmZXJlbmNlZCBieSB0aGUgYmFzZSBzaGFwZUZuYyB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkXG4gICAgICAgIC8vICBieSBub3cuIFRoaXMgaXMgSU1QT1JUQU5ULCBhcyBpdCBhbGxvd3MgcGVybWlzc2lvbnMgZnVuY3Rpb25zIHRvIGJlIG1vdmVkXG4gICAgICAgIC8vICB0byBhIGNvbW1vbiBtb2R1bGUsIGluc3RlYWQgb2YgYWxsIGJlaW5nIGlubGluZS5cbiAgICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJlZ2lzdGVyQ2xhc3MoY2xhc3NHdWlkLCBpbnN0YW5jZUZuYygpIGFzIFNvY2tldEV4cG9zZWRJbnRlcmZhY2UsIGdldFNoYXBlKCksIHtcbiAgICAgICAgICAgICAgICBub0Z1bmN0aW9uTWVhc3VyZTogY29uZmlnPy5ub0Z1bmN0aW9uTWVhc3VyZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgc29ja2V0Q2FsbGVyID0gU29ja2V0RnVuY3Rpb24ucmVoeWRyYXRlU29ja2V0Q2FsbGVyKHtcbiAgICAgICAgICAgIF9jbGFzc0d1aWQ6IGNsYXNzR3VpZCxcbiAgICAgICAgICAgIF9pbnRlcm5hbFR5cGU6IG51bGwgYXMgYW55LFxuICAgICAgICB9LCBnZXRTaGFwZSk7XG5cbiAgICAgICAgaWYgKCFjb25maWc/Lm5vQXV0b0V4cG9zZSkge1xuICAgICAgICAgICAgdGhpcy5leHBvc2Uoc29ja2V0Q2FsbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzb2NrZXRDYWxsZXIsIGNvbmZpZz8uc3RhdGljcykgYXMgYW55O1xuICAgIH1cblxuICAgIC8vIFNoYXJlZCBhY3Jvc3MgY29waWVzIG9mIHRoaXMgcGFja2FnZSwgc28gYSBnaXZlbiBjbGFzc0d1aWQgcmVzb2x2ZXMgdG8gb25lIGNhbm9uaWNhbCBjYWxsZXJcbiAgICAvLyAgcmVnYXJkbGVzcyBvZiB3aGljaCBjb3B5IHJlaHlkcmF0ZWQgaXQuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG4gICAgcHJpdmF0ZSBzdGF0aWMgc29ja2V0Q2FjaGUgPSBjcmVhdGVTaW5nbGV0b24oXCJTb2NrZXRGdW5jdGlvbi5zb2NrZXRDYWNoZVwiLCAxLCAoKSA9PiBuZXcgTWFwPHN0cmluZywgU29ja2V0UmVnaXN0ZXJlZD4oKSkuZ2V0KCk7XG4gICAgcHVibGljIHN0YXRpYyByZWh5ZHJhdGVTb2NrZXRDYWxsZXI8Q29udHJvbGxlcj4oXG4gICAgICAgIHNvY2tldFJlZ2lzdGVyZWQ6IFNvY2tldFJlZ2lzdGVyVHlwZTxDb250cm9sbGVyPixcbiAgICAgICAgLy8gU2hhcGUgaXMgcmVxdWlyZWQgZm9yIGNsaWVudCBob29rcy5cbiAgICAgICAgc2hhcGVGbmM/OiAoKSA9PiBTb2NrZXRFeHBvc2VkU2hhcGUsXG4gICAgKTogU29ja2V0UmVnaXN0ZXJlZDxDb250cm9sbGVyPiB7XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLnNvY2tldENhY2hlLmdldChzb2NrZXRSZWdpc3RlcmVkLl9jbGFzc0d1aWQpO1xuICAgICAgICBpZiAoIWNhY2hlZCkge1xuICAgICAgICAgICAgbGV0IGdldFNoYXBlID0gbGF6eSgoKSA9PiBzaGFwZUZuYz8uKCkpO1xuICAgICAgICAgICAgbGV0IGNsYXNzR3VpZCA9IHNvY2tldFJlZ2lzdGVyZWQuX2NsYXNzR3VpZDtcbiAgICAgICAgICAgIGxldCBub2RlUHJveHkgPSBnZXRDYWxsUHJveHkoY2xhc3NHdWlkLCBhc3luYyAoY2FsbCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBTb2NrZXRGdW5jdGlvbi5jYWxsRnJvbUd1aWQoY2FsbCwgY2xhc3NHdWlkLCBnZXRTaGFwZSgpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjYWNoZWQgPSB7XG4gICAgICAgICAgICAgICAgbm9kZXM6IG5vZGVQcm94eSxcbiAgICAgICAgICAgICAgICBfY2xhc3NHdWlkOiBjbGFzc0d1aWQsXG4gICAgICAgICAgICAgICAgX2ludGVybmFsVHlwZTogbnVsbCBhcyBhbnksXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnNvY2tldENhY2hlLnNldChjbGFzc0d1aWQsIGNhY2hlZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBjYWxsRnJvbUd1aWQ8Rm5jVCBleHRlbmRzIEZuY1R5cGU+KFxuICAgICAgICBjYWxsOiBGdWxsQ2FsbFR5cGU8Rm5jVD4sXG4gICAgICAgIGNsYXNzR3VpZDogc3RyaW5nLFxuICAgICAgICBzaGFwZT86IFNvY2tldEV4cG9zZWRTaGFwZSxcbiAgICApOiBQcm9taXNlPFJldHVyblR5cGU8Rm5jVHlwZT4+IHtcbiAgICAgICAgbGV0IG5vZGVJZCA9IGNhbGwubm9kZUlkO1xuICAgICAgICBsZXQgZnVuY3Rpb25OYW1lID0gY2FsbC5mdW5jdGlvbk5hbWU7XG4gICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKFNvY2tldEZ1bmN0aW9uLmxvZ01lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgU1RBUlRcXHRcXHRcXHQke2NsYXNzR3VpZH0uJHtmdW5jdGlvbk5hbWV9IGF0ICR7RGF0ZS5ub3coKX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNhbGxGYWN0b3J5ID0gYXdhaXQgZ2V0Q3JlYXRlQ2FsbEZhY3Rvcnkobm9kZUlkKTtcblxuICAgICAgICAgICAgbGV0IHNoYXBlT2JqID0gc2hhcGU/LltmdW5jdGlvbk5hbWVdO1xuICAgICAgICAgICAgaWYgKCFzaGFwZU9iaikge1xuICAgICAgICAgICAgICAgIHNoYXBlT2JqID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOT1RFOiBBY3R1YWxseS4uLiB0aGlzIGp1c3QgbWVhbnMgdGhlIGNsaWVudCBkb2Vzbid0IGhhdmUgYSBkZWZpbml0aW9uIGZvciBpdC4gVGhlIHNlcnZlclxuICAgICAgICAgICAgLy8gIG1pZ2h0LCBzbyBjYWxsIGl0LCBhbmQgbGV0IHRoZW0gdGhyb3cgaWYgaXQgaXMgdW5yZWNvZ25pemVkLlxuICAgICAgICAgICAgLy8gaWYgKCFzaGFwZU9iaikge1xuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb24gJHtmdW5jdGlvbk5hbWV9IGlzIG5vdCBpbiBzaGFwZWApO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBsZXQgaG9va1Jlc3VsdCA9IGF3YWl0IHJ1bkNsaWVudEhvb2tzKGNhbGwsIHNoYXBlT2JqIGFzIEV4Y2x1ZGU8U29ja2V0RXhwb3NlZFNoYXBlW1wiXCJdLCB1bmRlZmluZWQ+LCBjYWxsRmFjdG9yeS5jb25uZWN0aW9uSWQpO1xuXG4gICAgICAgICAgICBpZiAoXCJvdmVycmlkZVJlc3VsdFwiIGluIGhvb2tSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiBob29rUmVzdWx0Lm9uUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNhbGxiYWNrKGhvb2tSZXN1bHQub3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXCJvdmVycmlkZVJlc3VsdFwiIGluIGhvb2tSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhvb2tSZXN1bHQub3ZlcnJpZGVSZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgY2FsbEZhY3RvcnkucGVyZm9ybUNhbGwoY2FsbCk7XG4gICAgICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiBob29rUmVzdWx0Lm9uUmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcIm92ZXJyaWRlUmVzdWx0XCIgaW4gaG9va1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBob29rUmVzdWx0Lm92ZXJyaWRlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgICAgIGlmIChTb2NrZXRGdW5jdGlvbi5sb2dNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGSU5JU0hFRFxcdCR7dGltZX1tc1xcdCR7Y2xhc3NHdWlkfS4ke2Z1bmN0aW9uTmFtZX0gYXQgJHtEYXRlLm5vdygpfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIFdpbGwgZGVkdXBlIGNhbGxiYWNrcywgc28gaWYgeW91IGNhbGwgd2l0aCB0aGUgc2FtZSBjYWxsYmFjayBpdCB3b24ndCBjYWxsIGl0IG11bHRpcGxlIHRpbWVzIChvdGhlcndpc2UgaXQncyBkaWZmaWN1bHQgdG8gbWFuYWdlIHRoaXMsIGFzIHRoaXMgb25seSBjYWxscyBvbiB0aGUgTkVYVCBjYWxsYmFjaykuXG4gICAgICAgIElNUE9SVEFOVCEgQ2xpZW50IG5vZGUgaWRzIHdpbGwgTkVWRVIgcmVjb25uZWN0LCBzbyB0aGlzIGNhbiBmdWxsIGNsZWFudXAuIEhvd2V2ZXIgZnVsbCBub2RlSWRzIG1pZ2h0IGlmIHdlIHRyeSB0byB1c2UgdGhhdCBub2RlSWQgYWdhaW4sIHNvIHRoaXMgY2Fubm90IGZ1bGx5IGNsZWFuIHRoZW0gdXAuXG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG9uTmV4dERpc2Nvbm5lY3QoXG4gICAgICAgIG5vZGVJZDogc3RyaW5nLFxuICAgICAgICBjYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICAgICAgLy8gTk9URTogSXQncyBpbXBvcnRhbnQgdG8ga25vdyB0aGF0IHVubGlrZSBjbGllbnQgaWRzLCBzZXJ2ZXIgaWRzIChhIG5vZGVJZCBZT1UgY29ubmVjdCB0bywgaW5zdGVhZCBvZiBjb25uZWN0aW5nIHRvIHlvdSksIG1pZ2h0IGJlIGFsaXZlIGFnYWluLCBhbmQgc28geW91IG5lZWQgc29tZSBraW5kIG9mIGxvZ2ljIHRvIHRyeSBpdCBhZ2FpbiBvciBpbiBzb21lIHdheSByZWNvbm5lY3QuIEZvciBjbGllbnRzIHlvdSBkb24ndCBuZWVkIHRvLCBhcyBpdCdzIHRoZWlyIGpvYiB0byByZWNvbm5lY3QgdG8geW91LCBhbmQgdGhleSB3aWxsIHJlY29ubmVjdCB3aXRoIGEgTkVXIG5vZGVJZC5cbiAgICAgICAgbm9TZXJ2ZXJOb2RlSWRXYXJuaW5nPzogXCJpS25vd1RoYXRTZXJ2ZXJOb2RlSWRzTWF5UmVjb25uZWN0X2FuZElIYW5kbGVSZWNvbm5lY3Rpb25zXCJcbiAgICApIHtcbiAgICAgICAgaWYgKCFpc0NsaWVudE5vZGVJZChub2RlSWQpICYmICFub1NlcnZlck5vZGVJZFdhcm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFdhdGNoaW5nIGZvciBkaXNjb25uZWN0aW9ucyBvZiAke25vZGVJZH0uIFRoaXMgaXMgYSBzZXJ2ZXIgbm9kZUlkIGFuZCBtYXkgYmUgYWxpdmUgYWdhaW4gYWZ0ZXIgZGlzY29ubmVjdGlvbi4gUGxlYXNlIHNldCB0aGUgbm9TZXJ2ZXJOb2RlSWRXYXJuaW5nIGZsYWcgaW4gdGhpcyBhcmd1bWVudCB0byBjb25maXJtIHlvdSBhcmUgaGFuZGxpbmcgcmVjb25uZWN0aW5nIGlmIHRoZSBzZXJ2ZXIgYmVjb21lcyBhdmFpbGFibGUgYWdhaW4uYCk7XG4gICAgICAgIH1cbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBmYWN0b3J5ID0gYXdhaXQgZ2V0Q2FsbEZhY3Rvcnkobm9kZUlkKTtcbiAgICAgICAgICAgIGlmICghZmFjdG9yeSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzA7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IGF3YWl0IGdldENhbGxGYWN0b3J5KG5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5KSBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBnZXQgY2FsbCBmYWN0b3J5IGZvciAke25vZGVJZH0gYWZ0ZXIgMzAgc2Vjb25kcywgZ2l2aW5nIHVwLmApO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmYWN0b3J5Lm9uTmV4dERpc2Nvbm5lY3QoY2FsbGJhY2spO1xuICAgICAgICB9KSgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldExhc3REaXNjb25uZWN0VGltZShub2RlSWQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBmYWN0b3J5ID0gZ2V0Q2FsbEZhY3Rvcnkobm9kZUlkKTtcbiAgICAgICAgaWYgKCFmYWN0b3J5KSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFjdG9yeS5sYXN0Q2xvc2VkO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUNvbm5lY3RlZChub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZmFjdG9yeSA9IGdldENhbGxGYWN0b3J5KG5vZGVJZCk7XG4gICAgICAgIGlmICghZmFjdG9yeSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIWZhY3RvcnkuaXNDb25uZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqIE5PVEU6IE9ubHkgd29ya3MgaWYgdGhlIG5vZGVJcyB1c2VkIGlzIGZyb20gU29ja2V0RnVuY3Rpb24uY29ubmVjdCAod2UgY2FuJ3QgY29udmVydCBhcmJpdHJhcnkgbm9kZUlkcyBpbnRvIHVybHMsXG4gICAgICogICAgICBhcyB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGhvdyB0byBjb250YWluIGEgbm9kZUlkKS5cbiAgICAgKiAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEhUVFBDYWxsTGluayhjYWxsOiBGdWxsQ2FsbFR5cGUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbG9jYXRpb24gPSBnZXROb2RlSWRMb2NhdGlvbihjYWxsLm5vZGVJZCk7XG4gICAgICAgIGlmICghbG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgY2FsbCBsb2NhdGlvbiBmb3Igbm9kZUlkLCBhbmQgc28gZG8gbm90IGtub3cgd2hlcmUgY2FsbCBsb2NhdGlvbiBpcy4gTm9kZUlkICR7Y2FsbC5ub2RlSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVybCA9IG5ldyBVUkwoYGh0dHBzOi8vJHtsb2NhdGlvbi5hZGRyZXNzfToke2xvY2F0aW9uLnBvcnR9YCk7XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiY2xhc3NHdWlkXCIsIGNhbGwuY2xhc3NHdWlkKTtcbiAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJmdW5jdGlvbk5hbWVcIiwgY2FsbC5mdW5jdGlvbk5hbWUpO1xuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcImFyZ3NcIiwgSlNPTi5zdHJpbmdpZnkoY2FsbC5hcmdzKSk7XG4gICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBTaGFyZWQgYWNyb3NzIGNvcGllcyBvZiB0aGlzIHBhY2thZ2UsIHNvIHN1cHByZXNzaW5nIGV4cG9zZSBjYWxscyBpbiBvbmUgY29weSBhbHNvIHN1cHByZXNzZXNcbiAgICAvLyAgdGhlbSBpbiB0aGUgb3RoZXJzLiBTZWUgY3JlYXRlU2luZ2xldG9uLlxuICAgIHByaXZhdGUgc3RhdGljIGlnbm9yZUV4cG9zZUNvdW50ID0gY3JlYXRlU2luZ2xldG9uKFwiU29ja2V0RnVuY3Rpb24uaWdub3JlRXhwb3NlQ291bnRcIiwgMSwgKCkgPT4gKHsgY291bnQ6IDAgfSkpO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaWdub3JlRXhwb3NlQ2FsbHM8VD4oY29kZTogKCkgPT4gUHJvbWlzZTxUPikge1xuICAgICAgICBTb2NrZXRGdW5jdGlvbi5pZ25vcmVFeHBvc2VDb3VudC5nZXQoKS5jb3VudCsrO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvZGUoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIFNvY2tldEZ1bmN0aW9uLmlnbm9yZUV4cG9zZUNvdW50LmdldCgpLmNvdW50LS07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRXhwb3NlIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHlvdXIgbW91bnRpbmcgb2NjdXJzLiBJdCBtb3N0bHkganVzdCBleGlzdHMgdG8gZW5zdXJlIHlvdSBpbmNsdWRlIHRoZSBjbGFzcyB0eXBlLFxuICAgICAqICAgICAgc28gdGhlIGNsYXNzIHR5cGUncyBtb2R1bGUgY29uc3RydWN0aW9uIHJ1bnMsIHdoaWNoIHNob3VsZCB0cmlnZ2VyIHJlZ2lzdGVyLiBPdGhlcndpc2UgeW91IHdvdWxkIGhhdmVcbiAgICAgKiAgICAgIHRvIGFkZCBhZGRpdGlvbmFsIGltcG9ydHMgdG8gZW5zdXJlIHRoZSByZWdpc3RlciBjYWxsIHJ1bnMuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBleHBvc2Uoc29ja2V0UmVnaXN0ZXJlZDogU29ja2V0UmVnaXN0ZXJlZCkge1xuICAgICAgICBpZiAoU29ja2V0RnVuY3Rpb24uaWdub3JlRXhwb3NlQ291bnQuZ2V0KCkuY291bnQgPiAwKSByZXR1cm47XG4gICAgICAgIGlmICghc29ja2V0UmVnaXN0ZXJlZC5fY2xhc3NHdWlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb2NrZXRGdW5jdGlvbi5leHBvc2UgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGNsYXNzR3VpZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgRXhwb3NpbmcgQ29udHJvbGxlciAke2JsdWUoc29ja2V0UmVnaXN0ZXJlZC5fY2xhc3NHdWlkKX1gKTtcbiAgICAgICAgZXhwb3NlQ2xhc3Moc29ja2V0UmVnaXN0ZXJlZCk7XG4gICAgICAgIHRoaXMuZXhwb3NlZENsYXNzZXMuYWRkKHNvY2tldFJlZ2lzdGVyZWQuX2NsYXNzR3VpZCk7XG5cbiAgICAgICAgaWYgKFNvY2tldEZ1bmN0aW9uLm1vdW50U3RhdGUuZ2V0KCkuaGFzTW91bnRlZCkge1xuICAgICAgICAgICAgbGV0IG1vdW50Q2FsbGJhY2tzID0gU29ja2V0RnVuY3Rpb24ub25Nb3VudENhbGxiYWNrcy5nZXQoc29ja2V0UmVnaXN0ZXJlZC5fY2xhc3NHdWlkKTtcbiAgICAgICAgICAgIGZvciAobGV0IG9uTW91bnQgb2YgbW91bnRDYWxsYmFja3MgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUob25Nb3VudCgpKS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGluIG9uTW91bnQgY2FsbGJhY2sgZXhwb3NlZCBhZnRlciBtb3VudFwiLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFsbCBtb3VudCBzdGF0ZSBpcyBzaGFyZWQgYWNyb3NzIGNvcGllcyBvZiB0aGlzIHBhY2thZ2UsIHNvIGEgc2Vjb25kIG1vdW50IChldmVuIGZyb20gYVxuICAgIC8vICBkaWZmZXJlbnQgY29weSkgaXMgcmVqZWN0ZWQsIGFuZCBvbk1vdW50L21vdW50UHJvbWlzZSBvYnNlcnZlcnMgZmlyZSBvbmNlIGFjcm9zcyB0aGVtIGFsbC5cbiAgICAvLyAgU2VlIGNyZWF0ZVNpbmdsZXRvbi5cbiAgICBwcml2YXRlIHN0YXRpYyBtb3VudFN0YXRlID0gY3JlYXRlU2luZ2xldG9uKFwiU29ja2V0RnVuY3Rpb24ubW91bnRTdGF0ZVwiLCAxLCAoKSA9PiB7XG4gICAgICAgIGxldCBtb3VudFJlc29sdmUhOiAoKSA9PiB2b2lkO1xuICAgICAgICBsZXQgbW91bnRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBtb3VudFJlc29sdmUgPSByZXNvbHZlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhhc01vdW50ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbW91bnRlZE5vZGVJZDogXCJcIixcbiAgICAgICAgICAgIG1vdW50ZWRJUDogXCJcIixcbiAgICAgICAgICAgIG1vdW50UmVzb2x2ZSxcbiAgICAgICAgICAgIG1vdW50UHJvbWlzZSxcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBtb3VudGVkTm9kZUlkKCkgeyByZXR1cm4gU29ja2V0RnVuY3Rpb24ubW91bnRTdGF0ZS5nZXQoKS5tb3VudGVkTm9kZUlkOyB9XG4gICAgcHVibGljIHN0YXRpYyBzZXQgbW91bnRlZE5vZGVJZCh2YWx1ZTogc3RyaW5nKSB7IFNvY2tldEZ1bmN0aW9uLm1vdW50U3RhdGUuZ2V0KCkubW91bnRlZE5vZGVJZCA9IHZhbHVlOyB9XG4gICAgcHVibGljIHN0YXRpYyBpc01vdW50ZWQoKSB7IHJldHVybiAhIXRoaXMubW91bnRlZE5vZGVJZDsgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG1vdW50ZWRJUCgpIHsgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLm1vdW50U3RhdGUuZ2V0KCkubW91bnRlZElQOyB9XG4gICAgcHVibGljIHN0YXRpYyBzZXQgbW91bnRlZElQKHZhbHVlOiBzdHJpbmcpIHsgU29ja2V0RnVuY3Rpb24ubW91bnRTdGF0ZS5nZXQoKS5tb3VudGVkSVAgPSB2YWx1ZTsgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG1vdW50UHJvbWlzZSgpIHsgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLm1vdW50U3RhdGUuZ2V0KCkubW91bnRQcm9taXNlOyB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBtb3VudChjb25maWc6IFNvY2tldFNlcnZlckNvbmZpZykge1xuICAgICAgICBpZiAodGhpcy5tb3VudGVkTm9kZUlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb2NrZXRGdW5jdGlvbiBhbHJlYWR5IG1vdW50ZWQsIG1vdW50aW5nIHR3aWNlIGluIG9uZSB0aHJlYWQgaXMgbm90IGFsbG93ZWQuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb3VudGVkSVAgPSBjb25maWcucHVibGljID8gXCIwLjAuMC4wXCIgOiBcIjEyNy4wLjAuMVwiO1xuICAgICAgICBpZiAoY29uZmlnLmlwKSB7XG4gICAgICAgICAgICB0aGlzLm1vdW50ZWRJUCA9IGNvbmZpZy5pcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgd2FpdEZvckZpcnN0VGltZVN5bmMsIHNoaW1EYXRlTm93IH0gPSBhd2FpdCBpbXBvcnQoXCIuL3RpbWUvdHJ1ZVRpbWVTaGltXCIpO1xuICAgICAgICBzaGltRGF0ZU5vdygpO1xuICAgICAgICBhd2FpdCB3YWl0Rm9yRmlyc3RUaW1lU3luYygpO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIGFueSBhZGRpdGlvbmFscyBmdW5jdGlvbnMgdG8gZXhwb3NlIHRoZW1zZWx2ZXNcbiAgICAgICAgYXdhaXQgZGVsYXkoXCJpbW1lZGlhdGVcIik7XG5cbiAgICAgICAgdGhpcy5tb3VudGVkTm9kZUlkID0gYXdhaXQgc3RhcnRTb2NrZXRTZXJ2ZXIoY29uZmlnKTtcbiAgICAgICAgU29ja2V0RnVuY3Rpb24ubW91bnRTdGF0ZS5nZXQoKS5oYXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgY2xhc3NHdWlkIG9mIFNvY2tldEZ1bmN0aW9uLmV4cG9zZWRDbGFzc2VzKSB7XG4gICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gU29ja2V0RnVuY3Rpb24ub25Nb3VudENhbGxiYWNrcy5nZXQoY2xhc3NHdWlkKTtcbiAgICAgICAgICAgIGlmICghY2FsbGJhY2tzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgU29ja2V0RnVuY3Rpb24ubW91bnRTdGF0ZS5nZXQoKS5tb3VudFJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubW91bnRlZE5vZGVJZDtcbiAgICB9XG5cbiAgICAvKiogU2V0cyB0aGUgZGVmYXVsdCBjYWxsIHdoZW4gYW4gaHR0cCByZXF1ZXN0IGlzIG1hZGUsIGJ1dCBubyBjbGFzc0d1aWQgaXMgc2V0LlxuICAgICAqICAgICAgTk9URTogQWxsIG90aGVyIGNhbGxzIHNob3VsZCBiZSBlbmRwb2ludCBjYWxscywgZXZlbiBpZiB0aG9zZSBlbmRwb2ludHMgcmV0dXJuIGEgc3RhdGljIGZpbGUgd2l0aCBhbiBIVE1MIGNvbnRlbnQgdHlwZS5cbiAgICAgKiAgICAgICAgICAtIEhvd2V2ZXIsIHRvIGxvYWQgbmV3IGNvbnRlbnQsIHlvdSBzaG91bGQgcHJvYmFibHkganVzdCB1c2UgYHJlcXVpcmUoXCIuL2V4YW1wbGUudHNcIilgLCB3aGljaCB3b3JrcyBvbiBhbnkgZmlsZXNcbiAgICAgKiAgICAgICAgICAgICAgY2xpZW50c2lkZSB0aGF0IGhhdmUgYWxzbyBiZWVuIHJlcXVpcmVkIHNlcnZlcnNpZGUgKGFuZCB3aGl0ZWxpc3RlZCB3aXRoIG1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWUsXG4gICAgICogICAgICAgICAgICAgIG9yIHdpdGggYW4gYGFsbG93Y2xpZW50LmZsYWdgIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBvciBwYXJlbnQgZGlyZWN0b3J5KS5cbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2V0RGVmYXVsdEhUVFBDYWxsPFxuICAgICAgICBSZWdpc3RlcmVkIGV4dGVuZHMgU29ja2V0UmVnaXN0ZXJlZCxcbiAgICAgICAgRnVuY3Rpb25OYW1lIGV4dGVuZHMga2V5b2YgUmVnaXN0ZXJlZFtcIm5vZGVzXCJdW1wiXCJdICYgc3RyaW5nLFxuICAgID4oXG4gICAgICAgIHJlZ2lzdGVyZWQ6IFJlZ2lzdGVyZWQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogRnVuY3Rpb25OYW1lLFxuICAgICAgICAuLi5hcmdzOiBBcmdzPFJlZ2lzdGVyZWRbXCJub2Rlc1wiXVtcIlwiXVtGdW5jdGlvbk5hbWVdPlxuICAgICkge1xuICAgICAgICBzZXREZWZhdWx0SFRUUENhbGwoe1xuICAgICAgICAgICAgY2xhc3NHdWlkOiByZWdpc3RlcmVkLl9jbGFzc0d1aWQsXG4gICAgICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbm5lY3QobG9jYXRpb246IHsgYWRkcmVzczogc3RyaW5nLCBwb3J0OiBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBnZXROb2RlSWQobG9jYXRpb24uYWRkcmVzcywgbG9jYXRpb24ucG9ydCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBicm93c2VyTm9kZUlkKCkge1xuICAgICAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBnZXQgYnJvd3NlciBub2RlSWQgb24gc2VydmVyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBlZGdlTm9kZSA9IGdldEJvb3RlZEVkZ2VOb2RlKCk7XG4gICAgICAgIGlmIChlZGdlTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGVkZ2VOb2RlLmhvc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFNvY2tldEZ1bmN0aW9uLmNvbm5lY3QoeyBhZGRyZXNzOiBsb2NhdGlvbi5ob3N0bmFtZSwgcG9ydDogK2xvY2F0aW9uLnBvcnQgfHwgNDQzIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEJyb3dzZXJOb2RlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJOb2RlSWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZEdsb2JhbEhvb2soaG9vazogU29ja2V0RnVuY3Rpb25Ib29rKSB7XG4gICAgICAgIHJlZ2lzdGVyR2xvYmFsSG9vayhob29rIGFzIFNvY2tldEZ1bmN0aW9uSG9vayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYWRkR2xvYmFsQ2xpZW50SG9vayhob29rOiBTb2NrZXRGdW5jdGlvbkNsaWVudEhvb2spIHtcbiAgICAgICAgcmVnaXN0ZXJHbG9iYWxDbGllbnRIb29rKGhvb2sgYXMgU29ja2V0RnVuY3Rpb25DbGllbnRIb29rKTtcbiAgICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICB2YXIgQk9PVEVEX0VER0VfTk9ERTogeyBob3N0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0Qm9vdGVkRWRnZU5vZGUoKSB7XG4gICAgcmV0dXJuIEJPT1RFRF9FREdFX05PREUgYXMgeyBob3N0OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gX3NldFNvY2tldENvbnRleHQ8VD4oXG4gICAgY2FsbGVyOiBDYWxsZXJDb250ZXh0LFxuICAgIGNvZGU6ICgpID0+IFQsXG4pIHtcbiAgICBsZXQgY3R4ID0gc29ja2V0Q29udGV4dC5nZXQoKTtcbiAgICBjdHguc2VxTnVtKys7XG4gICAgbGV0IHNlcU51bSA9IGN0eC5zZXFOdW07XG4gICAgY3R4LmNhbGxlciA9IGNhbGxlcjtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gY29kZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChzZXFOdW0gPT09IGN0eC5zZXFOdW0pIHtcbiAgICAgICAgICAgIGN0eC5jYWxsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59Il19
467
+ /* _JS_SOURCE_HASH = "bd19d5b73ff44d3238ed0108b3100b0ced158e36641aa6c1960f52513f69e0a8"; */
@@ -1,5 +1,5 @@
1
- /// <reference path="../../typenode/index.d.ts" />
2
- /// <reference path="../require/RequireController.d.ts" />
1
+ /// <reference types="typenode" />
2
+ /// <reference types="socket-function/require/requirecontroller" />
3
3
  /** Enables some hot reload functionality.
4
4
  * - Triggers a refresh clientside
5
5
  * - Triggers a reload server, for modules marked with `module.hotreload`
@@ -28,7 +28,7 @@ export declare function isHotReloading(): boolean;
28
28
  export declare function hotReloadingGuard(): true;
29
29
  export declare function setExternalHotReloading(value: boolean): void;
30
30
  export declare function onHotReload(callback: (modules: NodeJS.Module[]) => void): void;
31
- export declare const HotReloadController: import("../SocketFunctionTypes").SocketRegistered<{
31
+ export declare const HotReloadController: import("socket-function/SocketFunctionTypes").SocketRegistered<{
32
32
  watchFiles: () => Promise<void>;
33
33
  fileUpdated: (files: string[], changeTime: number) => Promise<void>;
34
34
  }>;