obsidian-integration-testing 9.2.1 → 9.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +5 -2
- package/dist/lib/cjs/obsidian-instance.d.cts +7 -0
- package/dist/lib/cjs/parent-liveness.cjs +93 -0
- package/dist/lib/cjs/parent-liveness.d.cts +76 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +22 -1
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +12 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +7 -0
- package/dist/lib/esm/obsidian-instance.mjs +5 -2
- package/dist/lib/esm/parent-liveness.d.mts +76 -0
- package/dist/lib/esm/parent-liveness.mjs +67 -0
- package/dist/lib/esm/transport-desktop-cdp.d.mts +12 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +22 -1
- package/dist/obsidian-integration-testing-9.2.2.tgz +0 -0
- package/package.json +1 -1
- package/dist/obsidian-integration-testing-9.2.1.tgz +0 -0
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(library_exports, {
|
|
|
21
21
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(library_exports);
|
|
24
|
-
const LIBRARY_VERSION = false ? "dev" : "9.2.
|
|
24
|
+
const LIBRARY_VERSION = false ? "dev" : "9.2.1";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIBRARY_VERSION
|
|
@@ -26,6 +26,7 @@ var import_node_child_process = require("node:child_process");
|
|
|
26
26
|
var import_node_net = require("node:net");
|
|
27
27
|
var import_kill_process_tree = require("./kill-process-tree.cjs");
|
|
28
28
|
var import_log = require("./log.cjs");
|
|
29
|
+
var import_parent_liveness = require("./parent-liveness.cjs");
|
|
29
30
|
const DEFAULT_CDP_HOST = "127.0.0.1";
|
|
30
31
|
const CDP_READY_POLL_INTERVAL_IN_MILLISECONDS = 1e3;
|
|
31
32
|
const CDP_READY_TIMEOUT_IN_MILLISECONDS = 6e4;
|
|
@@ -33,6 +34,7 @@ async function launchOwnedObsidianInstance(params) {
|
|
|
33
34
|
const cdpHost = params.cdpHost ?? DEFAULT_CDP_HOST;
|
|
34
35
|
const port = await pickFreePort();
|
|
35
36
|
const cdpUrl = `http://${cdpHost}:${String(port)}`;
|
|
37
|
+
const livenessServer = await (0, import_parent_liveness.startParentLivenessServer)();
|
|
36
38
|
(0, import_log.log)(`[obsidian-instance] Launching owned Obsidian: userData=${params.userDataDir}, cdpPort=${String(port)}`);
|
|
37
39
|
const child = (0, import_node_child_process.spawn)(
|
|
38
40
|
params.exePath,
|
|
@@ -43,12 +45,13 @@ async function launchOwnedObsidianInstance(params) {
|
|
|
43
45
|
try {
|
|
44
46
|
await waitForCdpReady(cdpUrl);
|
|
45
47
|
(0, import_log.log)(`[obsidian-instance] Owned Obsidian is serving CDP at ${cdpUrl}.`);
|
|
46
|
-
return { cdpUrl, kill, port };
|
|
48
|
+
return { cdpUrl, kill, parentLivenessPort: livenessServer.port, port };
|
|
47
49
|
} catch (error) {
|
|
48
50
|
kill();
|
|
49
51
|
throw error;
|
|
50
52
|
}
|
|
51
53
|
function kill() {
|
|
54
|
+
livenessServer.close();
|
|
52
55
|
(0, import_kill_process_tree.killProcessTree)(child);
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -97,4 +100,4 @@ async function waitForCdpReady(cdpUrl) {
|
|
|
97
100
|
launchOwnedObsidianInstance,
|
|
98
101
|
pickFreePort
|
|
99
102
|
});
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbmNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGF1bmNoZXMgYW5kIG1hbmFnZXMgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBkZXNrdG9wIGluc3RhbmNlLlxuICpcbiAqIFRoZSBpbnN0YW5jZSBydW5zIGFnYWluc3QgYSBkZWRpY2F0ZWQgYC0tdXNlci1kYXRhLWRpcmAgKHNvIGl0IG5ldmVyIHRvdWNoZXNcbiAqIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnLCByZWdpc3RyeSwgb3IgcnVubmluZyB3aW5kb3cpIGFuZCBleHBvc2VzIENEUCBvbiBhXG4gKiBkZWRpY2F0ZWQgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YC4gQmVjYXVzZSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZSBsb2NrXG4gKiBpcyBrZXllZCB0byB0aGUgdXNlci1kYXRhIGRpciwgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMgaW4gcGFyYWxsZWwgd2l0aCB0aGVcbiAqIHVzZXIncyBvd24gT2JzaWRpYW4uIENvbmZpcm1lZCBieSB0aGUgUGhhc2UgMCBzcGlrZSAoc2VlIHRoZSBwcm9qZWN0IHBsYW4pLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHByb2Nlc3MgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgeyBraWxsUHJvY2Vzc1RyZWUgfSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBDRFAgaG9zdCB0byBiaW5kL3BvbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnMTI3LjAuMC4xJ2BcbiAgICovXG4gIHJlYWRvbmx5IGNkcEhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIE9ic2lkaWFuIGV4ZWN1dGFibGUgKHNoZWxsKSB0byBsYXVuY2guICovXG4gIHJlYWRvbmx5IGV4ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRXh0cmEgY29tbWFuZC1saW5lIGFyZ3MgYXBwZW5kZWQgYWZ0ZXIgYC0tdXNlci1kYXRhLWRpcmAgYW5kXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgXHUyMDE0IHVzZWQgdG8gcGFzcyB0aGUga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyB3aGVuXG4gICAqIHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCBoaWRkZW4gKG9mZi1zY3JlZW4pLiBFbXB0eSBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFBcmdzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXIgdG8gcGFzcyB2aWEgYC0tdXNlci1kYXRhLWRpcmAuICovXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBydW5uaW5nLCBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5JbnN0YW5jZSB7XG4gIC8qKiBCYXNlIENEUCBVUkwsIGUuZy4gYGh0dHA6Ly8xMjcuMC4wLjE6NTE4ODhgLiAqL1xuICByZWFkb25seSBjZHBVcmw6IHN0cmluZztcblxuICAvKiogS2lsbHMgdGhlIGluc3RhbmNlIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS4gKi9cbiAga2lsbCgpOiB2b2lkO1xuXG4gIC8qKiBUaGUgQ0RQIHJlbW90ZS1kZWJ1Z2dpbmcgcG9ydCB0aGUgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIHdpdGguICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgQ0RQX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IENEUF9SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIGFuIGlzb2xhdGVkLCBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGFuZCB3YWl0cyB1bnRpbCBpdHMgQ0RQXG4gKiBlbmRwb2ludCBpcyBzZXJ2aW5nIHBhZ2UgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gTGF1bmNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcnVubmluZyBvd25lZCBpbnN0YW5jZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgQ0RQIGRvZXMgbm90IGJlY29tZSByZWFjaGFibGUgd2l0aGluIHRoZSB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKFxuICBwYXJhbXM6IExhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZVBhcmFtc1xuKTogUHJvbWlzZTxPd25lZE9ic2lkaWFuSW5zdGFuY2U+IHtcbiAgY29uc3QgY2RwSG9zdCA9IHBhcmFtcy5jZHBIb3N0ID8/IERFRkFVTFRfQ0RQX0hPU1Q7XG4gIGNvbnN0IHBvcnQgPSBhd2FpdCBwaWNrRnJlZVBvcnQoKTtcbiAgY29uc3QgY2RwVXJsID0gYGh0dHA6Ly8ke2NkcEhvc3R9OiR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIExhdW5jaGluZyBvd25lZCBPYnNpZGlhbjogdXNlckRhdGE9JHtwYXJhbXMudXNlckRhdGFEaXJ9LCBjZHBQb3J0PSR7U3RyaW5nKHBvcnQpfWApO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKFxuICAgIHBhcmFtcy5leGVQYXRoLFxuICAgIFtgLS11c2VyLWRhdGEtZGlyPSR7cGFyYW1zLnVzZXJEYXRhRGlyfWAsIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke1N0cmluZyhwb3J0KX1gLCAuLi4ocGFyYW1zLmV4dHJhQXJncyA/PyBbXSldLFxuICAgIHsgZGV0YWNoZWQ6IHRydWUsIHN0ZGlvOiAnaWdub3JlJyB9XG4gICk7XG4gIGNoaWxkLnVucmVmKCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ2RwUmVhZHkoY2RwVXJsKTtcbiAgICBsb2coYFtvYnNpZGlhbi1pbnN0YW5jZV0gT3duZWQgT2JzaWRpYW4gaXMgc2VydmluZyBDRFAgYXQgJHtjZHBVcmx9LmApO1xuICAgIHJldHVybiB7IGNkcFVybCwga2lsbCwgcG9ydCB9O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGtpbGwoKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtpbGwoKTogdm9pZCB7XG4gICAga2lsbFByb2Nlc3NUcmVlKGNoaWxkKTtcbiAgfVxufVxuXG4vKipcbiAqIFBpY2tzIGEgZnJlZSBUQ1AgcG9ydCBieSBiaW5kaW5nIHRvIHBvcnQgYDBgIGFuZCByZWFkaW5nIHRoZSBhc3NpZ25lZCBwb3J0LlxuICpcbiAqIFRoZXJlIGlzIGEgc21hbGwgdGltZS1vZi1jaGVjay90aW1lLW9mLXVzZSB3aW5kb3cgYmV0d2VlbiByZWxlYXNpbmcgdGhlIHBvcnRcbiAqIGhlcmUgYW5kIE9ic2lkaWFuIGJpbmRpbmcgaXQ7IGluIHByYWN0aWNlIGl0IGlzIG5lZ2xpZ2libGUgZm9yIHRlc3QgcnVucy5cbiAqXG4gKiBAcmV0dXJucyBBIGZyZWUgVENQIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrRnJlZVBvcnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgIHNlcnZlci5saXN0ZW4oMCwgREVGQVVMVF9DRFBfSE9TVCwgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCk7XG4gICAgICBpZiAoYWRkcmVzcyA9PT0gbnVsbCB8fCB0eXBlb2YgYWRkcmVzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZXRlcm1pbmUgYSBmcmVlIHBvcnQuJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBvcnQgfSA9IGFkZHJlc3M7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHBvcnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGxzIHRoZSBDRFAgYC9qc29uYCBlbmRwb2ludCB1bnRpbCBhdCBsZWFzdCBvbmUgcGFnZSB0YXJnZXQgYXBwZWFycy5cbiAqXG4gKiBAcGFyYW0gY2RwVXJsIC0gVGhlIGJhc2UgQ0RQIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckNkcFJlYWR5KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIENEUF9SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXTtcbiAgICAgIGlmICh0YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LnR5cGUgPT09ICdwYWdlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRW5kcG9pbnQgbm90IHVwIHlldCBcdTIwMTQga2VlcCBwb2xsaW5nLlxuICAgIH1cbiAgICBhd2FpdCBkZWxheShDRFBfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgT3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgZGlkIG5vdCBleHBvc2UgQ0RQIGF0ICR7Y2RwVXJsfSB3aXRoaW4gJHtTdHJpbmcoQ0RQX1JFQURZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gXG4gICk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxnQ0FBc0I7QUFDdEIsc0JBQTZCO0FBRTdCLCtCQUFnQztBQUNoQyxpQkFBb0I7QUF5Q3BCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sMENBQTBDO0FBQ2hELE1BQU0sb0NBQW9DO0FBYzFDLGVBQXNCLDRCQUNwQixRQUNnQztBQUNoQyxRQUFNLFVBQVUsT0FBTyxXQUFXO0FBQ2xDLFFBQU0sT0FBTyxNQUFNLGFBQWE7QUFDaEMsUUFBTSxTQUFTLFVBQVUsT0FBTyxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBRWhELHNCQUFJLDBEQUEwRCxPQUFPLFdBQVcsYUFBYSxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQzNHLFFBQU0sWUFBUTtBQUFBLElBQ1osT0FBTztBQUFBLElBQ1AsQ0FBQyxtQkFBbUIsT0FBTyxXQUFXLElBQUksMkJBQTJCLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBSSxPQUFPLGFBQWEsQ0FBQyxDQUFFO0FBQUEsSUFDaEgsRUFBRSxVQUFVLE1BQU0sT0FBTyxTQUFTO0FBQUEsRUFDcEM7QUFDQSxRQUFNLE1BQU07QUFFWixNQUFJO0FBQ0YsVUFBTSxnQkFBZ0IsTUFBTTtBQUM1Qix3QkFBSSx3REFBd0QsTUFBTSxHQUFHO0FBQ3JFLFdBQU8sRUFBRSxRQUFRLE1BQU0sS0FBSztBQUFBLEVBQzlCLFNBQVMsT0FBZ0I7QUFDdkIsU0FBSztBQUNMLFVBQU07QUFBQSxFQUNSO0FBRUEsV0FBUyxPQUFhO0FBQ3BCLGtEQUFnQixLQUFLO0FBQUEsRUFDdkI7QUFDRjtBQVVPLFNBQVMsZUFBZ0M7QUFDOUMsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsVUFBTSxhQUFTLDhCQUFhO0FBQzVCLFdBQU8sS0FBSyxTQUFTLE1BQU07QUFDM0IsV0FBTyxPQUFPLEdBQUcsa0JBQWtCLE1BQU07QUFDdkMsWUFBTSxVQUFVLE9BQU8sUUFBUTtBQUMvQixVQUFJLFlBQVksUUFBUSxPQUFPLFlBQVksVUFBVTtBQUNuRCxlQUFPLE1BQU07QUFDYixlQUFPLElBQUksTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRDtBQUFBLE1BQ0Y7QUFDQSxZQUFNLEVBQUUsS0FBSyxJQUFJO0FBQ2pCLGFBQU8sTUFBTSxNQUFNO0FBQ2pCLGdCQUFRLElBQUk7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVFBLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxTQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDOUIsZUFBVyxTQUFTLEVBQUU7QUFBQSxFQUN4QixDQUFDO0FBQ0g7QUFPQSxlQUFlLGdCQUFnQixRQUErQjtBQUM1RCxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUk7QUFDRixZQUFNLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQzdDLFlBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSztBQUNwQyxVQUFJLFFBQVEsS0FBSyxDQUFDLFdBQVcsT0FBTyxTQUFTLE1BQU0sR0FBRztBQUNwRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQ0EsVUFBTSxNQUFNLHVDQUF1QztBQUFBLEVBQ3JEO0FBQ0EsUUFBTSxJQUFJO0FBQUEsSUFDUixpREFBaUQsTUFBTSxXQUFXLE9BQU8saUNBQWlDLENBQUM7QUFBQSxFQUM3RztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWluc3RhbmNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTGF1bmNoZXMgYW5kIG1hbmFnZXMgYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBkZXNrdG9wIGluc3RhbmNlLlxuICpcbiAqIFRoZSBpbnN0YW5jZSBydW5zIGFnYWluc3QgYSBkZWRpY2F0ZWQgYC0tdXNlci1kYXRhLWRpcmAgKHNvIGl0IG5ldmVyIHRvdWNoZXNcbiAqIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnLCByZWdpc3RyeSwgb3IgcnVubmluZyB3aW5kb3cpIGFuZCBleHBvc2VzIENEUCBvbiBhXG4gKiBkZWRpY2F0ZWQgYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YC4gQmVjYXVzZSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZSBsb2NrXG4gKiBpcyBrZXllZCB0byB0aGUgdXNlci1kYXRhIGRpciwgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMgaW4gcGFyYWxsZWwgd2l0aCB0aGVcbiAqIHVzZXIncyBvd24gT2JzaWRpYW4uIENvbmZpcm1lZCBieSB0aGUgUGhhc2UgMCBzcGlrZSAoc2VlIHRoZSBwcm9qZWN0IHBsYW4pLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHByb2Nlc3MgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG5pbXBvcnQgeyBraWxsUHJvY2Vzc1RyZWUgfSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgc3RhcnRQYXJlbnRMaXZlbmVzc1NlcnZlciB9IGZyb20gJy4vcGFyZW50LWxpdmVuZXNzLmNqcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIENEUCBob3N0IHRvIGJpbmQvcG9sbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcxMjcuMC4wLjEnYFxuICAgKi9cbiAgcmVhZG9ubHkgY2RwSG9zdD86IHN0cmluZztcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gZXhlY3V0YWJsZSAoc2hlbGwpIHRvIGxhdW5jaC4gKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBjb21tYW5kLWxpbmUgYXJncyBhcHBlbmRlZCBhZnRlciBgLS11c2VyLWRhdGEtZGlyYCBhbmRcbiAgICogYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBcdTIwMTQgdXNlZCB0byBwYXNzIHRoZSBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIHdoZW5cbiAgICogdGhlIGluc3RhbmNlIGlzIGxhdW5jaGVkIGhpZGRlbiAob2ZmLXNjcmVlbikuIEVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBleHRyYUFyZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgaXNvbGF0ZWQgdXNlci1kYXRhIGRpciB0byBwYXNzIHZpYSBgLS11c2VyLWRhdGEtZGlyYC4gKi9cbiAgcmVhZG9ubHkgdXNlckRhdGFEaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJ1bm5pbmcsIGhhcm5lc3Mtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRPYnNpZGlhbkluc3RhbmNlIHtcbiAgLyoqIEJhc2UgQ0RQIFVSTCwgZS5nLiBgaHR0cDovLzEyNy4wLjAuMTo1MTg4OGAuICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKiBLaWxscyB0aGUgaW5zdGFuY2UgYW5kIGl0cyBlbnRpcmUgcHJvY2VzcyB0cmVlLiAqL1xuICBraWxsKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIExvb3BiYWNrIHBvcnQgdGhlIGluc3RhbmNlJ3MgcmVuZGVyZXIgY29ubmVjdHMgYmFjayB0byBzbyBpdCBkZXN0cm95c1xuICAgKiBpdHNlbGYgaWYgdGhpcyBoYXJuZXNzIHByb2Nlc3MgZGllcyB3aXRob3V0IGNsZWFuaW5nIHVwLiBTZWVcbiAgICogYHBhcmVudC1saXZlbmVzcy50c2AgZm9yIHdoeSB0aGUgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCBhbG9uZSBpcyBub3RcbiAgICogZW5vdWdoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyZW50TGl2ZW5lc3NQb3J0OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBDRFAgcmVtb3RlLWRlYnVnZ2luZyBwb3J0IHRoZSBpbnN0YW5jZSB3YXMgbGF1bmNoZWQgd2l0aC4gKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0NEUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBDRFBfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgQ0RQX1JFQURZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNjAwMDA7XG5cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTGF1bmNoZXMgYW4gaXNvbGF0ZWQsIGhhcm5lc3Mtb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgYW5kIHdhaXRzIHVudGlsIGl0cyBDRFBcbiAqIGVuZHBvaW50IGlzIHNlcnZpbmcgcGFnZSB0YXJnZXRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBMYXVuY2ggcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBydW5uaW5nIG93bmVkIGluc3RhbmNlLlxuICogQHRocm93cyBFcnJvciBpZiBDRFAgZG9lcyBub3QgYmVjb21lIHJlYWNoYWJsZSB3aXRoaW4gdGhlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UoXG4gIHBhcmFtczogTGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlUGFyYW1zXG4pOiBQcm9taXNlPE93bmVkT2JzaWRpYW5JbnN0YW5jZT4ge1xuICBjb25zdCBjZHBIb3N0ID0gcGFyYW1zLmNkcEhvc3QgPz8gREVGQVVMVF9DRFBfSE9TVDtcbiAgY29uc3QgcG9ydCA9IGF3YWl0IHBpY2tGcmVlUG9ydCgpO1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7Y2RwSG9zdH06JHtTdHJpbmcocG9ydCl9YDtcblxuICAvLyBMaXN0ZW4gQkVGT1JFIHNwYXduaW5nLCBzbyB0aGUgcmVuZGVyZXIgd2F0Y2hkb2cgY2FuIG5ldmVyIHJhY2UgdGhlIHNlcnZlclxuICAvLyBJbnRvIGEgZmFpbGVkIGNvbm5lY3QgKHdoaWNoIGl0IHRyZWF0cyBhcyBcIm5vIHdhdGNoZG9nXCIsIGxlYXZpbmcgdGhlIGluc3RhbmNlIGFsaXZlKS5cbiAgY29uc3QgbGl2ZW5lc3NTZXJ2ZXIgPSBhd2FpdCBzdGFydFBhcmVudExpdmVuZXNzU2VydmVyKCk7XG5cbiAgbG9nKGBbb2JzaWRpYW4taW5zdGFuY2VdIExhdW5jaGluZyBvd25lZCBPYnNpZGlhbjogdXNlckRhdGE9JHtwYXJhbXMudXNlckRhdGFEaXJ9LCBjZHBQb3J0PSR7U3RyaW5nKHBvcnQpfWApO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKFxuICAgIHBhcmFtcy5leGVQYXRoLFxuICAgIFtgLS11c2VyLWRhdGEtZGlyPSR7cGFyYW1zLnVzZXJEYXRhRGlyfWAsIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke1N0cmluZyhwb3J0KX1gLCAuLi4ocGFyYW1zLmV4dHJhQXJncyA/PyBbXSldLFxuICAgIHsgZGV0YWNoZWQ6IHRydWUsIHN0ZGlvOiAnaWdub3JlJyB9XG4gICk7XG4gIGNoaWxkLnVucmVmKCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ2RwUmVhZHkoY2RwVXJsKTtcbiAgICBsb2coYFtvYnNpZGlhbi1pbnN0YW5jZV0gT3duZWQgT2JzaWRpYW4gaXMgc2VydmluZyBDRFAgYXQgJHtjZHBVcmx9LmApO1xuICAgIHJldHVybiB7IGNkcFVybCwga2lsbCwgcGFyZW50TGl2ZW5lc3NQb3J0OiBsaXZlbmVzc1NlcnZlci5wb3J0LCBwb3J0IH07XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAga2lsbCgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgZnVuY3Rpb24ga2lsbCgpOiB2b2lkIHtcbiAgICBsaXZlbmVzc1NlcnZlci5jbG9zZSgpO1xuICAgIGtpbGxQcm9jZXNzVHJlZShjaGlsZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQaWNrcyBhIGZyZWUgVENQIHBvcnQgYnkgYmluZGluZyB0byBwb3J0IGAwYCBhbmQgcmVhZGluZyB0aGUgYXNzaWduZWQgcG9ydC5cbiAqXG4gKiBUaGVyZSBpcyBhIHNtYWxsIHRpbWUtb2YtY2hlY2svdGltZS1vZi11c2Ugd2luZG93IGJldHdlZW4gcmVsZWFzaW5nIHRoZSBwb3J0XG4gKiBoZXJlIGFuZCBPYnNpZGlhbiBiaW5kaW5nIGl0OyBpbiBwcmFjdGljZSBpdCBpcyBuZWdsaWdpYmxlIGZvciB0ZXN0IHJ1bnMuXG4gKlxuICogQHJldHVybnMgQSBmcmVlIFRDUCBwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGlja0ZyZWVQb3J0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG4gICAgc2VydmVyLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICBzZXJ2ZXIubGlzdGVuKDAsIERFRkFVTFRfQ0RQX0hPU1QsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgaWYgKGFkZHJlc3MgPT09IG51bGwgfHwgdHlwZW9mIGFkZHJlc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gZGV0ZXJtaW5lIGEgZnJlZSBwb3J0LicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwb3J0IH0gPSBhZGRyZXNzO1xuICAgICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZShwb3J0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQb2xscyB0aGUgQ0RQIGAvanNvbmAgZW5kcG9pbnQgdW50aWwgYXQgbGVhc3Qgb25lIHBhZ2UgdGFyZ2V0IGFwcGVhcnMuXG4gKlxuICogQHBhcmFtIGNkcFVybCAtIFRoZSBiYXNlIENEUCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JDZHBSZWFkeShjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBDRFBfUkVBRFlfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgICBpZiAodGFyZ2V0cy5zb21lKCh0YXJnZXQpID0+IHRhcmdldC50eXBlID09PSAncGFnZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEVuZHBvaW50IG5vdCB1cCB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICB9XG4gICAgYXdhaXQgZGVsYXkoQ0RQX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYE93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGRpZCBub3QgZXhwb3NlIENEUCBhdCAke2NkcFVybH0gd2l0aGluICR7U3RyaW5nKENEUF9SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYFxuICApO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBY0EsZ0NBQXNCO0FBQ3RCLHNCQUE2QjtBQUU3QiwrQkFBZ0M7QUFDaEMsaUJBQW9CO0FBQ3BCLDZCQUEwQztBQWlEMUMsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSwwQ0FBMEM7QUFDaEQsTUFBTSxvQ0FBb0M7QUFjMUMsZUFBc0IsNEJBQ3BCLFFBQ2dDO0FBQ2hDLFFBQU0sVUFBVSxPQUFPLFdBQVc7QUFDbEMsUUFBTSxPQUFPLE1BQU0sYUFBYTtBQUNoQyxRQUFNLFNBQVMsVUFBVSxPQUFPLElBQUksT0FBTyxJQUFJLENBQUM7QUFJaEQsUUFBTSxpQkFBaUIsVUFBTSxrREFBMEI7QUFFdkQsc0JBQUksMERBQTBELE9BQU8sV0FBVyxhQUFhLE9BQU8sSUFBSSxDQUFDLEVBQUU7QUFDM0csUUFBTSxZQUFRO0FBQUEsSUFDWixPQUFPO0FBQUEsSUFDUCxDQUFDLG1CQUFtQixPQUFPLFdBQVcsSUFBSSwyQkFBMkIsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFJLE9BQU8sYUFBYSxDQUFDLENBQUU7QUFBQSxJQUNoSCxFQUFFLFVBQVUsTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUNwQztBQUNBLFFBQU0sTUFBTTtBQUVaLE1BQUk7QUFDRixVQUFNLGdCQUFnQixNQUFNO0FBQzVCLHdCQUFJLHdEQUF3RCxNQUFNLEdBQUc7QUFDckUsV0FBTyxFQUFFLFFBQVEsTUFBTSxvQkFBb0IsZUFBZSxNQUFNLEtBQUs7QUFBQSxFQUN2RSxTQUFTLE9BQWdCO0FBQ3ZCLFNBQUs7QUFDTCxVQUFNO0FBQUEsRUFDUjtBQUVBLFdBQVMsT0FBYTtBQUNwQixtQkFBZSxNQUFNO0FBQ3JCLGtEQUFnQixLQUFLO0FBQUEsRUFDdkI7QUFDRjtBQVVPLFNBQVMsZUFBZ0M7QUFDOUMsU0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDdEMsVUFBTSxhQUFTLDhCQUFhO0FBQzVCLFdBQU8sS0FBSyxTQUFTLE1BQU07QUFDM0IsV0FBTyxPQUFPLEdBQUcsa0JBQWtCLE1BQU07QUFDdkMsWUFBTSxVQUFVLE9BQU8sUUFBUTtBQUMvQixVQUFJLFlBQVksUUFBUSxPQUFPLFlBQVksVUFBVTtBQUNuRCxlQUFPLE1BQU07QUFDYixlQUFPLElBQUksTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRDtBQUFBLE1BQ0Y7QUFDQSxZQUFNLEVBQUUsS0FBSyxJQUFJO0FBQ2pCLGFBQU8sTUFBTSxNQUFNO0FBQ2pCLGdCQUFRLElBQUk7QUFBQSxNQUNkLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVFBLFNBQVMsTUFBTSxJQUEyQjtBQUN4QyxTQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDOUIsZUFBVyxTQUFTLEVBQUU7QUFBQSxFQUN4QixDQUFDO0FBQ0g7QUFPQSxlQUFlLGdCQUFnQixRQUErQjtBQUM1RCxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUk7QUFDRixZQUFNLFdBQVcsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPO0FBQzdDLFlBQU0sVUFBVSxNQUFNLFNBQVMsS0FBSztBQUNwQyxVQUFJLFFBQVEsS0FBSyxDQUFDLFdBQVcsT0FBTyxTQUFTLE1BQU0sR0FBRztBQUNwRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQ0EsVUFBTSxNQUFNLHVDQUF1QztBQUFBLEVBQ3JEO0FBQ0EsUUFBTSxJQUFJO0FBQUEsSUFDUixpREFBaUQsTUFBTSxXQUFXLE9BQU8saUNBQWlDLENBQUM7QUFBQSxFQUM3RztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -38,6 +38,13 @@ export interface OwnedObsidianInstance {
|
|
|
38
38
|
readonly cdpUrl: string;
|
|
39
39
|
/** Kills the instance and its entire process tree. */
|
|
40
40
|
kill(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Loopback port the instance's renderer connects back to so it destroys
|
|
43
|
+
* itself if this harness process dies without cleaning up. See
|
|
44
|
+
* `parent-liveness.ts` for why the parent/child relationship alone is not
|
|
45
|
+
* enough.
|
|
46
|
+
*/
|
|
47
|
+
readonly parentLivenessPort: number;
|
|
41
48
|
/** The CDP remote-debugging port the instance was launched with. */
|
|
42
49
|
readonly port: number;
|
|
43
50
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var parent_liveness_exports = {};
|
|
20
|
+
__export(parent_liveness_exports, {
|
|
21
|
+
PARENT_LIVENESS_HOST: () => PARENT_LIVENESS_HOST,
|
|
22
|
+
buildParentLivenessWatchdogExpr: () => buildParentLivenessWatchdogExpr,
|
|
23
|
+
startParentLivenessServer: () => startParentLivenessServer
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(parent_liveness_exports);
|
|
26
|
+
var import_node_net = require("node:net");
|
|
27
|
+
const PARENT_LIVENESS_HOST = "127.0.0.1";
|
|
28
|
+
function buildParentLivenessWatchdogExpr(port) {
|
|
29
|
+
return `(function() {
|
|
30
|
+
var FLAG = '__obsidianIntegrationTestingParentLiveness';
|
|
31
|
+
if (window[FLAG]) { return 'already-armed'; }
|
|
32
|
+
var net;
|
|
33
|
+
try {
|
|
34
|
+
net = window.require('node:net');
|
|
35
|
+
} catch (nodePrefixError) {
|
|
36
|
+
try {
|
|
37
|
+
net = window.require('net');
|
|
38
|
+
} catch (barePrefixError) {
|
|
39
|
+
return 'unavailable';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
var socket = net.connect(${String(port)}, '${PARENT_LIVENESS_HOST}');
|
|
43
|
+
window[FLAG] = socket;
|
|
44
|
+
var isConnected = false;
|
|
45
|
+
socket.on('connect', function() { isConnected = true; });
|
|
46
|
+
socket.on('error', function() { /* Handled by the close listener below. */ });
|
|
47
|
+
socket.on('close', function() {
|
|
48
|
+
if (!isConnected) { return; }
|
|
49
|
+
try {
|
|
50
|
+
window.electronWindow.destroy();
|
|
51
|
+
} catch (destroyError) {
|
|
52
|
+
window.close();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return 'armed';
|
|
56
|
+
})()`;
|
|
57
|
+
}
|
|
58
|
+
async function startParentLivenessServer() {
|
|
59
|
+
const server = (0, import_node_net.createServer)((socket) => {
|
|
60
|
+
socket.unref();
|
|
61
|
+
socket.on("error", () => {
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
server.unref();
|
|
65
|
+
const port = await listenOnFreeLoopbackPort(server);
|
|
66
|
+
return {
|
|
67
|
+
close() {
|
|
68
|
+
server.close();
|
|
69
|
+
},
|
|
70
|
+
port
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function listenOnFreeLoopbackPort(server) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
server.once("error", reject);
|
|
76
|
+
server.listen(0, PARENT_LIVENESS_HOST, () => {
|
|
77
|
+
const address = server.address();
|
|
78
|
+
if (address === null || typeof address === "string") {
|
|
79
|
+
server.close();
|
|
80
|
+
reject(new Error("Failed to determine the parent-liveness port."));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
resolve(address.port);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
88
|
+
0 && (module.exports = {
|
|
89
|
+
PARENT_LIVENESS_HOST,
|
|
90
|
+
buildParentLivenessWatchdogExpr,
|
|
91
|
+
startParentLivenessServer
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BhcmVudC1saXZlbmVzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRpZXMgYSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlJ3MgbGlmZXRpbWUgdG8gdGhlIGhhcm5lc3MgcHJvY2VzcyB0aGF0XG4gKiBsYXVuY2hlZCBpdCwgaW4gdGhlIG9uZSBkaXJlY3Rpb24gdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBub3QgZG8gZm9yIHVzLlxuICpcbiAqIFRoZSBvd25lZCBpbnN0YW5jZSBpcyBhbHJlYWR5IGEgY2hpbGQgb2YgdGhlIGhhcm5lc3MgcHJvY2VzcywgYnV0IHRoYXQgbGlua1xuICogY2FycmllcyBubyBsaWZldGltZSBndWFyYW50ZWUuIFdpbmRvd3MgbmV2ZXIgcHJvcGFnYXRlcyBhIHBhcmVudCdzIGRlYXRoIHRvXG4gKiBpdHMgY2hpbGRyZW4gXHUyMDE0IGFuIG9ycGhhbiBzaW1wbHkga2VlcHMgcnVubmluZyB3aXRoIGEgc3RhbGUgcGFyZW50IGlkIFx1MjAxNCBhbmQgb25cbiAqIFBPU0lYIGEgYFNJR0tJTExgIGFpbWVkIGF0IGEgc2luZ2xlIHBpZCBuZXZlciBjYXNjYWRlcyBlaXRoZXIuIFRoZSBpbnN0YW5jZSBpc1xuICogYWRkaXRpb25hbGx5IHNwYXduZWQgYGRldGFjaGVkYCwgc28gaXQgaXMgbm90IGV2ZW4gaW4gdGhlIGhhcm5lc3MncyBwcm9jZXNzXG4gKiBncm91cC4gVGVhcmRvd24gdGhlcmVmb3JlIHJlbGllcyBlbnRpcmVseSBvbiB0aGUgaGFybmVzcyBydW5uaW5nIGl0cyBvd25cbiAqIGNsZWFudXAgKGBraWxsUHJvY2Vzc1RyZWVgIGZyb20gYW4gYGV4aXRgL3NpZ25hbCBoYW5kbGVyKSwgd2hpY2ggaXMgZXhhY3RseVxuICogd2hhdCBhIGBTSUdLSUxMYCwgYSBUYXNrIE1hbmFnZXIga2lsbCwgb3IgYW4gSURFIHN0b3AgYnV0dG9uIGRlbmllcyBpdC4gRXZlcnlcbiAqIHN1Y2gga2lsbCBsZWFrcyBhIGhpZGRlbiBPYnNpZGlhbiBob2xkaW5nIGEgdXNlci1kYXRhIGRpciBhbmQgYSBDRFAgcG9ydCwgYW5kXG4gKiB0aGV5IGFjY3VtdWxhdGU6IHRoZSBuZXh0IHJ1biBwaWNrcyBhIGZyZXNoIHRlbXAgZGlyIGFuZCBhIGZyZWUgcG9ydCwgc29cbiAqIG5vdGhpbmcgY29sbGlkZXMgYW5kIG5vdGhpbmcgY29tcGxhaW5zLlxuICpcbiAqIFRoZSBndWFyYW50ZWVkIGZpeCBpcyBhbiBPUyBwcmltaXRpdmUgXHUyMDE0IGEgV2luZG93cyBKb2IgT2JqZWN0IHdpdGhcbiAqIGBKT0JfT0JKRUNUX0xJTUlUX0tJTExfT05fSk9CX0NMT1NFYCwgb3IgYHByY3RsKFBSX1NFVF9QREVBVEhTSUcpYCBvbiBMaW51eCBcdTIwMTRcbiAqIGJ1dCBuZWl0aGVyIGlzIHJlYWNoYWJsZSBmcm9tIE5vZGUgd2l0aG91dCBhIG5hdGl2ZSBhZGRvbiwgd2hpY2ggaXMgZmFyIHRvb1xuICogaGVhdnkgYSBkZXBlbmRlbmN5IGZvciB0aGlzIGhhcm5lc3MuXG4gKlxuICogU28gd2UgdXNlIHRoZSBvbmUgY3Jvc3MtcGxhdGZvcm0gcmVzb3VyY2UgdGhlIGtlcm5lbCAqZG9lcyogcmVjbGFpbVxuICogZGV0ZXJtaW5pc3RpY2FsbHkgb24gcHJvY2VzcyBkZWF0aDogYSBzb2NrZXQuIFRoZSBoYXJuZXNzIGxpc3RlbnMgb24gYVxuICogbG9vcGJhY2sgcG9ydCBhbmQgdGhlIGluc3RhbmNlJ3MgcmVuZGVyZXIgY29ubmVjdHMgdG8gaXQuIEhvd2V2ZXIgdGhlIGhhcm5lc3NcbiAqIGRpZXMgXHUyMDE0IGNsZWFubHksIGBTSUdLSUxMYGVkLCBvciBjcmFzaGVkIFx1MjAxNCB0aGUga2VybmVsIGNsb3NlcyBpdHMgZW5kLCB0aGVcbiAqIHJlbmRlcmVyIHNlZXMgYGNsb3NlYCwgYW5kIHRoZSB3aW5kb3cgZGVzdHJveXMgaXRzZWxmLiBObyBwb2xsaW5nLCBub1xuICogaGVhcnRiZWF0IGludGVydmFsLCBubyB0aW1lb3V0IHRvIHR1bmUuXG4gKlxuICogRGVsaWJlcmF0ZWx5IGZhaWwtb3BlbjogdGhlIHJlbmRlcmVyIG9ubHkgYXJtcyB0aGUgZGVzdHJveSBoYW5kbGVyIGFmdGVyIHRoZVxuICogY29ubmVjdGlvbiBpcyBhY3R1YWxseSBlc3RhYmxpc2hlZC4gQSB3YXRjaGRvZyB0aGF0IGNhbm5vdCByZWFjaCB0aGUgaGFybmVzc1xuICogbGVhdmVzIHRoZSBpbnN0YW5jZSBydW5uaW5nIHJhdGhlciB0aGFuIGtpbGxpbmcgYSB3aW5kb3cgdGhlIGRldmVsb3BlciBpc1xuICogd29ya2luZyBpbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcblxuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuXG4vKipcbiAqIEEgbGlzdGVuaW5nIGxvb3BiYWNrIHNlcnZlciB3aG9zZSBhY2NlcHRlZCBjb25uZWN0aW9ucyBhY3QgYXMgbGl2ZW5lc3MgdG9rZW5zXG4gKiBmb3IgdGhlIGhhcm5lc3MgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRMaXZlbmVzc1NlcnZlciB7XG4gIC8qKiBTdG9wcyBsaXN0ZW5pbmcgYW5kIGRyb3BzIGV2ZXJ5IGFjY2VwdGVkIGNvbm5lY3Rpb24uICovXG4gIGNsb3NlKCk6IHZvaWQ7XG5cbiAgLyoqIFRoZSBsb29wYmFjayBwb3J0IHRoZSByZW5kZXJlciB3YXRjaGRvZyBzaG91bGQgY29ubmVjdCBiYWNrIHRvLiAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9vcGJhY2sgaG9zdCB0aGUgbGl2ZW5lc3Mgc2VydmVyIGJpbmRzIHRvLiBOZXZlciBleHBvc2VkIG9mZi1tYWNoaW5lLlxuICovXG5leHBvcnQgY29uc3QgUEFSRU5UX0xJVkVORVNTX0hPU1QgPSAnMTI3LjAuMC4xJztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVkIGluIHRoZSBvd25lZCBpbnN0YW5jZSdzIHJlbmRlcmVyIHRvIGFybSB0aGVcbiAqIHdhdGNoZG9nLlxuICpcbiAqIFdyaXR0ZW4gaW4gRVM1IHN0eWxlIChgdmFyYCwgYGZ1bmN0aW9uYCkgd2l0aCBubyBvcHRpb25hbCBjaGFpbmluZywgbWF0Y2hpbmdcbiAqIHtAbGluayBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSfTogdGhlIHNhbWUgZXhwcmVzc2lvbiBoYXMgdG8gcGFyc2Ugb24gdGhlXG4gKiBDaHJvbWl1bSA4MC1lcmEgcmVuZGVyZXJzIG9mIHRoZSBvbGRlc3Qgc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb25zIChMMjYpLlxuICpcbiAqIEFybWluZyBpcyBpZGVtcG90ZW50IFx1MjAxNCBhIHNlY29uZCBldmFsdWF0aW9uIGZpbmRzIHRoZSBzdG9yZWQgc29ja2V0IGFuZFxuICogcmV0dXJucyB3aXRob3V0IG9wZW5pbmcgYW5vdGhlciBjb25uZWN0aW9uLCBzbyBhIHJldHJpZWQgcmVhZGluZXNzIHBhc3MgZG9lc1xuICogbm90IHBpbGUgdXAgc29ja2V0cy5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBsb29wYmFjayBwb3J0IHJldHVybmVkIGJ5IHtAbGluayBzdGFydFBhcmVudExpdmVuZXNzU2VydmVyfS5cbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLCB5aWVsZGluZyBgJ2FybWVkJ2AsIGAnYWxyZWFkeS1hcm1lZCdgLCBvciBgJ3VuYXZhaWxhYmxlJ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBhcmVudExpdmVuZXNzV2F0Y2hkb2dFeHByKHBvcnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgKGZ1bmN0aW9uKCkge1xuICB2YXIgRkxBRyA9ICdfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nUGFyZW50TGl2ZW5lc3MnO1xuICBpZiAod2luZG93W0ZMQUddKSB7IHJldHVybiAnYWxyZWFkeS1hcm1lZCc7IH1cbiAgdmFyIG5ldDtcbiAgdHJ5IHtcbiAgICBuZXQgPSB3aW5kb3cucmVxdWlyZSgnbm9kZTpuZXQnKTtcbiAgfSBjYXRjaCAobm9kZVByZWZpeEVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldCA9IHdpbmRvdy5yZXF1aXJlKCduZXQnKTtcbiAgICB9IGNhdGNoIChiYXJlUHJlZml4RXJyb3IpIHtcbiAgICAgIHJldHVybiAndW5hdmFpbGFibGUnO1xuICAgIH1cbiAgfVxuICB2YXIgc29ja2V0ID0gbmV0LmNvbm5lY3QoJHtTdHJpbmcocG9ydCl9LCAnJHtQQVJFTlRfTElWRU5FU1NfSE9TVH0nKTtcbiAgd2luZG93W0ZMQUddID0gc29ja2V0O1xuICB2YXIgaXNDb25uZWN0ZWQgPSBmYWxzZTtcbiAgc29ja2V0Lm9uKCdjb25uZWN0JywgZnVuY3Rpb24oKSB7IGlzQ29ubmVjdGVkID0gdHJ1ZTsgfSk7XG4gIHNvY2tldC5vbignZXJyb3InLCBmdW5jdGlvbigpIHsgLyogSGFuZGxlZCBieSB0aGUgY2xvc2UgbGlzdGVuZXIgYmVsb3cuICovIH0pO1xuICBzb2NrZXQub24oJ2Nsb3NlJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKCFpc0Nvbm5lY3RlZCkgeyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgd2luZG93LmVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIChkZXN0cm95RXJyb3IpIHtcbiAgICAgIHdpbmRvdy5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiAnYXJtZWQnO1xufSkoKWA7XG59XG5cbi8qKlxuICogU3RhcnRzIHRoZSBsb29wYmFjayBsaXZlbmVzcyBzZXJ2ZXIgdGhlIG93bmVkIGluc3RhbmNlJ3MgcmVuZGVyZXIgY29ubmVjdHNcbiAqIGJhY2sgdG8uXG4gKlxuICogVGhlIHNlcnZlciBhbmQgZXZlcnkgYWNjZXB0ZWQgc29ja2V0IGFyZSBgdW5yZWZgZWQsIHNvIGhvbGRpbmcgYSB3YXRjaGRvZ1xuICogY29ubmVjdGlvbiBvcGVuIG5ldmVyIGtlZXBzIHRoZSBoYXJuZXNzIHByb2Nlc3MgYWxpdmUgb24gaXRzIG93biBcdTIwMTQgdGhlXG4gKiBjb25uZWN0aW9uIGlzIGEgdG9rZW4gdGhlIGtlcm5lbCByZWNsYWltcywgbm90IHdvcmsgdG8gd2FpdCBvbi5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGxpc3RlbmluZyB7QGxpbmsgUGFyZW50TGl2ZW5lc3NTZXJ2ZXJ9LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRQYXJlbnRMaXZlbmVzc1NlcnZlcigpOiBQcm9taXNlPFBhcmVudExpdmVuZXNzU2VydmVyPiB7XG4gIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigoc29ja2V0KSA9PiB7XG4gICAgc29ja2V0LnVucmVmKCk7XG4gICAgLy8gVGhlIGNvbm5lY3Rpb24gY2FycmllcyBubyBkYXRhIFx1MjAxNCBpdCBleGlzdHMgb25seSBzbyBpdHMgY2xvc2UgaXMgb2JzZXJ2YWJsZS5cbiAgICBzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgLy8gQSByZW5kZXJlciB0b3JuIGRvd24gbWlkLWNvbm5lY3Rpb24gcmVzZXRzIHJhdGhlciB0aGFuIGNsb3Nlczsgbm90IGFuIGVycm9yIGhlcmUuXG4gICAgfSk7XG4gIH0pO1xuICBzZXJ2ZXIudW5yZWYoKTtcblxuICBjb25zdCBwb3J0ID0gYXdhaXQgbGlzdGVuT25GcmVlTG9vcGJhY2tQb3J0KHNlcnZlcik7XG4gIHJldHVybiB7XG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICB9LFxuICAgIHBvcnRcbiAgfTtcbn1cblxuLyoqXG4gKiBCaW5kcyB0aGUgc2VydmVyIHRvIGFuIGVwaGVtZXJhbCBsb29wYmFjayBwb3J0IGFuZCByZXBvcnRzIHdoaWNoIG9uZSBpdCBnb3QuXG4gKlxuICogQHBhcmFtIHNlcnZlciAtIFRoZSBzZXJ2ZXIgdG8gYmluZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgYXNzaWduZWQgcG9ydC5cbiAqIEB0aHJvd3MgSWYgdGhlIHNlcnZlciByZXBvcnRzIGFuIGVycm9yIGJlZm9yZSBsaXN0ZW5pbmcsIG9yIGJpbmRzIHRvIGEgcGlwZSByYXRoZXIgdGhhbiBhIHBvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxpc3Rlbk9uRnJlZUxvb3BiYWNrUG9ydChzZXJ2ZXI6IFNlcnZlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgIHNlcnZlci5saXN0ZW4oMCwgUEFSRU5UX0xJVkVORVNTX0hPU1QsICgpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgaWYgKGFkZHJlc3MgPT09IG51bGwgfHwgdHlwZW9mIGFkZHJlc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBwYXJlbnQtbGl2ZW5lc3MgcG9ydC4nKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoYWRkcmVzcy5wb3J0KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXNDQSxzQkFBNkI7QUFpQnRCLE1BQU0sdUJBQXVCO0FBaUI3QixTQUFTLGdDQUFnQyxNQUFzQjtBQUNwRSxTQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsNkJBYW9CLE9BQU8sSUFBSSxDQUFDLE1BQU0sb0JBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVuRTtBQVlBLGVBQXNCLDRCQUEyRDtBQUMvRSxRQUFNLGFBQVMsOEJBQWEsQ0FBQyxXQUFXO0FBQ3RDLFdBQU8sTUFBTTtBQUViLFdBQU8sR0FBRyxTQUFTLE1BQU07QUFBQSxJQUV6QixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0QsU0FBTyxNQUFNO0FBRWIsUUFBTSxPQUFPLE1BQU0seUJBQXlCLE1BQU07QUFDbEQsU0FBTztBQUFBLElBQ0wsUUFBYztBQUNaLGFBQU8sTUFBTTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBU0EsZUFBZSx5QkFBeUIsUUFBaUM7QUFDdkUsU0FBTyxJQUFJLFFBQWdCLENBQUMsU0FBUyxXQUFXO0FBQzlDLFdBQU8sS0FBSyxTQUFTLE1BQU07QUFDM0IsV0FBTyxPQUFPLEdBQUcsc0JBQXNCLE1BQU07QUFDM0MsWUFBTSxVQUFVLE9BQU8sUUFBUTtBQUMvQixVQUFJLFlBQVksUUFBUSxPQUFPLFlBQVksVUFBVTtBQUNuRCxlQUFPLE1BQU07QUFDYixlQUFPLElBQUksTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRTtBQUFBLE1BQ0Y7QUFDQSxjQUFRLFFBQVEsSUFBSTtBQUFBLElBQ3RCLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Ties a harness-owned Obsidian instance's lifetime to the harness process that
|
|
5
|
+
* launched it, in the one direction the operating system will not do for us.
|
|
6
|
+
*
|
|
7
|
+
* The owned instance is already a child of the harness process, but that link
|
|
8
|
+
* carries no lifetime guarantee. Windows never propagates a parent's death to
|
|
9
|
+
* its children — an orphan simply keeps running with a stale parent id — and on
|
|
10
|
+
* POSIX a `SIGKILL` aimed at a single pid never cascades either. The instance is
|
|
11
|
+
* additionally spawned `detached`, so it is not even in the harness's process
|
|
12
|
+
* group. Teardown therefore relies entirely on the harness running its own
|
|
13
|
+
* cleanup (`killProcessTree` from an `exit`/signal handler), which is exactly
|
|
14
|
+
* what a `SIGKILL`, a Task Manager kill, or an IDE stop button denies it. Every
|
|
15
|
+
* such kill leaks a hidden Obsidian holding a user-data dir and a CDP port, and
|
|
16
|
+
* they accumulate: the next run picks a fresh temp dir and a free port, so
|
|
17
|
+
* nothing collides and nothing complains.
|
|
18
|
+
*
|
|
19
|
+
* The guaranteed fix is an OS primitive — a Windows Job Object with
|
|
20
|
+
* `JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE`, or `prctl(PR_SET_PDEATHSIG)` on Linux —
|
|
21
|
+
* but neither is reachable from Node without a native addon, which is far too
|
|
22
|
+
* heavy a dependency for this harness.
|
|
23
|
+
*
|
|
24
|
+
* So we use the one cross-platform resource the kernel *does* reclaim
|
|
25
|
+
* deterministically on process death: a socket. The harness listens on a
|
|
26
|
+
* loopback port and the instance's renderer connects to it. However the harness
|
|
27
|
+
* dies — cleanly, `SIGKILL`ed, or crashed — the kernel closes its end, the
|
|
28
|
+
* renderer sees `close`, and the window destroys itself. No polling, no
|
|
29
|
+
* heartbeat interval, no timeout to tune.
|
|
30
|
+
*
|
|
31
|
+
* Deliberately fail-open: the renderer only arms the destroy handler after the
|
|
32
|
+
* connection is actually established. A watchdog that cannot reach the harness
|
|
33
|
+
* leaves the instance running rather than killing a window the developer is
|
|
34
|
+
* working in.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* A listening loopback server whose accepted connections act as liveness tokens
|
|
38
|
+
* for the harness process.
|
|
39
|
+
*/
|
|
40
|
+
export interface ParentLivenessServer {
|
|
41
|
+
/** Stops listening and drops every accepted connection. */
|
|
42
|
+
close(): void;
|
|
43
|
+
/** The loopback port the renderer watchdog should connect back to. */
|
|
44
|
+
readonly port: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Loopback host the liveness server binds to. Never exposed off-machine.
|
|
48
|
+
*/
|
|
49
|
+
export declare const PARENT_LIVENESS_HOST = "127.0.0.1";
|
|
50
|
+
/**
|
|
51
|
+
* Builds the expression evaluated in the owned instance's renderer to arm the
|
|
52
|
+
* watchdog.
|
|
53
|
+
*
|
|
54
|
+
* Written in ES5 style (`var`, `function`) with no optional chaining, matching
|
|
55
|
+
* {@link DISMISS_TRUST_DIALOG_EXPR}: the same expression has to parse on the
|
|
56
|
+
* Chromium 80-era renderers of the oldest supported Obsidian versions (L26).
|
|
57
|
+
*
|
|
58
|
+
* Arming is idempotent — a second evaluation finds the stored socket and
|
|
59
|
+
* returns without opening another connection, so a retried readiness pass does
|
|
60
|
+
* not pile up sockets.
|
|
61
|
+
*
|
|
62
|
+
* @param port - The loopback port returned by {@link startParentLivenessServer}.
|
|
63
|
+
* @returns The expression to evaluate, yielding `'armed'`, `'already-armed'`, or `'unavailable'`.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildParentLivenessWatchdogExpr(port: number): string;
|
|
66
|
+
/**
|
|
67
|
+
* Starts the loopback liveness server the owned instance's renderer connects
|
|
68
|
+
* back to.
|
|
69
|
+
*
|
|
70
|
+
* The server and every accepted socket are `unref`ed, so holding a watchdog
|
|
71
|
+
* connection open never keeps the harness process alive on its own — the
|
|
72
|
+
* connection is a token the kernel reclaims, not work to wait on.
|
|
73
|
+
*
|
|
74
|
+
* @returns A {@link Promise} resolving to the listening {@link ParentLivenessServer}.
|
|
75
|
+
*/
|
|
76
|
+
export declare function startParentLivenessServer(): Promise<ParentLivenessServer>;
|