socket-function 1.1.49 → 1.2.0

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 (45) hide show
  1. package/dist/SetProcessVariables.ts.cache +9 -0
  2. package/dist/SocketFunction.ts.cache +467 -0
  3. package/hot/dist/HotReloadController.ts.cache +252 -0
  4. package/index.d.ts +1 -16
  5. package/package.json +1 -1
  6. package/require/dist/RequireController.ts.cache +386 -0
  7. package/require/dist/compileFlags.ts.cache +41 -0
  8. package/require/dist/extMapper.ts.cache +368 -0
  9. package/require/dist/require.ts.cache +676 -0
  10. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  11. package/src/dist/CallFactory.ts.cache +930 -0
  12. package/src/dist/Zip.ts.cache +156 -0
  13. package/src/dist/batching.ts.cache +377 -0
  14. package/src/dist/bits.ts.cache +121 -0
  15. package/src/dist/buffers.ts.cache +76 -0
  16. package/src/dist/caching.ts.cache +302 -0
  17. package/src/dist/callHTTPHandler.ts.cache +264 -0
  18. package/src/dist/callManager.ts.cache +159 -0
  19. package/src/dist/certStore.ts.cache +59 -0
  20. package/src/dist/createSingleton.ts.cache +62 -0
  21. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  22. package/src/dist/forwardPort.ts.cache +222 -0
  23. package/src/dist/https.ts.cache +141 -0
  24. package/src/dist/misc.ts.cache +499 -0
  25. package/src/dist/nodeCache.ts.cache +136 -0
  26. package/src/dist/nodeProxy.ts.cache +57 -0
  27. package/src/dist/protocolNegotiation.ts.cache +101 -0
  28. package/src/dist/tlsParsing.ts.cache +85 -0
  29. package/src/dist/types.ts.cache +9 -0
  30. package/src/dist/webSocketServer.ts.cache +365 -0
  31. package/src/dist/websocketFactory.ts.cache +53 -0
  32. package/src/formatting/dist/colors.ts.cache +98 -0
  33. package/src/formatting/dist/format.ts.cache +396 -0
  34. package/src/formatting/dist/logColors.ts.cache +28 -0
  35. package/src/lz4/dist/LZ4.ts.cache +53 -0
  36. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  37. package/src/profiling/dist/measure.ts.cache +338 -0
  38. package/src/profiling/dist/stats.ts.cache +202 -0
  39. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  40. package/src/profiling/getOwnTime.ts +7 -1
  41. package/src/profiling/measure.ts +25 -16
  42. package/test.ts +11 -5
  43. package/time/dist/trueTimeShim.ts.cache +656 -0
  44. package/time/trueTimeShim.d.ts +1 -16
  45. package/time/trueTimeShim.ts +7 -43
@@ -0,0 +1,252 @@
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
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
29
+ exports.HotReloadController = exports.onHotReload = exports.setExternalHotReloading = exports.hotReloadingGuard = exports.isHotReloading = exports.watchFilesAndTriggerHotReloading = void 0;
30
+ /// <reference path="../../typenode/index.d.ts" />
31
+ /// <reference path="../require/RequireController.ts" />
32
+ module.allowclient = true;
33
+ const SocketFunction_1 = require("../SocketFunction");
34
+ const caching_1 = require("../src/caching");
35
+ const createSingleton_1 = require("../src/createSingleton");
36
+ const fs = __importStar(require("fs"));
37
+ const crypto_1 = __importDefault(require("crypto"));
38
+ const misc_1 = require("../src/misc");
39
+ const logColors_1 = require("../src/formatting/logColors");
40
+ const format_1 = require("../src/formatting/format");
41
+ const RequireController_1 = require("../require/RequireController");
42
+ /** Enables some hot reload functionality.
43
+ * - Triggers a refresh clientside
44
+ * - Triggers a reload server, for modules marked with `module.hotreload`
45
+ */
46
+ function watchFilesAndTriggerHotReloading(noAutomaticBrowserWatch = false) {
47
+ SocketFunction_1.SocketFunction.expose(exports.HotReloadController);
48
+ if (!(0, misc_1.isNode)()) {
49
+ if (!noAutomaticBrowserWatch) {
50
+ exports.HotReloadController.nodes[SocketFunction_1.SocketFunction.browserNodeId()]
51
+ .watchFiles()
52
+ .catch(e => console.error("watchFiles error", e));
53
+ }
54
+ }
55
+ setInterval(() => {
56
+ for (let module of Object.values(require.cache)) {
57
+ if (!module)
58
+ continue;
59
+ hotReloadModule(module);
60
+ }
61
+ }, 5000);
62
+ }
63
+ exports.watchFilesAndTriggerHotReloading = watchFilesAndTriggerHotReloading;
64
+ // Shared across copies of this package, so the "currently hot reloading" flag is consistent no
65
+ // matter which copy set it (ex, setExternalHotReloading) or reads it (callManager.registerClass
66
+ // reads it via the globalThis.isHotReloading bridge, which each copy overwrites). See createSingleton.
67
+ const isHotReloadingState = (0, createSingleton_1.createSingleton)("HotReloadController.isHotReloading", 1, () => ({ value: false }));
68
+ function isHotReloading() {
69
+ return isHotReloadingState.get().value;
70
+ }
71
+ exports.isHotReloading = isHotReloading;
72
+ globalThis.isHotReloading = isHotReloading;
73
+ function hotReloadingGuard() {
74
+ return !isHotReloading();
75
+ }
76
+ exports.hotReloadingGuard = hotReloadingGuard;
77
+ function setExternalHotReloading(value) {
78
+ isHotReloadingState.get().value = value;
79
+ }
80
+ exports.setExternalHotReloading = setExternalHotReloading;
81
+ // Shared across copies, so callbacks registered through one copy's onHotReload still fire when the
82
+ // first-registered copy's controller performs a reload. See createSingleton.
83
+ const hotReloadCallbacks = (0, createSingleton_1.createSingleton)("HotReloadController.hotReloadCallbacks", 1, () => []).get();
84
+ function onHotReload(callback) {
85
+ hotReloadCallbacks.push(callback);
86
+ }
87
+ exports.onHotReload = onHotReload;
88
+ const hotReloadModule = (0, caching_1.cache)((module) => {
89
+ if (!module.updateContents)
90
+ return;
91
+ let interval = 1000;
92
+ let fast = false;
93
+ if (module.hotreload) {
94
+ interval = 100;
95
+ fast = true;
96
+ }
97
+ let lastHashes = new Map();
98
+ function getHash(path) {
99
+ try {
100
+ let contents = fs.readFileSync(path, "utf8");
101
+ return crypto_1.default.createHash("sha256").update(contents).digest("hex");
102
+ }
103
+ catch (_a) {
104
+ return "";
105
+ }
106
+ }
107
+ watchFile(module.filename);
108
+ for (let path of module.watchAdditionalFiles || []) {
109
+ watchFile(path);
110
+ }
111
+ function watchFile(path) {
112
+ lastHashes.set(path, getHash(path));
113
+ fs.watchFile(path, { persistent: false, interval }, (curr, prev) => {
114
+ let newHash = getHash(path);
115
+ if (newHash === lastHashes.get(path))
116
+ return;
117
+ lastHashes.set(path, newHash);
118
+ if (path === module.filename) {
119
+ console.log(`Hot reloading ${module.filename} due to change`);
120
+ }
121
+ else {
122
+ console.log(`Hot reloading ${module.filename} due to change in ${path}`);
123
+ }
124
+ doHotReload(curr.mtimeMs);
125
+ });
126
+ }
127
+ // IMPORTANT! changeTime is for benchmarking how long we took to hotreload (and nothing else)
128
+ function doHotReload(changeTime) {
129
+ var _a, _b, _c;
130
+ (_a = module.updateContents) === null || _a === void 0 ? void 0 : _a.call(module);
131
+ if ((0, misc_1.isNode)() && !module.noserverhotreload) {
132
+ if (module.hotreload
133
+ // A fairly big hack (as this could just be in a string, or something similar), but... it also VERY useful
134
+ || ((_b = module.moduleContents) === null || _b === void 0 ? void 0 : _b.includes("\nmodule.hotreload = true;" + "\n"))
135
+ || ((_c = module.moduleContents) === null || _c === void 0 ? void 0 : _c.includes("\r\nmodule.hotreload = true;" + "\r\n"))) {
136
+ console.log(`Serverside reloading ${module.id}`);
137
+ isHotReloadingState.get().value = true;
138
+ try {
139
+ module.loaded = false;
140
+ module.load(module.id);
141
+ }
142
+ catch (e) {
143
+ console.error((0, logColors_1.red)(`Error hot reloading ${module.id}`));
144
+ console.error(e);
145
+ }
146
+ finally {
147
+ setTimeout(() => {
148
+ isHotReloadingState.get().value = false;
149
+ }, 1000);
150
+ }
151
+ }
152
+ for (let callback of hotReloadCallbacks) {
153
+ callback([module]);
154
+ }
155
+ }
156
+ //module.sourceSHA256;
157
+ // crypto.createHash("sha256").update(contents).digest("hex")
158
+ if ((0, RequireController_1.getIsAllowClient)(module)) {
159
+ triggerClientSideReload({
160
+ files: [module.filename],
161
+ changeTime,
162
+ fast,
163
+ });
164
+ }
165
+ }
166
+ });
167
+ let reloadTriggering = false;
168
+ let clientWatcherNodes = new Set();
169
+ let pendingTriggerFiles = new Set();
170
+ function triggerClientSideReload(config) {
171
+ for (let file of config.files) {
172
+ pendingTriggerFiles.add(file);
173
+ }
174
+ if (reloadTriggering)
175
+ return;
176
+ reloadTriggering = true;
177
+ setTimeout(async () => {
178
+ reloadTriggering = false;
179
+ let files = Array.from(pendingTriggerFiles);
180
+ pendingTriggerFiles.clear();
181
+ for (let clientNodeId of clientWatcherNodes) {
182
+ console.log(`Notifying client of hot reload: ${clientNodeId}`, files);
183
+ exports.HotReloadController.nodes[clientNodeId].fileUpdated(files, config.changeTime).catch(() => {
184
+ console.log(`Removing erroring client: ${clientNodeId}`);
185
+ clientWatcherNodes.delete(clientNodeId);
186
+ });
187
+ }
188
+ // We need to wait, otherwise batched updates fail, WHICH, can result in updates while reloading,
189
+ // which causes missed updates.
190
+ }, config.fast ? 50 : 300);
191
+ }
192
+ class HotReloadControllerBase {
193
+ // TODO: Also hot reload when we reconnect to the server, as it is likely setup will need to
194
+ // be rerun in that case as well (for example, we need to call watchFiles again!)
195
+ async watchFiles() {
196
+ let callerId = SocketFunction_1.SocketFunction.getCaller().nodeId;
197
+ clientWatcherNodes.add(callerId);
198
+ }
199
+ // TODO: This is actually broken related to lazy loaded and server-only code, as the server will tell us a file changed, and then we'll see that we don't have it loaded, and so we will try to refresh.
200
+ // - The reason we refresh is because it might be a new file. I don't know how we could check to see if it was lazy loaded. Maybe we just shouldn't refresh ever if we can't find the module? We'll see how much we run into the extra refresh due to lazy loading...
201
+ async fileUpdated(files, changeTime) {
202
+ try {
203
+ console.groupCollapsed((0, logColors_1.magenta)(`Trigger hotreload for files ${(0, format_1.formatTime)(Date.now() - changeTime)} after file change`));
204
+ for (let file of files) {
205
+ console.log(file);
206
+ }
207
+ console.groupEnd();
208
+ let modules = [];
209
+ for (let file of files) {
210
+ file = "https://" + ((BOOTED_EDGE_NODE === null || BOOTED_EDGE_NODE === void 0 ? void 0 : BOOTED_EDGE_NODE.host) || location.host) + "/" + file;
211
+ let module = require.cache[file];
212
+ if (!module) {
213
+ console.log(`Module not found: ${file}, not reloading page`);
214
+ return;
215
+ }
216
+ if (!module.hotreload) {
217
+ console.log(`Module not hotreloadable: ${file}, reloading page to ensure new version is loaded`);
218
+ document.location.reload();
219
+ return;
220
+ }
221
+ modules.push(module);
222
+ }
223
+ for (let module of modules) {
224
+ module.loaded = false;
225
+ }
226
+ isHotReloadingState.get().value = true;
227
+ try {
228
+ await Promise.all(modules.map(module => module.load(module.filename)));
229
+ }
230
+ finally {
231
+ setTimeout(() => {
232
+ isHotReloadingState.get().value = false;
233
+ }, 1000);
234
+ }
235
+ for (let callback of hotReloadCallbacks) {
236
+ callback(modules);
237
+ }
238
+ console.log((0, logColors_1.magenta)(`Hot reload complete ${(0, format_1.formatTime)(Date.now() - changeTime)} after file change`));
239
+ }
240
+ catch (e) {
241
+ console.error(`Hot reload failed ${e.stack}`);
242
+ }
243
+ }
244
+ }
245
+ exports.HotReloadController = SocketFunction_1.SocketFunction.register("HotReloadController-032b2250-3aac-4187-8c95-75412742b8f5", new HotReloadControllerBase(), () => ({
246
+ watchFiles: {},
247
+ fileUpdated: {}
248
+ }), () => ({}), {
249
+ noAutoExpose: true,
250
+ });
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSG90UmVsb2FkQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkhvdFJlbG9hZENvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxrREFBa0Q7QUFDbEQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLHNEQUFtRDtBQUNuRCw0Q0FBNkM7QUFDN0MsNERBQXlEO0FBQ3pELHVDQUF5QjtBQUN6QixvREFBNEI7QUFFNUIsc0NBQXFDO0FBQ3JDLDJEQUEyRDtBQUMzRCxxREFBc0Q7QUFFdEQsb0VBQWdFO0FBRWhFOzs7R0FHRztBQUNILFNBQWdCLGdDQUFnQyxDQUFDLHVCQUF1QixHQUFHLEtBQUs7SUFDNUUsK0JBQWMsQ0FBQyxNQUFNLENBQUMsMkJBQW1CLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDM0IsMkJBQW1CLENBQUMsS0FBSyxDQUFDLCtCQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ3BELFVBQVUsRUFBRTtpQkFDWixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQ2hEO1FBQ1QsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2IsS0FBSyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNO2dCQUFFLFNBQVM7WUFDdEIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDYixDQUFDO0FBaEJELDRF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QUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRSxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDWixtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDYixDQUFDO1lBRUQsS0FBSyxJQUFJLFFBQVEsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBQSxtQkFBTyxFQUFDLHVCQUF1QixJQUFBLG1CQUFVLEVBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDekcsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBRVksUUFBQSxtQkFBbUIsR0FBRywrQkFBYyxDQUFDLFFBQVEsQ0FDdEQsMERBQTBELEVBQzFELElBQUksdUJBQXVCLEVBQUUsRUFDN0IsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7Q0FDbEIsQ0FBQyxFQUNGLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFFTixDQUFDLEVBQ0Y7SUFDSSxZQUFZLEVBQUUsSUFBSTtDQUNyQixDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwZW5vZGUvaW5kZXguZC50c1wiIC8+XG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vcmVxdWlyZS9SZXF1aXJlQ29udHJvbGxlci50c1wiIC8+XG5tb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBTb2NrZXRGdW5jdGlvbiB9IGZyb20gXCIuLi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgY2FjaGUsIGxhenkgfSBmcm9tIFwiLi4vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZXRvbiB9IGZyb20gXCIuLi9zcmMvY3JlYXRlU2luZ2xldG9uXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gXCIuLi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgbWFnZW50YSwgcmVkIH0gZnJvbSBcIi4uL3NyYy9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSB9IGZyb20gXCIuLi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcbmltcG9ydCB7IGJhdGNoRnVuY3Rpb24gfSBmcm9tIFwiLi4vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBnZXRJc0FsbG93Q2xpZW50IH0gZnJvbSBcIi4uL3JlcXVpcmUvUmVxdWlyZUNvbnRyb2xsZXJcIjtcblxuLyoqIEVuYWJsZXMgc29tZSBob3QgcmVsb2FkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAgIC0gVHJpZ2dlcnMgYSByZWZyZXNoIGNsaWVudHNpZGVcbiAqICAgICAgLSBUcmlnZ2VycyBhIHJlbG9hZCBzZXJ2ZXIsIGZvciBtb2R1bGVzIG1hcmtlZCB3aXRoIGBtb2R1bGUuaG90cmVsb2FkYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hGaWxlc0FuZFRyaWdnZXJIb3RSZWxvYWRpbmcobm9BdXRvbWF0aWNCcm93c2VyV2F0Y2ggPSBmYWxzZSkge1xuICAgIFNvY2tldEZ1bmN0aW9uLmV4cG9zZShIb3RSZWxvYWRDb250cm9sbGVyKTtcbiAgICBpZiAoIWlzTm9kZSgpKSB7XG4gICAgICAgIGlmICghbm9BdXRvbWF0aWNCcm93c2VyV2F0Y2gpIHtcbiAgICAgICAgICAgIEhvdFJlbG9hZENvbnRyb2xsZXIubm9kZXNbU29ja2V0RnVuY3Rpb24uYnJvd3Nlck5vZGVJZCgpXVxuICAgICAgICAgICAgICAgIC53YXRjaEZpbGVzKClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKFwid2F0Y2hGaWxlcyBlcnJvclwiLCBlKSlcbiAgICAgICAgICAgICAgICA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBtb2R1bGUgb2YgT2JqZWN0LnZhbHVlcyhyZXF1aXJlLmNhY2hlKSkge1xuICAgICAgICAgICAgaWYgKCFtb2R1bGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaG90UmVsb2FkTW9kdWxlKG1vZHVsZSk7XG4gICAgICAgIH1cbiAgICB9LCA1MDAwKTtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIG5hbWVzcGFjZSBOb2RlSlMge1xuICAgICAgICBpbnRlcmZhY2UgTW9kdWxlIHtcbiAgICAgICAgICAgIC8qKiBDYXVzZXMgdXMgdG8gaG90cmVsb2FkIHRoZSBmaWxlLiBBcHBsaWVzIGJvdGggc2VydmVyc2lkZSBhbmQgY2xpZW50c2lkZS5cbiAgICAgICAgICAgICAqICAgICAgLSBJZiBub3Qgc2V0IGZvciBhbnkgZmlsZXMgY2xpZW50c2lkZSwgd2Ugd2lsbCByZWZyZXNoLlxuICAgICAgICAgICAgICogICAgICAtIElmIG5vdCBzZXQgZm9yIGFueSBmaWxlcyBzZXJ2ZXJzaWRlLCB3ZSB3aWxsIGRvIG5vdGhpbmcgKGFuZCBqdXN0IGxlYXZlIG9sZCBjb2RlIHJ1bm5pbmcpLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBob3RyZWxvYWQ/OiBib29sZWFuO1xuICAgICAgICAgICAgLyoqIE92ZXJyaWRlcyBob3RyZWxvYWQgdG8gZGlzYWJsZSBob3QgcmVsb2FkaW5nLiBVc2VmdWwgaWYgeW91IGFkZCBcImhvdHJlbG9hZC5mbGFnXCIgdG8gYSBkaXJlY3RvcnlcbiAgICAgICAgICAgICAqICAgICAgKHdoaWNoIHNldHMgaG90cmVsb2FkIG9uIGFsbCBmaWxlcyBpbiBhbmQgdW5kZXIgdGhhdCBkaXJlY3RvcnkpLCBidXQgd2FudCBhIHNwZWNpZmljIGZpbGVcbiAgICAgICAgICAgICAqICAgICAgdG8gbm90IGhvdHJlbG9hZC5cbiAgICAgICAgICAgICAqICAtIEFsc28gdXNlZnVsIGlmIHlvdSB3YW50IGZpbGVzIHRvIGhvdHJlbG9hZCBjbGllbnRzaWRlLCBidXQgbm90IHNlcnZlcnNpZGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5vc2VydmVyaG90cmVsb2FkPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgd2F0Y2hBZGRpdGlvbmFsRmlsZXM/OiBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgaXNIb3RSZWxvYWRpbmc6ICgoKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbn1cblxuLy8gU2hhcmVkIGFjcm9zcyBjb3BpZXMgb2YgdGhpcyBwYWNrYWdlLCBzbyB0aGUgXCJjdXJyZW50bHkgaG90IHJlbG9hZGluZ1wiIGZsYWcgaXMgY29uc2lzdGVudCBub1xuLy8gIG1hdHRlciB3aGljaCBjb3B5IHNldCBpdCAoZXgsIHNldEV4dGVybmFsSG90UmVsb2FkaW5nKSBvciByZWFkcyBpdCAoY2FsbE1hbmFnZXIucmVnaXN0ZXJDbGFzc1xuLy8gIHJlYWRzIGl0IHZpYSB0aGUgZ2xvYmFsVGhpcy5pc0hvdFJlbG9hZGluZyBicmlkZ2UsIHdoaWNoIGVhY2ggY29weSBvdmVyd3JpdGVzKS4gU2VlIGNyZWF0ZVNpbmdsZXRvbi5cbmNvbnN0IGlzSG90UmVsb2FkaW5nU3RhdGUgPSBjcmVhdGVTaW5nbGV0b24oXCJIb3RSZWxvYWRDb250cm9sbGVyLmlzSG90UmVsb2FkaW5nXCIsIDEsICgpID0+ICh7IHZhbHVlOiBmYWxzZSB9KSk7XG5leHBvcnQgZnVuY3Rpb24gaXNIb3RSZWxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWU7XG59XG5nbG9iYWxUaGlzLmlzSG90UmVsb2FkaW5nID0gaXNIb3RSZWxvYWRpbmc7XG5leHBvcnQgZnVuY3Rpb24gaG90UmVsb2FkaW5nR3VhcmQoKTogdHJ1ZSB7XG4gICAgcmV0dXJuICFpc0hvdFJlbG9hZGluZygpIGFzIGFueTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRlcm5hbEhvdFJlbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWUgPSB2YWx1ZTtcbn1cbi8vIFNoYXJlZCBhY3Jvc3MgY29waWVzLCBzbyBjYWxsYmFja3MgcmVnaXN0ZXJlZCB0aHJvdWdoIG9uZSBjb3B5J3Mgb25Ib3RSZWxvYWQgc3RpbGwgZmlyZSB3aGVuIHRoZVxuLy8gIGZpcnN0LXJlZ2lzdGVyZWQgY29weSdzIGNvbnRyb2xsZXIgcGVyZm9ybXMgYSByZWxvYWQuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBob3RSZWxvYWRDYWxsYmFja3MgPSBjcmVhdGVTaW5nbGV0b24oXCJIb3RSZWxvYWRDb250cm9sbGVyLmhvdFJlbG9hZENhbGxiYWNrc1wiLCAxLCAoKSA9PiBbXSBhcyAoKG1vZHVsZXM6IE5vZGVKUy5Nb2R1bGVbXSkgPT4gdm9pZClbXSkuZ2V0KCk7XG5leHBvcnQgZnVuY3Rpb24gb25Ib3RSZWxvYWQoY2FsbGJhY2s6IChtb2R1bGVzOiBOb2RlSlMuTW9kdWxlW10pID0+IHZvaWQpIHtcbiAgICBob3RSZWxvYWRDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG59XG5cbmNvbnN0IGhvdFJlbG9hZE1vZHVsZSA9IGNhY2hlKChtb2R1bGU6IE5vZGVKUy5Nb2R1bGUpID0+IHtcbiAgICBpZiAoIW1vZHVsZS51cGRhdGVDb250ZW50cykgcmV0dXJuO1xuICAgIGxldCBpbnRlcnZhbCA9IDEwMDA7XG4gICAgbGV0IGZhc3QgPSBmYWxzZTtcbiAgICBpZiAobW9kdWxlLmhvdHJlbG9hZCkge1xuICAgICAgICBpbnRlcnZhbCA9IDEwMDtcbiAgICAgICAgZmFzdCA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IGxhc3RIYXNoZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZ1bmN0aW9uIGdldEhhc2gocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgY29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShjb250ZW50cykuZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2F0Y2hGaWxlKG1vZHVsZS5maWxlbmFtZSk7XG4gICAgZm9yIChsZXQgcGF0aCBvZiBtb2R1bGUud2F0Y2hBZGRpdGlvbmFsRmlsZXMgfHwgW10pIHtcbiAgICAgICAgd2F0Y2hGaWxlKHBhdGgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhdGNoRmlsZShwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGFzdEhhc2hlcy5zZXQocGF0aCwgZ2V0SGFzaChwYXRoKSk7XG4gICAgICAgIGZzLndhdGNoRmlsZShwYXRoLCB7IHBlcnNpc3RlbnQ6IGZhbHNlLCBpbnRlcnZhbCB9LCAoY3VyciwgcHJldikgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld0hhc2ggPSBnZXRIYXNoKHBhdGgpO1xuICAgICAgICAgICAgaWYgKG5ld0hhc2ggPT09IGxhc3RIYXNoZXMuZ2V0KHBhdGgpKSByZXR1cm47XG4gICAgICAgICAgICBsYXN0SGFzaGVzLnNldChwYXRoLCBuZXdIYXNoKTtcbiAgICAgICAgICAgIGlmIChwYXRoID09PSBtb2R1bGUuZmlsZW5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSG90IHJlbG9hZGluZyAke21vZHVsZS5maWxlbmFtZX0gZHVlIHRvIGNoYW5nZWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgSG90IHJlbG9hZGluZyAke21vZHVsZS5maWxlbmFtZX0gZHVlIHRvIGNoYW5nZSBpbiAke3BhdGh9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb0hvdFJlbG9hZChjdXJyLm10aW1lTXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cblxuXG4gICAgLy8gSU1QT1JUQU5UISBjaGFuZ2VUaW1lIGlzIGZvciBiZW5jaG1hcmtpbmcgaG93IGxvbmcgd2UgdG9vayB0byBob3RyZWxvYWQgKGFuZCBub3RoaW5nIGVsc2UpXG4gICAgZnVuY3Rpb24gZG9Ib3RSZWxvYWQoY2hhbmdlVGltZTogbnVtYmVyKSB7XG4gICAgICAgIG1vZHVsZS51cGRhdGVDb250ZW50cz8uKCk7XG4gICAgICAgIGlmIChpc05vZGUoKSAmJiAhbW9kdWxlLm5vc2VydmVyaG90cmVsb2FkKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbW9kdWxlLmhvdHJlbG9hZFxuICAgICAgICAgICAgICAgIC8vIEEgZmFpcmx5IGJpZyBoYWNrIChhcyB0aGlzIGNvdWxkIGp1c3QgYmUgaW4gYSBzdHJpbmcsIG9yIHNvbWV0aGluZyBzaW1pbGFyKSwgYnV0Li4uIGl0IGFsc28gVkVSWSB1c2VmdWxcbiAgICAgICAgICAgICAgICB8fCBtb2R1bGUubW9kdWxlQ29udGVudHM/LmluY2x1ZGVzKFwiXFxubW9kdWxlLmhvdHJlbG9hZCA9IHRydWU7XCIgKyBcIlxcblwiKVxuICAgICAgICAgICAgICAgIHx8IG1vZHVsZS5tb2R1bGVDb250ZW50cz8uaW5jbHVkZXMoXCJcXHJcXG5tb2R1bGUuaG90cmVsb2FkID0gdHJ1ZTtcIiArIFwiXFxyXFxuXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgU2VydmVyc2lkZSByZWxvYWRpbmcgJHttb2R1bGUuaWR9YCk7XG4gICAgICAgICAgICAgICAgaXNIb3RSZWxvYWRpbmdTdGF0ZS5nZXQoKS52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGUubG9hZChtb2R1bGUuaWQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZWQoYEVycm9yIGhvdCByZWxvYWRpbmcgJHttb2R1bGUuaWR9YCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3RSZWxvYWRpbmdTdGF0ZS5nZXQoKS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiBob3RSZWxvYWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhbbW9kdWxlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9tb2R1bGUuc291cmNlU0hBMjU2O1xuICAgICAgICAvLyBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoY29udGVudHMpLmRpZ2VzdChcImhleFwiKVxuICAgICAgICBpZiAoZ2V0SXNBbGxvd0NsaWVudChtb2R1bGUpKSB7XG4gICAgICAgICAgICB0cmlnZ2VyQ2xpZW50U2lkZVJlbG9hZCh7XG4gICAgICAgICAgICAgICAgZmlsZXM6IFttb2R1bGUuZmlsZW5hbWVdLFxuICAgICAgICAgICAgICAgIGNoYW5nZVRpbWUsXG4gICAgICAgICAgICAgICAgZmFzdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5sZXQgcmVsb2FkVHJpZ2dlcmluZyA9IGZhbHNlO1xubGV0IGNsaWVudFdhdGNoZXJOb2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xubGV0IHBlbmRpbmdUcmlnZ2VyRmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmZ1bmN0aW9uIHRyaWdnZXJDbGllbnRTaWRlUmVsb2FkKGNvbmZpZzoge1xuICAgIGZpbGVzOiBzdHJpbmdbXTtcbiAgICBjaGFuZ2VUaW1lOiBudW1iZXI7XG4gICAgZmFzdD86IGJvb2xlYW47XG59KSB7XG4gICAgZm9yIChsZXQgZmlsZSBvZiBjb25maWcuZmlsZXMpIHtcbiAgICAgICAgcGVuZGluZ1RyaWdnZXJGaWxlcy5hZGQoZmlsZSk7XG4gICAgfVxuICAgIGlmIChyZWxvYWRUcmlnZ2VyaW5nKSByZXR1cm47XG4gICAgcmVsb2FkVHJpZ2dlcmluZyA9IHRydWU7XG4gICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbG9hZFRyaWdnZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShwZW5kaW5nVHJpZ2dlckZpbGVzKTtcbiAgICAgICAgcGVuZGluZ1RyaWdnZXJGaWxlcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGxldCBjbGllbnROb2RlSWQgb2YgY2xpZW50V2F0Y2hlck5vZGVzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgTm90aWZ5aW5nIGNsaWVudCBvZiBob3QgcmVsb2FkOiAke2NsaWVudE5vZGVJZH1gLCBmaWxlcyk7XG4gICAgICAgICAgICBIb3RSZWxvYWRDb250cm9sbGVyLm5vZGVzW2NsaWVudE5vZGVJZF0uZmlsZVVwZGF0ZWQoZmlsZXMsIGNvbmZpZy5jaGFuZ2VUaW1lKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92aW5nIGVycm9yaW5nIGNsaWVudDogJHtjbGllbnROb2RlSWR9YCk7XG4gICAgICAgICAgICAgICAgY2xpZW50V2F0Y2hlck5vZGVzLmRlbGV0ZShjbGllbnROb2RlSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0LCBvdGhlcndpc2UgYmF0Y2hlZCB1cGRhdGVzIGZhaWwsIFdISUNILCBjYW4gcmVzdWx0IGluIHVwZGF0ZXMgd2hpbGUgcmVsb2FkaW5nLFxuICAgICAgICAvLyAgd2hpY2ggY2F1c2VzIG1pc3NlZCB1cGRhdGVzLlxuICAgIH0sIGNvbmZpZy5mYXN0ID8gNTAgOiAzMDApO1xufVxuXG5jbGFzcyBIb3RSZWxvYWRDb250cm9sbGVyQmFzZSB7XG4gICAgLy8gVE9ETzogQWxzbyBob3QgcmVsb2FkIHdoZW4gd2UgcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIsIGFzIGl0IGlzIGxpa2VseSBzZXR1cCB3aWxsIG5lZWQgdG9cbiAgICAvLyAgYmUgcmVydW4gaW4gdGhhdCBjYXNlIGFzIHdlbGwgKGZvciBleGFtcGxlLCB3ZSBuZWVkIHRvIGNhbGwgd2F0Y2hGaWxlcyBhZ2FpbiEpXG4gICAgYXN5bmMgd2F0Y2hGaWxlcygpIHtcbiAgICAgICAgbGV0IGNhbGxlcklkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCkubm9kZUlkO1xuICAgICAgICBjbGllbnRXYXRjaGVyTm9kZXMuYWRkKGNhbGxlcklkKTtcbiAgICB9XG4gICAgLy8gVE9ETzogVGhpcyBpcyBhY3R1YWxseSBicm9rZW4gcmVsYXRlZCB0byBsYXp5IGxvYWRlZCBhbmQgc2VydmVyLW9ubHkgY29kZSwgYXMgdGhlIHNlcnZlciB3aWxsIHRlbGwgdXMgYSBmaWxlIGNoYW5nZWQsIGFuZCB0aGVuIHdlJ2xsIHNlZSB0aGF0IHdlIGRvbid0IGhhdmUgaXQgbG9hZGVkLCBhbmQgc28gd2Ugd2lsbCB0cnkgdG8gcmVmcmVzaC5cbiAgICAvLyAgICAgIC0gVGhlIHJlYXNvbiB3ZSByZWZyZXNoIGlzIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBuZXcgZmlsZS4gSSBkb24ndCBrbm93IGhvdyB3ZSBjb3VsZCBjaGVjayB0byBzZWUgaWYgaXQgd2FzIGxhenkgbG9hZGVkLiBNYXliZSB3ZSBqdXN0IHNob3VsZG4ndCByZWZyZXNoIGV2ZXIgaWYgd2UgY2FuJ3QgZmluZCB0aGUgbW9kdWxlPyBXZSdsbCBzZWUgaG93IG11Y2ggd2UgcnVuIGludG8gdGhlIGV4dHJhIHJlZnJlc2ggZHVlIHRvIGxhenkgbG9hZGluZy4uLlxuICAgIGFzeW5jIGZpbGVVcGRhdGVkKGZpbGVzOiBzdHJpbmdbXSwgY2hhbmdlVGltZTogbnVtYmVyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKG1hZ2VudGEoYFRyaWdnZXIgaG90cmVsb2FkIGZvciBmaWxlcyAke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIGNoYW5nZVRpbWUpfSBhZnRlciBmaWxlIGNoYW5nZWApKTtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGxldCBtb2R1bGVzOiBOb2RlSlMuTW9kdWxlW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmaWxlID0gXCJodHRwczovL1wiICsgKEJPT1RFRF9FREdFX05PREU/Lmhvc3QgfHwgbG9jYXRpb24uaG9zdCkgKyBcIi9cIiArIGZpbGU7XG4gICAgICAgICAgICAgICAgbGV0IG1vZHVsZSA9IHJlcXVpcmUuY2FjaGVbZmlsZV07XG4gICAgICAgICAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYE1vZHVsZSBub3QgZm91bmQ6ICR7ZmlsZX0sIG5vdCByZWxvYWRpbmcgcGFnZWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghbW9kdWxlLmhvdHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgTW9kdWxlIG5vdCBob3RyZWxvYWRhYmxlOiAke2ZpbGV9LCByZWxvYWRpbmcgcGFnZSB0byBlbnN1cmUgbmV3IHZlcnNpb24gaXMgbG9hZGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vZHVsZXMucHVzaChtb2R1bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc0hvdFJlbG9hZGluZ1N0YXRlLmdldCgpLnZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwobW9kdWxlcy5tYXAobW9kdWxlID0+IG1vZHVsZS5sb2FkKG1vZHVsZS5maWxlbmFtZSkpKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlzSG90UmVsb2FkaW5nU3RhdGUuZ2V0KCkudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgaG90UmVsb2FkQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobW9kdWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtYWdlbnRhKGBIb3QgcmVsb2FkIGNvbXBsZXRlICR7Zm9ybWF0VGltZShEYXRlLm5vdygpIC0gY2hhbmdlVGltZSl9IGFmdGVyIGZpbGUgY2hhbmdlYCkpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEhvdCByZWxvYWQgZmFpbGVkICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IEhvdFJlbG9hZENvbnRyb2xsZXIgPSBTb2NrZXRGdW5jdGlvbi5yZWdpc3RlcihcbiAgICBcIkhvdFJlbG9hZENvbnRyb2xsZXItMDMyYjIyNTAtM2FhYy00MTg3LThjOTUtNzU0MTI3NDJiOGY1XCIsXG4gICAgbmV3IEhvdFJlbG9hZENvbnRyb2xsZXJCYXNlKCksXG4gICAgKCkgPT4gKHtcbiAgICAgICAgd2F0Y2hGaWxlczoge30sXG4gICAgICAgIGZpbGVVcGRhdGVkOiB7fVxuICAgIH0pLFxuICAgICgpID0+ICh7XG5cbiAgICB9KSxcbiAgICB7XG4gICAgICAgIG5vQXV0b0V4cG9zZTogdHJ1ZSxcbiAgICB9XG4pOyJdfQ==
252
+ /* _JS_SOURCE_HASH = "fad5234ef4614a67e7686e156e1de47b8cb72f9f93a3c3e4945c518e41eff353"; */
package/index.d.ts CHANGED
@@ -1560,28 +1560,13 @@ declare module "socket-function/time/trueTimeShim" {
1560
1560
  fromTime: number;
1561
1561
  toTime: number;
1562
1562
  };
1563
- export declare function computeTweenedOffset(components: {
1564
- systemTime: number;
1565
- fromOffset: number;
1566
- toOffset: number;
1567
- fromTime: number;
1568
- }): number;
1569
1563
  export declare function getTimeComponents(): {
1570
1564
  systemTime: number;
1571
1565
  offset: number;
1572
1566
  };
1573
1567
  export declare function getTrueTime(): number;
1574
1568
  export declare function getTrueTimeOffset(): number;
1575
- export type TrueTimeProof = {
1576
- systemTime: number;
1577
- fromOffset: number;
1578
- toOffset: number;
1579
- fromTime: number;
1580
- toTime: number;
1581
- offset: number;
1582
- measurement?: TimeOffsetProof;
1583
- };
1584
- export declare function getTrueTimeProof(): TrueTimeProof | undefined;
1569
+ export declare function getTrueTimeProof(): TimeOffsetProof | undefined;
1585
1570
  export declare function waitForFirstTimeSync(): Promise<void> | undefined;
1586
1571
  declare global {
1587
1572
  var TRUE_TIME_ALREADY_SHIMMED: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket-function",
3
- "version": "1.1.49",
3
+ "version": "1.2.0",
4
4
  "main": "index.js",
5
5
  "license": "MIT",
6
6
  "dependencies": {