obsidian-integration-testing 9.0.0 → 9.1.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.
- package/README.md +30 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +77 -0
- package/dist/lib/cjs/demo-vault-populate.d.cts +71 -0
- package/dist/lib/cjs/enable-plugin.cjs +56 -5
- package/dist/lib/cjs/enable-plugin.d.cts +26 -1
- package/dist/lib/cjs/global-setup-core.cjs +78 -13
- package/dist/lib/cjs/global-setup-core.d.cts +9 -0
- package/dist/lib/cjs/index.cjs +7 -1
- package/dist/lib/cjs/index.d.cts +4 -0
- package/dist/lib/cjs/jest/global-setup.cjs +7 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +9 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/plugin-enable-retry.cjs +53 -0
- package/dist/lib/cjs/plugin-enable-retry.d.cts +71 -0
- package/dist/lib/cjs/poll-in-obsidian.cjs +72 -0
- package/dist/lib/cjs/poll-in-obsidian.d.cts +92 -0
- package/dist/lib/cjs/poll-until.cjs +43 -0
- package/dist/lib/cjs/poll-until.d.cts +42 -0
- package/dist/lib/cjs/transport-appium.cjs +51 -1
- package/dist/lib/cjs/transport-appium.d.cts +24 -1
- package/dist/lib/cjs/transport-desktop-cdp.cjs +20 -11
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +9 -2
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +28 -0
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +37 -0
- package/dist/lib/cjs/vault-path-match.cjs +49 -0
- package/dist/lib/cjs/vault-path-match.d.cts +36 -0
- package/dist/lib/cjs/vitest/global-setup.cjs +7 -2
- package/dist/lib/cjs/vitest/global-setup.d.cts +9 -2
- package/dist/lib/esm/demo-vault-populate.d.mts +71 -0
- package/dist/lib/esm/demo-vault-populate.mjs +57 -0
- package/dist/lib/esm/enable-plugin.d.mts +26 -1
- package/dist/lib/esm/enable-plugin.mjs +54 -4
- package/dist/lib/esm/global-setup-core.d.mts +9 -0
- package/dist/lib/esm/global-setup-core.mjs +87 -14
- package/dist/lib/esm/index.d.mts +4 -0
- package/dist/lib/esm/index.mjs +5 -1
- package/dist/lib/esm/jest/global-setup.d.mts +9 -2
- package/dist/lib/esm/jest/global-setup.mjs +7 -2
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/plugin-enable-retry.d.mts +71 -0
- package/dist/lib/esm/plugin-enable-retry.mjs +24 -0
- package/dist/lib/esm/poll-in-obsidian.d.mts +92 -0
- package/dist/lib/esm/poll-in-obsidian.mjs +48 -0
- package/dist/lib/esm/poll-until.d.mts +42 -0
- package/dist/lib/esm/poll-until.mjs +19 -0
- package/dist/lib/esm/transport-appium.d.mts +24 -1
- package/dist/lib/esm/transport-appium.mjs +51 -1
- package/dist/lib/esm/transport-desktop-cdp.d.mts +9 -2
- package/dist/lib/esm/transport-desktop-cdp.mjs +20 -11
- package/dist/lib/esm/transport-options.d.mts +28 -0
- package/dist/lib/esm/transport.d.mts +37 -0
- package/dist/lib/esm/vault-path-match.d.mts +36 -0
- package/dist/lib/esm/vault-path-match.mjs +14 -0
- package/dist/lib/esm/vitest/global-setup.d.mts +9 -2
- package/dist/lib/esm/vitest/global-setup.mjs +7 -2
- package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
- package/package.json +1 -1
- package/dist/obsidian-integration-testing-9.0.0.tgz +0 -0
|
@@ -14,7 +14,12 @@ function createSetup(options) {
|
|
|
14
14
|
return { setup: setup2, teardown: teardown2 };
|
|
15
15
|
async function setup2() {
|
|
16
16
|
const transportOptions = globalThis.__obsidianIntegrationTesting?.transportOptions;
|
|
17
|
-
setupResult = await coreSetup({
|
|
17
|
+
setupResult = await coreSetup({
|
|
18
|
+
enableCommunityPlugins: options?.enableCommunityPlugins,
|
|
19
|
+
installPlugin: options?.installPlugin,
|
|
20
|
+
populate: options?.populate?.(),
|
|
21
|
+
transportOptions
|
|
22
|
+
});
|
|
18
23
|
globalThis.__obsidianIntegrationTesting = {
|
|
19
24
|
...globalThis.__obsidianIntegrationTesting,
|
|
20
25
|
tempVaultPath: setupResult.tempVault.path,
|
|
@@ -49,4 +54,4 @@ export {
|
|
|
49
54
|
setup,
|
|
50
55
|
teardown
|
|
51
56
|
};
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2plc3QvZ2xvYmFsLXNldHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSmVzdCBnbG9iYWwgc2V0dXAgYW5kIHRlYXJkb3duIGFkYXB0ZXIuXG4gKlxuICogRGVsZWdhdGVzIHRvIHRoZSBmcmFtZXdvcmstYWdub3N0aWMgY29yZSBhbmQgYnJpZGdlcyBjb250ZXh0XG4gKiB0byB0ZXN0IHdvcmtlcnMgdmlhIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQubWpzJztcblxuLyoqXG4gKiBTaGFwZSBvZiBgZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYC5cbiAqXG4gKiBDb25zdW1lcnMgbWF5IHByZS1wb3B1bGF0ZSBgdHJhbnNwb3J0T3B0aW9uc2AgYmVmb3JlIHRoZSBnbG9iYWwgc2V0dXAgcnVuc1xuICogKGUuZy4sIHZpYSBKZXN0IGNvbmZpZyBgZ2xvYmFsc2ApLiBUaGUgc2V0dXAgdGhlbiBhZGRzIGB0ZW1wVmF1bHRQYXRoYC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nR2xvYmFsIHtcbiAgLyoqIFRlbXAgdmF1bHQgcGF0aCwgc2V0IGJ5IHRoZSBnbG9iYWwgc2V0dXAgZm9yIHRlc3Qgd29ya2Vycy4gKi9cbiAgdGVtcFZhdWx0UGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFNldCBieSB0aGUgY29uc3VtZXIgYmVmb3JlIHNldHVwLCBvciBieSB0aGUgc2V0dXAgaXRzZWxmLiAqL1xuICB0cmFuc3BvcnRPcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSB2YXJzLW9uLXRvcCAtLSBSZXF1aXJlZCBmb3IgYGRlY2xhcmUgZ2xvYmFsYCBhdWdtZW50YXRpb24uICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgZm9yIGFsbCBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgZ2xvYmFsIHN0YXRlLlxuICAgKiBDb25zdW1lcnMgY29uZmlndXJlIHRyYW5zcG9ydCBvcHRpb25zIGhlcmU7IHRoZSBzZXR1cCBwb3B1bGF0ZXMgdGhlIHJlc3QuXG4gICAqL1xuICB2YXIgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdHbG9iYWwgfCB1bmRlZmluZWQ7XG59XG4vKiBlc2xpbnQtZW5hYmxlIHZhcnMtb24tdG9wIC0tIEVuZCBvZiBgZGVjbGFyZSBnbG9iYWxgIGJsb2NrLiAqL1xuXG5zZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoKCkgPT4gZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50cmFuc3BvcnRPcHRpb25zKTtcbnNldFZhdWx0UGF0aFJlc29sdmVyKCgpID0+IGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udGVtcFZhdWx0UGF0aCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXR1cE9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGJ1aWx0IHBsdWdpbiBpbiB0aGUgdGVtcCB2YXVsdC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLiBTZXQgdG8gYGZhbHNlYCBmb3IgYSAqKm5vbi1wbHVnaW4qKiBjb25zdW1lciB0aGF0IG9ubHkgbmVlZHMgYVxuICAgKiByZWdpc3RlcmVkLCBlbXB0eSB2YXVsdCB0byBgZXZhbEluT2JzaWRpYW5gIGFnYWluc3QgXHUyMDE0IHRoZSBvd25lZCBpbnN0YW5jZSBpc1xuICAgKiBzdGlsbCBsYXVuY2hlZCBhbmQgaXRzIGVuZHBvaW50IHB1Ymxpc2hlZCB0byB3b3JrZXJzLCBzbyByZS1leHBvcnRpbmdcbiAgICogYGNyZWF0ZVNldHVwKHsgaW5zdGFsbFBsdWdpbjogZmFsc2UgfSlgIHJldXNlcyB0aGUgc2FtZSBhdHRhY2ggd2lyaW5nIHdpdGggbm9cbiAgICogcGx1Z2luIGNvcHkvZW5hYmxlLiBTZWUge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5pbnN0YWxsUGx1Z2lufS5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpbGVzL2ZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgYmVmb3JlIE9ic2lkaWFuIG9wZW5zIGl0IChzZWVcbiAgICoge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX0pLiBBIHRodW5rIHNvIGxhcmdlIGZpeHR1cmVzIGFyZSBidWlsdCBsYXppbHksXG4gICAqIG9uY2UsIGluIHRoZSBzZXR1cCBwcm9jZXNzLlxuICAgKi9cbiAgcG9wdWxhdGU/KHRoaXM6IHZvaWQpOiBQb3B1bGF0ZUZpbGVzUGFyYW1zO1xufVxuXG4vKipcbiAqIEEgSmVzdCBgZ2xvYmFsU2V0dXBgIC8gYGdsb2JhbFRlYXJkb3duYCBtb2R1bGUncyBgc2V0dXBgIC8gYHRlYXJkb3duYCBwYWlyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEplc3RHbG9iYWxTZXR1cCB7XG4gIHNldHVwKHRoaXM6IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xuICB0ZWFyZG93bih0aGlzOiB2b2lkKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgSmVzdCBnbG9iYWwgc2V0dXAvdGVhcmRvd24gcGFpciwgb3B0aW9uYWxseSBwcmUtcG9wdWxhdGluZyB0aGUgdmF1bHRcbiAqIGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCBcdTIwMTQgdXNlIHRoaXMgZm9yIGEgZGVkaWNhdGVkIGxhcmdlLXZhdWx0L3BlcmZvcm1hbmNlXG4gKiBzZXR1cC4gVGhlIHBsYWluIHtAbGluayBzZXR1cH0gLyB7QGxpbmsgdGVhcmRvd259IGV4cG9ydHMgYXJlIHRoZSBuby1wb3B1bGF0ZVxuICogY2FzZSAoYGNyZWF0ZVNldHVwKClgKS4gUGFzcyBgeyBpbnN0YWxsUGx1Z2luOiBmYWxzZSB9YCBmb3IgYSBub24tcGx1Z2luIGNvbnN1bWVyXG4gKiB0aGF0IG9ubHkgbmVlZHMgYSByZWdpc3RlcmVkLCBlbXB0eSB2YXVsdCAoc2VlIHtAbGluayBDcmVhdGVTZXR1cE9wdGlvbnMuaW5zdGFsbFBsdWdpbn0pLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2V0dXAgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBgc2V0dXBgIGFuZCBgdGVhcmRvd25gIGZ1bmN0aW9ucyB0byByZS1leHBvcnQgZnJvbSBhIGBnbG9iYWxTZXR1cGAgbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0dXAob3B0aW9ucz86IENyZWF0ZVNldHVwT3B0aW9ucyk6IEplc3RHbG9iYWxTZXR1cCB7XG4gIGxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IHNldHVwLCB0ZWFyZG93biB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnRyYW5zcG9ydE9wdGlvbnM7XG5cbiAgICBzZXR1cFJlc3VsdCA9IGF3YWl0IGNvcmVTZXR1cCh7IGluc3RhbGxQbHVnaW46IG9wdGlvbnM/Lmluc3RhbGxQbHVnaW4sIHBvcHVsYXRlOiBvcHRpb25zPy5wb3B1bGF0ZT8uKCksIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG5cbiAgICBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcgPSB7XG4gICAgICAuLi5nbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcsXG4gICAgICB0ZW1wVmF1bHRQYXRoOiBzZXR1cFJlc3VsdC50ZW1wVmF1bHQucGF0aCxcbiAgICAgIHRyYW5zcG9ydE9wdGlvbnM6IHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnNcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdGVhcmRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgY29yZVRlYXJkb3duKHNldHVwUmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRlbXBvcmFyeSB2YXVsdCBwcm92aWRlZCBieSB0aGUgZ2xvYmFsIHNldHVwLlxuICpcbiAqIFJlYWRzIHRoZSB2YXVsdCBwYXRoIGZyb20gYGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy50ZW1wVmF1bHRQYXRoYCxcbiAqIHdoaWNoIGlzIHNldCBieSB0aGUgSmVzdCBnbG9iYWwgc2V0dXAuXG4gKlxuICogQHJldHVybnMgVGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBWYXVsdCgpOiBUZW1wVmF1bHQge1xuICBjb25zdCB0ZW1wVmF1bHRQYXRoID0gZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50ZW1wVmF1bHRQYXRoO1xuICBpZiAoIXRlbXBWYXVsdFBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnRlbXBWYXVsdFBhdGggaXMgbm90IHNldC4gRGlkIHlvdSBjb25maWd1cmUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy9qZXN0LWdsb2JhbC1zZXR1cCBhcyBhIEplc3QgZ2xvYmFsU2V0dXA/J1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ldyBUZW1wVmF1bHQodGVtcFZhdWx0UGF0aCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJhbnNwb3J0IG9wdGlvbnMgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNwb3J0IG9wdGlvbnMsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50cmFuc3BvcnRPcHRpb25zO1xufVxuXG5jb25zdCBkZWZhdWx0R2xvYmFsU2V0dXAgPSBjcmVhdGVTZXR1cCgpO1xuXG4vKipcbiAqIEplc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uIChubyBwcmUtcG9wdWxhdGlvbikuXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgdGhlIE9ic2lkaWFuIENMSSxcbiAqIGFuZCBwb3B1bGF0ZXMgYGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgZm9yIHRlc3RzLlxuICpcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGFyZSByZWFkIGZyb20gYGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy50cmFuc3BvcnRPcHRpb25zYC5cbiAqIFNldCB0aGlzIGluIHlvdXIgSmVzdCBjb25maWcgdmlhIHRoZSBgZ2xvYmFsc2Agb3B0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2V0dXAgY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3Qgc2V0dXAgPSBkZWZhdWx0R2xvYmFsU2V0dXAuc2V0dXA7XG5cbi8qKlxuICogSmVzdCBnbG9iYWwgdGVhcmRvd24gZnVuY3Rpb24uXG4gKlxuICogUmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGVhcmRvd24gY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3QgdGVhcmRvd24gPSBkZWZhdWx0R2xvYmFsU2V0dXAudGVhcmRvd247XG5cbi8vIEplc3QncyBgZ2xvYmFsU2V0dXBgIGNvbmZpZyBjYW4gcmVmZXJlbmNlIHRoaXMgbW9kdWxlIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGRlZmF1bHQgZXhwb3J0IGlzIHRoZSBzZXR1cCBmdW5jdGlvbi5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1kZWZhdWx0LWV4cG9ydCAtLSBKZXN0J3MgZ2xvYmFsU2V0dXAgbG9hZGVyIHJlcXVpcmVzIGEgZGVmYXVsdC1leHBvcnQgZnVuY3Rpb24uXG5leHBvcnQgZGVmYXVsdCBzZXR1cDtcbiJdLAogICJtYXBwaW5ncyI6ICJBQWVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlCQUFpQjtBQTBCMUIsNEJBQTRCLE1BQU0sV0FBVyw4QkFBOEIsZ0JBQWdCO0FBQzNGLHFCQUFxQixNQUFNLFdBQVcsOEJBQThCLGFBQWE7QUEwQzFFLFNBQVMsWUFBWSxTQUErQztBQUN6RSxNQUFJO0FBRUosU0FBTyxFQUFFLE9BQUFBLFFBQU8sVUFBQUMsVUFBUztBQUV6QixpQkFBZUQsU0FBdUI7QUFDcEMsVUFBTSxtQkFBbUIsV0FBVyw4QkFBOEI7QUFFbEUsa0JBQWMsTUFBTSxVQUFVLEVBQUUsZUFBZSxTQUFTLGVBQWUsVUFBVSxTQUFTLFdBQVcsR0FBRyxpQkFBaUIsQ0FBQztBQUUxSCxlQUFXLCtCQUErQjtBQUFBLE1BQ3hDLEdBQUcsV0FBVztBQUFBLE1BQ2QsZUFBZSxZQUFZLFVBQVU7QUFBQSxNQUNyQyxrQkFBa0IsWUFBWTtBQUFBLElBQ2hDO0FBQUEsRUFDRjtBQUVBLGlCQUFlQyxZQUEwQjtBQUN2QyxVQUFNLGFBQWEsV0FBVztBQUFBLEVBQ2hDO0FBQ0Y7QUFVTyxTQUFTLGVBQTBCO0FBQ3hDLFFBQU0sZ0JBQWdCLFdBQVcsOEJBQThCO0FBQy9ELE1BQUksQ0FBQyxlQUFlO0FBQ2xCLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNBLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFPTyxTQUFTLHNCQUE0RDtBQUMxRSxTQUFPLFdBQVcsOEJBQThCO0FBQ2xEO0FBRUEsTUFBTSxxQkFBcUIsWUFBWTtBQWFoQyxNQUFNLFFBQVEsbUJBQW1CO0FBU2pDLE1BQU0sV0FBVyxtQkFBbUI7QUFJM0MsSUFBTyx1QkFBUTsiLAogICJuYW1lcyI6IFsic2V0dXAiLCAidGVhcmRvd24iXQp9Cg==
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2plc3QvZ2xvYmFsLXNldHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSmVzdCBnbG9iYWwgc2V0dXAgYW5kIHRlYXJkb3duIGFkYXB0ZXIuXG4gKlxuICogRGVsZWdhdGVzIHRvIHRoZSBmcmFtZXdvcmstYWdub3N0aWMgY29yZSBhbmQgYnJpZGdlcyBjb250ZXh0XG4gKiB0byB0ZXN0IHdvcmtlcnMgdmlhIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4uL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbmltcG9ydCB7XG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuaW1wb3J0IHtcbiAgY29yZVNldHVwLFxuICBjb3JlVGVhcmRvd25cbn0gZnJvbSAnLi4vZ2xvYmFsLXNldHVwLWNvcmUubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4uL3RlbXAtdmF1bHQubWpzJztcblxuLyoqXG4gKiBTaGFwZSBvZiBgZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYC5cbiAqXG4gKiBDb25zdW1lcnMgbWF5IHByZS1wb3B1bGF0ZSBgdHJhbnNwb3J0T3B0aW9uc2AgYmVmb3JlIHRoZSBnbG9iYWwgc2V0dXAgcnVuc1xuICogKGUuZy4sIHZpYSBKZXN0IGNvbmZpZyBgZ2xvYmFsc2ApLiBUaGUgc2V0dXAgdGhlbiBhZGRzIGB0ZW1wVmF1bHRQYXRoYC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nR2xvYmFsIHtcbiAgLyoqIFRlbXAgdmF1bHQgcGF0aCwgc2V0IGJ5IHRoZSBnbG9iYWwgc2V0dXAgZm9yIHRlc3Qgd29ya2Vycy4gKi9cbiAgdGVtcFZhdWx0UGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFNldCBieSB0aGUgY29uc3VtZXIgYmVmb3JlIHNldHVwLCBvciBieSB0aGUgc2V0dXAgaXRzZWxmLiAqL1xuICB0cmFuc3BvcnRPcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSB2YXJzLW9uLXRvcCAtLSBSZXF1aXJlZCBmb3IgYGRlY2xhcmUgZ2xvYmFsYCBhdWdtZW50YXRpb24uICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8qKlxuICAgKiBOYW1lc3BhY2UgZm9yIGFsbCBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgZ2xvYmFsIHN0YXRlLlxuICAgKiBDb25zdW1lcnMgY29uZmlndXJlIHRyYW5zcG9ydCBvcHRpb25zIGhlcmU7IHRoZSBzZXR1cCBwb3B1bGF0ZXMgdGhlIHJlc3QuXG4gICAqL1xuICB2YXIgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdHbG9iYWwgfCB1bmRlZmluZWQ7XG59XG4vKiBlc2xpbnQtZW5hYmxlIHZhcnMtb24tdG9wIC0tIEVuZCBvZiBgZGVjbGFyZSBnbG9iYWxgIGJsb2NrLiAqL1xuXG5zZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoKCkgPT4gZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50cmFuc3BvcnRPcHRpb25zKTtcbnNldFZhdWx0UGF0aFJlc29sdmVyKCgpID0+IGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udGVtcFZhdWx0UGF0aCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXR1cE9wdGlvbnMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCBpbiBhZGRpdGlvbiB0byB0aGUgcGx1Z2luLXVuZGVyLXRlc3QsXG4gICAqIGFmdGVyIGl0IGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLmVuYWJsZUNvbW11bml0eVBsdWdpbnN9KS4gU2VlZCBlYWNoXG4gICAqIHBsdWdpbidzIGJ1aWx0IGZpbGVzIHZpYSB7QGxpbmsgQ3JlYXRlU2V0dXBPcHRpb25zLnBvcHVsYXRlfSAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYClcbiAgICogc28gdGhlIGVuYWJsZSBmaW5kcyB0aGVtIG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDb21tdW5pdHlQbHVnaW5zPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBidWlsdCBwbHVnaW4gaW4gdGhlIHRlbXAgdmF1bHQuIERlZmF1bHRzXG4gICAqIHRvIGB0cnVlYC4gU2V0IHRvIGBmYWxzZWAgZm9yIGEgKipub24tcGx1Z2luKiogY29uc3VtZXIgdGhhdCBvbmx5IG5lZWRzIGFcbiAgICogcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYCBhZ2FpbnN0IFx1MjAxNCB0aGUgb3duZWQgaW5zdGFuY2UgaXNcbiAgICogc3RpbGwgbGF1bmNoZWQgYW5kIGl0cyBlbmRwb2ludCBwdWJsaXNoZWQgdG8gd29ya2Vycywgc28gcmUtZXhwb3J0aW5nXG4gICAqIGBjcmVhdGVTZXR1cCh7IGluc3RhbGxQbHVnaW46IGZhbHNlIH0pYCByZXVzZXMgdGhlIHNhbWUgYXR0YWNoIHdpcmluZyB3aXRoIG5vXG4gICAqIHBsdWdpbiBjb3B5L2VuYWJsZS4gU2VlIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsUGx1Z2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlcy9mb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0IGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCAoc2VlXG4gICAqIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9KS4gQSB0aHVuayBzbyBsYXJnZSBmaXh0dXJlcyBhcmUgYnVpbHQgbGF6aWx5LFxuICAgKiBvbmNlLCBpbiB0aGUgc2V0dXAgcHJvY2Vzcy5cbiAgICovXG4gIHBvcHVsYXRlPyh0aGlzOiB2b2lkKTogUG9wdWxhdGVGaWxlc1BhcmFtcztcbn1cblxuLyoqXG4gKiBBIEplc3QgYGdsb2JhbFNldHVwYCAvIGBnbG9iYWxUZWFyZG93bmAgbW9kdWxlJ3MgYHNldHVwYCAvIGB0ZWFyZG93bmAgcGFpci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKZXN0R2xvYmFsU2V0dXAge1xuICBzZXR1cCh0aGlzOiB2b2lkKTogUHJvbWlzZTx2b2lkPjtcbiAgdGVhcmRvd24odGhpczogdm9pZCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIEplc3QgZ2xvYmFsIHNldHVwL3RlYXJkb3duIHBhaXIsIG9wdGlvbmFsbHkgcHJlLXBvcHVsYXRpbmcgdGhlIHZhdWx0XG4gKiBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQgXHUyMDE0IHVzZSB0aGlzIGZvciBhIGRlZGljYXRlZCBsYXJnZS12YXVsdC9wZXJmb3JtYW5jZVxuICogc2V0dXAuIFRoZSBwbGFpbiB7QGxpbmsgc2V0dXB9IC8ge0BsaW5rIHRlYXJkb3dufSBleHBvcnRzIGFyZSB0aGUgbm8tcG9wdWxhdGVcbiAqIGNhc2UgKGBjcmVhdGVTZXR1cCgpYCkuIFBhc3MgYHsgaW5zdGFsbFBsdWdpbjogZmFsc2UgfWAgZm9yIGEgbm9uLXBsdWdpbiBjb25zdW1lclxuICogdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgKHNlZSB7QGxpbmsgQ3JlYXRlU2V0dXBPcHRpb25zLmluc3RhbGxQbHVnaW59KS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNldHVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYHNldHVwYCBhbmQgYHRlYXJkb3duYCBmdW5jdGlvbnMgdG8gcmUtZXhwb3J0IGZyb20gYSBgZ2xvYmFsU2V0dXBgIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHVwKG9wdGlvbnM/OiBDcmVhdGVTZXR1cE9wdGlvbnMpOiBKZXN0R2xvYmFsU2V0dXAge1xuICBsZXQgc2V0dXBSZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzZXR1cCwgdGVhcmRvd24gfTtcblxuICBhc3luYyBmdW5jdGlvbiBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50cmFuc3BvcnRPcHRpb25zO1xuXG4gICAgc2V0dXBSZXN1bHQgPSBhd2FpdCBjb3JlU2V0dXAoe1xuICAgICAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luczogb3B0aW9ucz8uZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyxcbiAgICAgIGluc3RhbGxQbHVnaW46IG9wdGlvbnM/Lmluc3RhbGxQbHVnaW4sXG4gICAgICBwb3B1bGF0ZTogb3B0aW9ucz8ucG9wdWxhdGU/LigpLFxuICAgICAgdHJhbnNwb3J0T3B0aW9uc1xuICAgIH0pO1xuXG4gICAgZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0ge1xuICAgICAgLi4uZ2xvYmFsVGhpcy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLFxuICAgICAgdGVtcFZhdWx0UGF0aDogc2V0dXBSZXN1bHQudGVtcFZhdWx0LnBhdGgsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zOiBzZXR1cFJlc3VsdC50cmFuc3BvcnRPcHRpb25zXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBSZWFkcyB0aGUgdmF1bHQgcGF0aCBmcm9tIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcudGVtcFZhdWx0UGF0aGAsXG4gKiB3aGljaCBpcyBzZXQgYnkgdGhlIEplc3QgZ2xvYmFsIHNldHVwLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0ZW1wb3JhcnkgdmF1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wVmF1bHQoKTogVGVtcFZhdWx0IHtcbiAgY29uc3QgdGVtcFZhdWx0UGF0aCA9IGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udGVtcFZhdWx0UGF0aDtcbiAgaWYgKCF0ZW1wVmF1bHRQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2dsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy50ZW1wVmF1bHRQYXRoIGlzIG5vdCBzZXQuIERpZCB5b3UgY29uZmlndXJlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcvamVzdC1nbG9iYWwtc2V0dXAgYXMgYSBKZXN0IGdsb2JhbFNldHVwPydcbiAgICApO1xuICB9XG4gIHJldHVybiBuZXcgVGVtcFZhdWx0KHRlbXBWYXVsdFBhdGgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zcG9ydCBvcHRpb25zIHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAuXG4gKlxuICogQHJldHVybnMgVGhlIHRyYW5zcG9ydCBvcHRpb25zLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgY29uZmlndXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zcG9ydE9wdGlvbnMoKTogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udHJhbnNwb3J0T3B0aW9ucztcbn1cblxuY29uc3QgZGVmYXVsdEdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoKTtcblxuLyoqXG4gKiBKZXN0IGdsb2JhbCBzZXR1cCBmdW5jdGlvbiAobm8gcHJlLXBvcHVsYXRpb24pLlxuICpcbiAqIENvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIGVuYWJsZXMgaXQgdmlhIGEgcmVuZGVyZXIgZXZhbFxuICogb3ZlciB0aGUgdHJhbnNwb3J0LCBhbmQgcG9wdWxhdGVzIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGZvciB0ZXN0cy5cbiAqXG4gKiBUcmFuc3BvcnQgb3B0aW9ucyBhcmUgcmVhZCBmcm9tIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcudHJhbnNwb3J0T3B0aW9uc2AuXG4gKiBTZXQgdGhpcyBpbiB5b3VyIEplc3QgY29uZmlnIHZpYSB0aGUgYGdsb2JhbHNgIG9wdGlvbi5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNldHVwIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNldHVwID0gZGVmYXVsdEdsb2JhbFNldHVwLnNldHVwO1xuXG4vKipcbiAqIEplc3QgZ2xvYmFsIHRlYXJkb3duIGZ1bmN0aW9uLlxuICpcbiAqIFJlbW92ZXMgdGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRlYXJkb3duIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlYXJkb3duID0gZGVmYXVsdEdsb2JhbFNldHVwLnRlYXJkb3duO1xuXG4vLyBKZXN0J3MgYGdsb2JhbFNldHVwYCBjb25maWcgY2FuIHJlZmVyZW5jZSB0aGlzIG1vZHVsZSBkaXJlY3RseSBiZWNhdXNlIGl0cyBkZWZhdWx0IGV4cG9ydCBpcyB0aGUgc2V0dXAgZnVuY3Rpb24uXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tZGVmYXVsdC1leHBvcnQgLS0gSmVzdCdzIGdsb2JhbFNldHVwIGxvYWRlciByZXF1aXJlcyBhIGRlZmF1bHQtZXhwb3J0IGZ1bmN0aW9uLlxuZXhwb3J0IGRlZmF1bHQgc2V0dXA7XG4iXSwKICAibWFwcGluZ3MiOiAiQUFlQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQkFBaUI7QUEwQjFCLDRCQUE0QixNQUFNLFdBQVcsOEJBQThCLGdCQUFnQjtBQUMzRixxQkFBcUIsTUFBTSxXQUFXLDhCQUE4QixhQUFhO0FBa0QxRSxTQUFTLFlBQVksU0FBK0M7QUFDekUsTUFBSTtBQUVKLFNBQU8sRUFBRSxPQUFBQSxRQUFPLFVBQUFDLFVBQVM7QUFFekIsaUJBQWVELFNBQXVCO0FBQ3BDLFVBQU0sbUJBQW1CLFdBQVcsOEJBQThCO0FBRWxFLGtCQUFjLE1BQU0sVUFBVTtBQUFBLE1BQzVCLHdCQUF3QixTQUFTO0FBQUEsTUFDakMsZUFBZSxTQUFTO0FBQUEsTUFDeEIsVUFBVSxTQUFTLFdBQVc7QUFBQSxNQUM5QjtBQUFBLElBQ0YsQ0FBQztBQUVELGVBQVcsK0JBQStCO0FBQUEsTUFDeEMsR0FBRyxXQUFXO0FBQUEsTUFDZCxlQUFlLFlBQVksVUFBVTtBQUFBLE1BQ3JDLGtCQUFrQixZQUFZO0FBQUEsSUFDaEM7QUFBQSxFQUNGO0FBRUEsaUJBQWVDLFlBQTBCO0FBQ3ZDLFVBQU0sYUFBYSxXQUFXO0FBQUEsRUFDaEM7QUFDRjtBQVVPLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsV0FBVyw4QkFBOEI7QUFDL0QsTUFBSSxDQUFDLGVBQWU7QUFDbEIsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsU0FBTyxJQUFJLFVBQVUsYUFBYTtBQUNwQztBQU9PLFNBQVMsc0JBQTREO0FBQzFFLFNBQU8sV0FBVyw4QkFBOEI7QUFDbEQ7QUFFQSxNQUFNLHFCQUFxQixZQUFZO0FBYWhDLE1BQU0sUUFBUSxtQkFBbUI7QUFTakMsTUFBTSxXQUFXLG1CQUFtQjtBQUkzQyxJQUFPLHVCQUFROyIsCiAgIm5hbWVzIjogWyJzZXR1cCIsICJ0ZWFyZG93biJdCn0K
|
package/dist/lib/esm/library.mjs
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure helpers for retrying the plugin-enable step, plus resolving the retry
|
|
5
|
+
* knobs from the transport options. Kept separate from the integration-only
|
|
6
|
+
* `global-setup-core` orchestration so the decision logic and default
|
|
7
|
+
* resolution stay unit-testable (the orchestration itself needs a real
|
|
8
|
+
* transport and is excluded from unit tests).
|
|
9
|
+
*
|
|
10
|
+
* When the harness auto-starts an Android emulator (cold boot) and immediately
|
|
11
|
+
* syncs the vault and enables the plugin, the plugin can land in the enabled set
|
|
12
|
+
* but fail to load — the freshly booted guest's plugin subsystem isn't settled
|
|
13
|
+
* and the single-shot enable races it. Device-idle and `layoutReady` are already
|
|
14
|
+
* gated upstream, so the residual gap is narrow; retrying the enable a few times
|
|
15
|
+
* with backoff recovers the transient race while still failing fast on a genuine
|
|
16
|
+
* plugin bug (a captured load error, which retrying cannot fix).
|
|
17
|
+
*/
|
|
18
|
+
import type { EnablePluginResult } from './enable-plugin.mjs';
|
|
19
|
+
import type { ObsidianTransportOptions } from './transport-options.mjs';
|
|
20
|
+
/**
|
|
21
|
+
* Default for {@link ObsidianAndroidAppiumTransportOptions.pluginEnableRetryCount}.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_PLUGIN_ENABLE_RETRY_COUNT = 3;
|
|
24
|
+
/**
|
|
25
|
+
* Default for {@link ObsidianAndroidAppiumTransportOptions.pluginEnableRetryDelayInMilliseconds}.
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_PLUGIN_ENABLE_RETRY_DELAY_IN_MILLISECONDS = 2000;
|
|
28
|
+
/**
|
|
29
|
+
* Computes the exponential backoff delay for a given retry, from a base delay.
|
|
30
|
+
*
|
|
31
|
+
* `attemptIndex` is 0-based: the first retry waits the base delay, the second
|
|
32
|
+
* twice that, the third four times, and so on.
|
|
33
|
+
*
|
|
34
|
+
* @param baseDelayInMilliseconds - The base delay.
|
|
35
|
+
* @param attemptIndex - The 0-based retry index.
|
|
36
|
+
* @returns The delay in milliseconds for this retry.
|
|
37
|
+
*/
|
|
38
|
+
export declare function computeBackoffDelayInMilliseconds(baseDelayInMilliseconds: number, attemptIndex: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* Resolves the number of extra plugin-enable attempts, applying the default when
|
|
41
|
+
* the option is omitted. Only the Android transport carries the knob; every
|
|
42
|
+
* other transport (and `undefined`) falls back to the default — harmless there,
|
|
43
|
+
* since a plugin that loads on the first try never enters the retry path.
|
|
44
|
+
*
|
|
45
|
+
* A value of `0` disables retry (a single attempt).
|
|
46
|
+
*
|
|
47
|
+
* @param options - The resolved transport options.
|
|
48
|
+
* @returns The retry count.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolvePluginEnableRetryCount(options: null | ObsidianTransportOptions): number;
|
|
51
|
+
/**
|
|
52
|
+
* Resolves the base backoff delay between plugin-enable attempts, applying the
|
|
53
|
+
* default when the option is omitted. See {@link resolvePluginEnableRetryCount}
|
|
54
|
+
* for the transport handling.
|
|
55
|
+
*
|
|
56
|
+
* @param options - The resolved transport options.
|
|
57
|
+
* @returns The base delay in milliseconds.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolvePluginEnableRetryDelayInMilliseconds(options: null | ObsidianTransportOptions): number;
|
|
60
|
+
/**
|
|
61
|
+
* Decides whether a failed plugin-enable is a retryable cold-boot race.
|
|
62
|
+
*
|
|
63
|
+
* Retry only the transient swallow signature — the plugin is in the enabled set
|
|
64
|
+
* but not loaded and no cause was captured (neither the `loadPlugin`
|
|
65
|
+
* monkey-patch nor the renderer console surfaced an error). A captured error is
|
|
66
|
+
* a deterministic bug that retrying cannot fix, so it is not retryable.
|
|
67
|
+
*
|
|
68
|
+
* @param result - The enable result from a single attempt.
|
|
69
|
+
* @returns `true` when the enable should be retried.
|
|
70
|
+
*/
|
|
71
|
+
export declare function shouldRetryPluginEnable(result: EnablePluginResult): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const DEFAULT_PLUGIN_ENABLE_RETRY_COUNT = 3;
|
|
2
|
+
const DEFAULT_PLUGIN_ENABLE_RETRY_DELAY_IN_MILLISECONDS = 2e3;
|
|
3
|
+
const EXPONENTIAL_BACKOFF_BASE = 2;
|
|
4
|
+
function computeBackoffDelayInMilliseconds(baseDelayInMilliseconds, attemptIndex) {
|
|
5
|
+
return baseDelayInMilliseconds * EXPONENTIAL_BACKOFF_BASE ** attemptIndex;
|
|
6
|
+
}
|
|
7
|
+
function resolvePluginEnableRetryCount(options) {
|
|
8
|
+
return options?.type === "obsidian-android-appium" ? options.pluginEnableRetryCount ?? DEFAULT_PLUGIN_ENABLE_RETRY_COUNT : DEFAULT_PLUGIN_ENABLE_RETRY_COUNT;
|
|
9
|
+
}
|
|
10
|
+
function resolvePluginEnableRetryDelayInMilliseconds(options) {
|
|
11
|
+
return options?.type === "obsidian-android-appium" ? options.pluginEnableRetryDelayInMilliseconds ?? DEFAULT_PLUGIN_ENABLE_RETRY_DELAY_IN_MILLISECONDS : DEFAULT_PLUGIN_ENABLE_RETRY_DELAY_IN_MILLISECONDS;
|
|
12
|
+
}
|
|
13
|
+
function shouldRetryPluginEnable(result) {
|
|
14
|
+
return !result.isLoaded && !result.errorMessage && !result.rendererConsoleErrors;
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
DEFAULT_PLUGIN_ENABLE_RETRY_COUNT,
|
|
18
|
+
DEFAULT_PLUGIN_ENABLE_RETRY_DELAY_IN_MILLISECONDS,
|
|
19
|
+
computeBackoffDelayInMilliseconds,
|
|
20
|
+
resolvePluginEnableRetryCount,
|
|
21
|
+
resolvePluginEnableRetryDelayInMilliseconds,
|
|
22
|
+
shouldRetryPluginEnable
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BsdWdpbi1lbmFibGUtcmV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIHJldHJ5aW5nIHRoZSBwbHVnaW4tZW5hYmxlIHN0ZXAsIHBsdXMgcmVzb2x2aW5nIHRoZSByZXRyeVxuICoga25vYnMgZnJvbSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seVxuICogYGdsb2JhbC1zZXR1cC1jb3JlYCBvcmNoZXN0cmF0aW9uIHNvIHRoZSBkZWNpc2lvbiBsb2dpYyBhbmQgZGVmYXVsdFxuICogcmVzb2x1dGlvbiBzdGF5IHVuaXQtdGVzdGFibGUgKHRoZSBvcmNoZXN0cmF0aW9uIGl0c2VsZiBuZWVkcyBhIHJlYWxcbiAqIHRyYW5zcG9ydCBhbmQgaXMgZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKS5cbiAqXG4gKiBXaGVuIHRoZSBoYXJuZXNzIGF1dG8tc3RhcnRzIGFuIEFuZHJvaWQgZW11bGF0b3IgKGNvbGQgYm9vdCkgYW5kIGltbWVkaWF0ZWx5XG4gKiBzeW5jcyB0aGUgdmF1bHQgYW5kIGVuYWJsZXMgdGhlIHBsdWdpbiwgdGhlIHBsdWdpbiBjYW4gbGFuZCBpbiB0aGUgZW5hYmxlZCBzZXRcbiAqIGJ1dCBmYWlsIHRvIGxvYWQgXHUyMDE0IHRoZSBmcmVzaGx5IGJvb3RlZCBndWVzdCdzIHBsdWdpbiBzdWJzeXN0ZW0gaXNuJ3Qgc2V0dGxlZFxuICogYW5kIHRoZSBzaW5nbGUtc2hvdCBlbmFibGUgcmFjZXMgaXQuIERldmljZS1pZGxlIGFuZCBgbGF5b3V0UmVhZHlgIGFyZSBhbHJlYWR5XG4gKiBnYXRlZCB1cHN0cmVhbSwgc28gdGhlIHJlc2lkdWFsIGdhcCBpcyBuYXJyb3c7IHJldHJ5aW5nIHRoZSBlbmFibGUgYSBmZXcgdGltZXNcbiAqIHdpdGggYmFja29mZiByZWNvdmVycyB0aGUgdHJhbnNpZW50IHJhY2Ugd2hpbGUgc3RpbGwgZmFpbGluZyBmYXN0IG9uIGEgZ2VudWluZVxuICogcGx1Z2luIGJ1ZyAoYSBjYXB0dXJlZCBsb2FkIGVycm9yLCB3aGljaCByZXRyeWluZyBjYW5ub3QgZml4KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEVuYWJsZVBsdWdpblJlc3VsdCB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBmb3Ige0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMucGx1Z2luRW5hYmxlUmV0cnlDb3VudH0uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BMVUdJTl9FTkFCTEVfUkVUUllfQ09VTlQgPSAzO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLnBsdWdpbkVuYWJsZVJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BMVUdJTl9FTkFCTEVfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcblxuLyoqXG4gKiBUaGUgcGVyLXJldHJ5IG11bHRpcGxpZXIgZm9yIHRoZSBleHBvbmVudGlhbCBiYWNrb2ZmOiBlYWNoIHJldHJ5IHdhaXRzIHR3aWNlIGFzXG4gKiBsb25nIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKi9cbmNvbnN0IEVYUE9ORU5USUFMX0JBQ0tPRkZfQkFTRSA9IDI7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGV4cG9uZW50aWFsIGJhY2tvZmYgZGVsYXkgZm9yIGEgZ2l2ZW4gcmV0cnksIGZyb20gYSBiYXNlIGRlbGF5LlxuICpcbiAqIGBhdHRlbXB0SW5kZXhgIGlzIDAtYmFzZWQ6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGUgYmFzZSBkZWxheSwgdGhlIHNlY29uZFxuICogdHdpY2UgdGhhdCwgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbi5cbiAqXG4gKiBAcGFyYW0gYmFzZURlbGF5SW5NaWxsaXNlY29uZHMgLSBUaGUgYmFzZSBkZWxheS5cbiAqIEBwYXJhbSBhdHRlbXB0SW5kZXggLSBUaGUgMC1iYXNlZCByZXRyeSBpbmRleC5cbiAqIEByZXR1cm5zIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoaXMgcmV0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHM6IG51bWJlciwgYXR0ZW1wdEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gYmFzZURlbGF5SW5NaWxsaXNlY29uZHMgKiAoRVhQT05FTlRJQUxfQkFDS09GRl9CQVNFICoqIGF0dGVtcHRJbmRleCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIG51bWJlciBvZiBleHRyYSBwbHVnaW4tZW5hYmxlIGF0dGVtcHRzLCBhcHBseWluZyB0aGUgZGVmYXVsdCB3aGVuXG4gKiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuIE9ubHkgdGhlIEFuZHJvaWQgdHJhbnNwb3J0IGNhcnJpZXMgdGhlIGtub2I7IGV2ZXJ5XG4gKiBvdGhlciB0cmFuc3BvcnQgKGFuZCBgdW5kZWZpbmVkYCkgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBcdTIwMTQgaGFybWxlc3MgdGhlcmUsXG4gKiBzaW5jZSBhIHBsdWdpbiB0aGF0IGxvYWRzIG9uIHRoZSBmaXJzdCB0cnkgbmV2ZXIgZW50ZXJzIHRoZSByZXRyeSBwYXRoLlxuICpcbiAqIEEgdmFsdWUgb2YgYDBgIGRpc2FibGVzIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSByZXRyeSBjb3VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KG9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBudW1iZXIge1xuICByZXR1cm4gb3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJ1xuICAgID8gKG9wdGlvbnMucGx1Z2luRW5hYmxlUmV0cnlDb3VudCA/PyBERUZBVUxUX1BMVUdJTl9FTkFCTEVfUkVUUllfQ09VTlQpXG4gICAgOiBERUZBVUxUX1BMVUdJTl9FTkFCTEVfUkVUUllfQ09VTlQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGJhc2UgYmFja29mZiBkZWxheSBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMsIGFwcGx5aW5nIHRoZVxuICogZGVmYXVsdCB3aGVuIHRoZSBvcHRpb24gaXMgb21pdHRlZC4gU2VlIHtAbGluayByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlDb3VudH1cbiAqIGZvciB0aGUgdHJhbnNwb3J0IGhhbmRsaW5nLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGJhc2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyhvcHRpb25zOiBudWxsIHwgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSdcbiAgICA/IChvcHRpb25zLnBsdWdpbkVuYWJsZVJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1BMVUdJTl9FTkFCTEVfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKVxuICAgIDogREVGQVVMVF9QTFVHSU5fRU5BQkxFX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgYSBmYWlsZWQgcGx1Z2luLWVuYWJsZSBpcyBhIHJldHJ5YWJsZSBjb2xkLWJvb3QgcmFjZS5cbiAqXG4gKiBSZXRyeSBvbmx5IHRoZSB0cmFuc2llbnQgc3dhbGxvdyBzaWduYXR1cmUgXHUyMDE0IHRoZSBwbHVnaW4gaXMgaW4gdGhlIGVuYWJsZWQgc2V0XG4gKiBidXQgbm90IGxvYWRlZCBhbmQgbm8gY2F1c2Ugd2FzIGNhcHR1cmVkIChuZWl0aGVyIHRoZSBgbG9hZFBsdWdpbmBcbiAqIG1vbmtleS1wYXRjaCBub3IgdGhlIHJlbmRlcmVyIGNvbnNvbGUgc3VyZmFjZWQgYW4gZXJyb3IpLiBBIGNhcHR1cmVkIGVycm9yIGlzXG4gKiBhIGRldGVybWluaXN0aWMgYnVnIHRoYXQgcmV0cnlpbmcgY2Fubm90IGZpeCwgc28gaXQgaXMgbm90IHJldHJ5YWJsZS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIGVuYWJsZSByZXN1bHQgZnJvbSBhIHNpbmdsZSBhdHRlbXB0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVuYWJsZSBzaG91bGQgYmUgcmV0cmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdDogRW5hYmxlUGx1Z2luUmVzdWx0KTogYm9vbGVhbiB7XG4gIHJldHVybiAhcmVzdWx0LmlzTG9hZGVkICYmICFyZXN1bHQuZXJyb3JNZXNzYWdlICYmICFyZXN1bHQucmVuZGVyZXJDb25zb2xlRXJyb3JzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBd0JPLE1BQU0sb0NBQW9DO0FBSzFDLE1BQU0sb0RBQW9EO0FBTWpFLE1BQU0sMkJBQTJCO0FBWTFCLFNBQVMsa0NBQWtDLHlCQUFpQyxjQUE4QjtBQUMvRyxTQUFPLDBCQUEyQiw0QkFBNEI7QUFDaEU7QUFhTyxTQUFTLDhCQUE4QixTQUFrRDtBQUM5RixTQUFPLFNBQVMsU0FBUyw0QkFDcEIsUUFBUSwwQkFBMEIsb0NBQ25DO0FBQ047QUFVTyxTQUFTLDRDQUE0QyxTQUFrRDtBQUM1RyxTQUFPLFNBQVMsU0FBUyw0QkFDcEIsUUFBUSx3Q0FBd0Msb0RBQ2pEO0FBQ047QUFhTyxTQUFTLHdCQUF3QixRQUFxQztBQUMzRSxTQUFPLENBQUMsT0FBTyxZQUFZLENBQUMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPO0FBQzdEOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Node-side "kick off, then poll" helper over {@link evalInObsidian}.
|
|
5
|
+
*
|
|
6
|
+
* A single `evalInObsidian` closure cannot run longer than CDP's ~30s
|
|
7
|
+
* `Runtime.evaluate` cap, so a long-running in-Obsidian operation (e.g. a whole
|
|
8
|
+
* plugin/vault bootstrap) cannot be awaited inside one closure. This helper does
|
|
9
|
+
* it from Node instead: it optionally runs a short `start` closure once to kick
|
|
10
|
+
* the work off, then repeatedly runs a short `poll` closure — each a separate,
|
|
11
|
+
* well-under-30s eval — until the Node-side `until` predicate accepts a poll
|
|
12
|
+
* result, or a Node-side timeout elapses. It removes the per-test hand-rolled
|
|
13
|
+
* `evalInObsidian` + `sleep` loop.
|
|
14
|
+
*
|
|
15
|
+
* The timing loop lives in the pure, unit-tested {@link pollUntil}; this module is
|
|
16
|
+
* the integration-only wiring (it drives a live Obsidian), covered by an
|
|
17
|
+
* integration test.
|
|
18
|
+
*/
|
|
19
|
+
import type { Promisable } from 'type-fest';
|
|
20
|
+
import type { ContextArgs } from './context-id.mjs';
|
|
21
|
+
import type { CommonArgs, GenericObject } from './eval-in-obsidian.mjs';
|
|
22
|
+
import type { ObsidianTransport } from './transport.mjs';
|
|
23
|
+
import { ContextId } from './context-id.mjs';
|
|
24
|
+
/**
|
|
25
|
+
* Parameters for {@link pollInObsidian}. Mirrors {@link EvalInObsidianParams} for
|
|
26
|
+
* the shared forwarded fields (`args` / `contextId` / `transport` / `vaultPath`);
|
|
27
|
+
* `start` / `poll` are the in-Obsidian closures and `until` is the Node-side
|
|
28
|
+
* acceptance predicate.
|
|
29
|
+
*/
|
|
30
|
+
export interface PollInObsidianParams<Args extends GenericObject, PollResult, TContextId extends ContextId<unknown> | undefined = undefined> {
|
|
31
|
+
/**
|
|
32
|
+
* Additional arguments passed to both `start` and `poll` (serialized like
|
|
33
|
+
* {@link EvalInObsidianParams.args}).
|
|
34
|
+
*/
|
|
35
|
+
readonly args?: Args;
|
|
36
|
+
/**
|
|
37
|
+
* A {@link ContextId} shared by `start` and `poll`, so `start` can stash
|
|
38
|
+
* non-serializable state that `poll` later reads. When omitted, each closure
|
|
39
|
+
* gets a fresh empty `context`.
|
|
40
|
+
*/
|
|
41
|
+
readonly contextId?: TContextId;
|
|
42
|
+
/**
|
|
43
|
+
* Delay between `poll` attempts, in milliseconds.
|
|
44
|
+
*
|
|
45
|
+
* @default `500`
|
|
46
|
+
*/
|
|
47
|
+
readonly intervalInMilliseconds?: number;
|
|
48
|
+
/**
|
|
49
|
+
* The closure polled repeatedly inside Obsidian. Keep it short (well under the
|
|
50
|
+
* ~30s CDP cap): it should read and return a JSON-serializable status, not
|
|
51
|
+
* await the long operation itself.
|
|
52
|
+
*/
|
|
53
|
+
poll(this: void, args: Args & CommonArgs & ContextArgs<TContextId>): Promisable<PollResult>;
|
|
54
|
+
/**
|
|
55
|
+
* An optional closure run **once** before polling begins, to kick off the
|
|
56
|
+
* long-running work (fire-and-forget from Node's perspective). Keep it short —
|
|
57
|
+
* start the work and return; do not await it to completion here.
|
|
58
|
+
*/
|
|
59
|
+
start?(this: void, args: Args & CommonArgs & ContextArgs<TContextId>): Promisable<unknown>;
|
|
60
|
+
/**
|
|
61
|
+
* Total budget before the poll rejects, in milliseconds.
|
|
62
|
+
*
|
|
63
|
+
* @default `120000`
|
|
64
|
+
*/
|
|
65
|
+
readonly timeoutInMilliseconds?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Optional detail appended to the timeout error message.
|
|
68
|
+
*/
|
|
69
|
+
readonly timeoutMessage?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Override the transport (forwarded to every underlying `evalInObsidian`).
|
|
72
|
+
*/
|
|
73
|
+
readonly transport?: ObsidianTransport;
|
|
74
|
+
/**
|
|
75
|
+
* Whether a given `poll` result is acceptable, evaluated in **Node**. Returning
|
|
76
|
+
* `true` resolves {@link pollInObsidian} with that result.
|
|
77
|
+
*/
|
|
78
|
+
until(this: void, result: PollResult): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* The vault path to evaluate against (forwarded to every underlying
|
|
81
|
+
* `evalInObsidian`).
|
|
82
|
+
*/
|
|
83
|
+
readonly vaultPath?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Kicks off an optional `start` closure once, then polls `poll` from Node until
|
|
87
|
+
* `until` accepts a result or the timeout elapses.
|
|
88
|
+
*
|
|
89
|
+
* @param params - The poll parameters.
|
|
90
|
+
* @returns A {@link Promise} that resolves with the first accepted `poll` result.
|
|
91
|
+
*/
|
|
92
|
+
export declare function pollInObsidian<Args extends GenericObject, PollResult, TContextId extends ContextId<unknown> | undefined = undefined>(params: PollInObsidianParams<Args, PollResult, TContextId>): Promise<PollResult>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
2
|
+
import { ContextId } from "./context-id.mjs";
|
|
3
|
+
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
4
|
+
import { pollUntil } from "./poll-until.mjs";
|
|
5
|
+
const DEFAULT_POLL_INTERVAL_IN_MILLISECONDS = 500;
|
|
6
|
+
const DEFAULT_POLL_TIMEOUT_IN_MILLISECONDS = 12e4;
|
|
7
|
+
async function pollInObsidian(params) {
|
|
8
|
+
const {
|
|
9
|
+
args,
|
|
10
|
+
contextId,
|
|
11
|
+
intervalInMilliseconds = DEFAULT_POLL_INTERVAL_IN_MILLISECONDS,
|
|
12
|
+
poll,
|
|
13
|
+
start,
|
|
14
|
+
timeoutInMilliseconds = DEFAULT_POLL_TIMEOUT_IN_MILLISECONDS,
|
|
15
|
+
timeoutMessage,
|
|
16
|
+
transport,
|
|
17
|
+
until,
|
|
18
|
+
vaultPath
|
|
19
|
+
} = params;
|
|
20
|
+
async function runEval(fn) {
|
|
21
|
+
const evalParams = {
|
|
22
|
+
fn,
|
|
23
|
+
...args !== void 0 && { args },
|
|
24
|
+
...contextId !== void 0 && { contextId },
|
|
25
|
+
...transport !== void 0 && { transport },
|
|
26
|
+
...vaultPath !== void 0 && { vaultPath }
|
|
27
|
+
};
|
|
28
|
+
return evalInObsidian(evalParams);
|
|
29
|
+
}
|
|
30
|
+
if (start) {
|
|
31
|
+
await runEval(start);
|
|
32
|
+
}
|
|
33
|
+
return pollUntil({
|
|
34
|
+
attempt: async () => runEval(poll),
|
|
35
|
+
intervalInMilliseconds,
|
|
36
|
+
nowInMilliseconds: () => Date.now(),
|
|
37
|
+
sleep: async (milliseconds) => {
|
|
38
|
+
await sleep(milliseconds);
|
|
39
|
+
},
|
|
40
|
+
timeoutInMilliseconds,
|
|
41
|
+
until,
|
|
42
|
+
...timeoutMessage !== void 0 && { timeoutMessage }
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
pollInObsidian
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BvbGwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBOb2RlLXNpZGUgXCJraWNrIG9mZiwgdGhlbiBwb2xsXCIgaGVscGVyIG92ZXIge0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqXG4gKiBBIHNpbmdsZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUgY2Fubm90IHJ1biBsb25nZXIgdGhhbiBDRFAncyB+MzBzXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAgY2FwLCBzbyBhIGxvbmctcnVubmluZyBpbi1PYnNpZGlhbiBvcGVyYXRpb24gKGUuZy4gYSB3aG9sZVxuICogcGx1Z2luL3ZhdWx0IGJvb3RzdHJhcCkgY2Fubm90IGJlIGF3YWl0ZWQgaW5zaWRlIG9uZSBjbG9zdXJlLiBUaGlzIGhlbHBlciBkb2VzXG4gKiBpdCBmcm9tIE5vZGUgaW5zdGVhZDogaXQgb3B0aW9uYWxseSBydW5zIGEgc2hvcnQgYHN0YXJ0YCBjbG9zdXJlIG9uY2UgdG8ga2lja1xuICogdGhlIHdvcmsgb2ZmLCB0aGVuIHJlcGVhdGVkbHkgcnVucyBhIHNob3J0IGBwb2xsYCBjbG9zdXJlIFx1MjAxNCBlYWNoIGEgc2VwYXJhdGUsXG4gKiB3ZWxsLXVuZGVyLTMwcyBldmFsIFx1MjAxNCB1bnRpbCB0aGUgTm9kZS1zaWRlIGB1bnRpbGAgcHJlZGljYXRlIGFjY2VwdHMgYSBwb2xsXG4gKiByZXN1bHQsIG9yIGEgTm9kZS1zaWRlIHRpbWVvdXQgZWxhcHNlcy4gSXQgcmVtb3ZlcyB0aGUgcGVyLXRlc3QgaGFuZC1yb2xsZWRcbiAqIGBldmFsSW5PYnNpZGlhbmAgKyBgc2xlZXBgIGxvb3AuXG4gKlxuICogVGhlIHRpbWluZyBsb29wIGxpdmVzIGluIHRoZSBwdXJlLCB1bml0LXRlc3RlZCB7QGxpbmsgcG9sbFVudGlsfTsgdGhpcyBtb2R1bGUgaXNcbiAqIHRoZSBpbnRlZ3JhdGlvbi1vbmx5IHdpcmluZyAoaXQgZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiksIGNvdmVyZWQgYnkgYW5cbiAqIGludGVncmF0aW9uIHRlc3QuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiB2aWEgZXZhbEluT2JzaWRpYW4pIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbnRleHRBcmdzIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIENvbW1vbkFyZ3MsXG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBHZW5lcmljT2JqZWN0XG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IHBvbGxVbnRpbCB9IGZyb20gJy4vcG9sbC11bnRpbC5tanMnO1xuXG5jb25zdCBERUZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgREVGQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTIwXzAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcG9sbEluT2JzaWRpYW59LiBNaXJyb3JzIHtAbGluayBFdmFsSW5PYnNpZGlhblBhcmFtc30gZm9yXG4gKiB0aGUgc2hhcmVkIGZvcndhcmRlZCBmaWVsZHMgKGBhcmdzYCAvIGBjb250ZXh0SWRgIC8gYHRyYW5zcG9ydGAgLyBgdmF1bHRQYXRoYCk7XG4gKiBgc3RhcnRgIC8gYHBvbGxgIGFyZSB0aGUgaW4tT2JzaWRpYW4gY2xvc3VyZXMgYW5kIGB1bnRpbGAgaXMgdGhlIE5vZGUtc2lkZVxuICogYWNjZXB0YW5jZSBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9sbEluT2JzaWRpYW5QYXJhbXM8QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFBvbGxSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+IHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHBhc3NlZCB0byBib3RoIGBzdGFydGAgYW5kIGBwb2xsYCAoc2VyaWFsaXplZCBsaWtlXG4gICAqIHtAbGluayBFdmFsSW5PYnNpZGlhblBhcmFtcy5hcmdzfSkuXG4gICAqL1xuICByZWFkb25seSBhcmdzPzogQXJncztcblxuICAvKipcbiAgICogQSB7QGxpbmsgQ29udGV4dElkfSBzaGFyZWQgYnkgYHN0YXJ0YCBhbmQgYHBvbGxgLCBzbyBgc3RhcnRgIGNhbiBzdGFzaFxuICAgKiBub24tc2VyaWFsaXphYmxlIHN0YXRlIHRoYXQgYHBvbGxgIGxhdGVyIHJlYWRzLiBXaGVuIG9taXR0ZWQsIGVhY2ggY2xvc3VyZVxuICAgKiBnZXRzIGEgZnJlc2ggZW1wdHkgYGNvbnRleHRgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dElkPzogVENvbnRleHRJZDtcblxuICAvKipcbiAgICogRGVsYXkgYmV0d2VlbiBgcG9sbGAgYXR0ZW1wdHMsIGluIG1pbGxpc2Vjb25kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMGBcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjbG9zdXJlIHBvbGxlZCByZXBlYXRlZGx5IGluc2lkZSBPYnNpZGlhbi4gS2VlcCBpdCBzaG9ydCAod2VsbCB1bmRlciB0aGVcbiAgICogfjMwcyBDRFAgY2FwKTogaXQgc2hvdWxkIHJlYWQgYW5kIHJldHVybiBhIEpTT04tc2VyaWFsaXphYmxlIHN0YXR1cywgbm90XG4gICAqIGF3YWl0IHRoZSBsb25nIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAqL1xuICBwb2xsKHRoaXM6IHZvaWQsIGFyZ3M6IEFyZ3MgJiBDb21tb25BcmdzICYgQ29udGV4dEFyZ3M8VENvbnRleHRJZD4pOiBQcm9taXNhYmxlPFBvbGxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBjbG9zdXJlIHJ1biAqKm9uY2UqKiBiZWZvcmUgcG9sbGluZyBiZWdpbnMsIHRvIGtpY2sgb2ZmIHRoZVxuICAgKiBsb25nLXJ1bm5pbmcgd29yayAoZmlyZS1hbmQtZm9yZ2V0IGZyb20gTm9kZSdzIHBlcnNwZWN0aXZlKS4gS2VlcCBpdCBzaG9ydCBcdTIwMTRcbiAgICogc3RhcnQgdGhlIHdvcmsgYW5kIHJldHVybjsgZG8gbm90IGF3YWl0IGl0IHRvIGNvbXBsZXRpb24gaGVyZS5cbiAgICovXG4gIHN0YXJ0Pyh0aGlzOiB2b2lkLCBhcmdzOiBBcmdzICYgQ29tbW9uQXJncyAmIENvbnRleHRBcmdzPFRDb250ZXh0SWQ+KTogUHJvbWlzYWJsZTx1bmtub3duPjtcblxuICAvKipcbiAgICogVG90YWwgYnVkZ2V0IGJlZm9yZSB0aGUgcG9sbCByZWplY3RzLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMjAwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRldGFpbCBhcHBlbmRlZCB0byB0aGUgdGltZW91dCBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dE1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQgKGZvcndhcmRlZCB0byBldmVyeSB1bmRlcmx5aW5nIGBldmFsSW5PYnNpZGlhbmApLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBnaXZlbiBgcG9sbGAgcmVzdWx0IGlzIGFjY2VwdGFibGUsIGV2YWx1YXRlZCBpbiAqKk5vZGUqKi4gUmV0dXJuaW5nXG4gICAqIGB0cnVlYCByZXNvbHZlcyB7QGxpbmsgcG9sbEluT2JzaWRpYW59IHdpdGggdGhhdCByZXN1bHQuXG4gICAqL1xuICB1bnRpbCh0aGlzOiB2b2lkLCByZXN1bHQ6IFBvbGxSZXN1bHQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBhZ2FpbnN0IChmb3J3YXJkZWQgdG8gZXZlcnkgdW5kZXJseWluZ1xuICAgKiBgZXZhbEluT2JzaWRpYW5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBLaWNrcyBvZmYgYW4gb3B0aW9uYWwgYHN0YXJ0YCBjbG9zdXJlIG9uY2UsIHRoZW4gcG9sbHMgYHBvbGxgIGZyb20gTm9kZSB1bnRpbFxuICogYHVudGlsYCBhY2NlcHRzIGEgcmVzdWx0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwb2xsIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGZpcnN0IGFjY2VwdGVkIGBwb2xsYCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsSW5PYnNpZGlhbjxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUG9sbFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIHBhcmFtczogUG9sbEluT2JzaWRpYW5QYXJhbXM8QXJncywgUG9sbFJlc3VsdCwgVENvbnRleHRJZD5cbik6IFByb21pc2U8UG9sbFJlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgYXJncyxcbiAgICBjb250ZXh0SWQsXG4gICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyA9IERFRkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgcG9sbCxcbiAgICBzdGFydCxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgdGltZW91dE1lc3NhZ2UsXG4gICAgdHJhbnNwb3J0LFxuICAgIHVudGlsLFxuICAgIHZhdWx0UGF0aFxuICB9ID0gcGFyYW1zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bkV2YWw8UmVzdWx0PihmbjogKGZuQXJnczogQXJncyAmIENvbW1vbkFyZ3MgJiBDb250ZXh0QXJnczxUQ29udGV4dElkPikgPT4gUHJvbWlzYWJsZTxSZXN1bHQ+KTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgICBjb25zdCBldmFsUGFyYW1zOiBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+ID0ge1xuICAgICAgZm4sXG4gICAgICAuLi4oYXJncyAhPT0gdW5kZWZpbmVkICYmIHsgYXJncyB9KSxcbiAgICAgIC4uLihjb250ZXh0SWQgIT09IHVuZGVmaW5lZCAmJiB7IGNvbnRleHRJZCB9KSxcbiAgICAgIC4uLih0cmFuc3BvcnQgIT09IHVuZGVmaW5lZCAmJiB7IHRyYW5zcG9ydCB9KSxcbiAgICAgIC4uLih2YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aCB9KVxuICAgIH07XG4gICAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuPEFyZ3MsIFJlc3VsdCwgVENvbnRleHRJZD4oZXZhbFBhcmFtcyk7XG4gIH1cblxuICBpZiAoc3RhcnQpIHtcbiAgICBhd2FpdCBydW5FdmFsKHN0YXJ0KTtcbiAgfVxuXG4gIHJldHVybiBwb2xsVW50aWw8UG9sbFJlc3VsdD4oe1xuICAgIGF0dGVtcHQ6IGFzeW5jICgpID0+IHJ1bkV2YWwocG9sbCksXG4gICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICBub3dJbk1pbGxpc2Vjb25kczogKCkgPT4gRGF0ZS5ub3coKSxcbiAgICBzbGVlcDogYXN5bmMgKG1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiB7XG4gICAgICBhd2FpdCBzbGVlcChtaWxsaXNlY29uZHMpO1xuICAgIH0sXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIHVudGlsLFxuICAgIC4uLih0aW1lb3V0TWVzc2FnZSAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dE1lc3NhZ2UgfSlcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUF1QkEsU0FBUyxjQUFjLGFBQWE7QUFVcEMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxpQkFBaUI7QUFFMUIsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSx1Q0FBdUM7QUFnRjdDLGVBQXNCLGVBQ3BCLFFBQ3FCO0FBQ3JCLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0EseUJBQXlCO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQSx3QkFBd0I7QUFBQSxJQUN4QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLGlCQUFlLFFBQWdCLElBQWtHO0FBQy9ILFVBQU0sYUFBNkQ7QUFBQSxNQUNqRTtBQUFBLE1BQ0EsR0FBSSxTQUFTLFVBQWEsRUFBRSxLQUFLO0FBQUEsTUFDakMsR0FBSSxjQUFjLFVBQWEsRUFBRSxVQUFVO0FBQUEsTUFDM0MsR0FBSSxjQUFjLFVBQWEsRUFBRSxVQUFVO0FBQUEsTUFDM0MsR0FBSSxjQUFjLFVBQWEsRUFBRSxVQUFVO0FBQUEsSUFDN0M7QUFDQSxXQUFPLGVBQXlDLFVBQVU7QUFBQSxFQUM1RDtBQUVBLE1BQUksT0FBTztBQUNULFVBQU0sUUFBUSxLQUFLO0FBQUEsRUFDckI7QUFFQSxTQUFPLFVBQXNCO0FBQUEsSUFDM0IsU0FBUyxZQUFZLFFBQVEsSUFBSTtBQUFBLElBQ2pDO0FBQUEsSUFDQSxtQkFBbUIsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUNsQyxPQUFPLE9BQU8saUJBQXlCO0FBQ3JDLFlBQU0sTUFBTSxZQUFZO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxtQkFBbUIsVUFBYSxFQUFFLGVBQWU7QUFBQSxFQUN2RCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure poll-until-satisfied loop: repeatedly runs an async `attempt`, returning
|
|
5
|
+
* its result once `until` accepts it, or throwing when a timeout elapses.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from the integration-only {@link pollInObsidian} wrapper (which binds
|
|
8
|
+
* `attempt` to an `evalInObsidian` call and is excluded from unit tests) so the
|
|
9
|
+
* timing/timeout logic stays unit-testable. The clock and sleep are injected so
|
|
10
|
+
* the loop is deterministic under test.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Parameters for {@link pollUntil}.
|
|
14
|
+
*/
|
|
15
|
+
export interface PollUntilParams<Result> {
|
|
16
|
+
/** Runs one attempt and resolves with its result. */
|
|
17
|
+
attempt(this: void): Promise<Result>;
|
|
18
|
+
/** Delay between attempts, in milliseconds. */
|
|
19
|
+
readonly intervalInMilliseconds: number;
|
|
20
|
+
/** Returns the current time in milliseconds (injected for deterministic tests). */
|
|
21
|
+
nowInMilliseconds(this: void): number;
|
|
22
|
+
/** Sleeps for the given number of milliseconds (injected for deterministic tests). */
|
|
23
|
+
sleep(this: void, milliseconds: number): Promise<void>;
|
|
24
|
+
/** Total budget before the poll rejects, in milliseconds. */
|
|
25
|
+
readonly timeoutInMilliseconds: number;
|
|
26
|
+
/** Optional detail appended to the timeout error message. */
|
|
27
|
+
readonly timeoutMessage?: string;
|
|
28
|
+
/** Whether a given attempt result is acceptable (stops the poll). */
|
|
29
|
+
until(this: void, result: Result): boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Runs `attempt` immediately, then repeatedly every `intervalInMilliseconds`,
|
|
33
|
+
* until `until(result)` is truthy — resolving with that result — or the
|
|
34
|
+
* `timeoutInMilliseconds` budget elapses, at which point it rejects. At least one
|
|
35
|
+
* attempt always runs; the timeout is checked after each unsatisfied attempt, so
|
|
36
|
+
* a slow single attempt cannot be interrupted mid-flight but no further attempt
|
|
37
|
+
* starts past the deadline.
|
|
38
|
+
*
|
|
39
|
+
* @param params - The poll parameters.
|
|
40
|
+
* @returns A {@link Promise} that resolves with the first accepted attempt result.
|
|
41
|
+
*/
|
|
42
|
+
export declare function pollUntil<Result>(params: PollUntilParams<Result>): Promise<Result>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
async function pollUntil(params) {
|
|
2
|
+
const { attempt, intervalInMilliseconds, nowInMilliseconds, sleep, timeoutInMilliseconds, timeoutMessage, until } = params;
|
|
3
|
+
const deadline = nowInMilliseconds() + timeoutInMilliseconds;
|
|
4
|
+
while (true) {
|
|
5
|
+
const result = await attempt();
|
|
6
|
+
if (until(result)) {
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
if (nowInMilliseconds() >= deadline) {
|
|
10
|
+
const suffix = timeoutMessage === void 0 ? "" : `: ${timeoutMessage}`;
|
|
11
|
+
throw new Error(`pollInObsidian timed out after ${String(timeoutInMilliseconds)} milliseconds${suffix}`);
|
|
12
|
+
}
|
|
13
|
+
await sleep(intervalInMilliseconds);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
pollUntil
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BvbGwtdW50aWwudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIHBvbGwtdW50aWwtc2F0aXNmaWVkIGxvb3A6IHJlcGVhdGVkbHkgcnVucyBhbiBhc3luYyBgYXR0ZW1wdGAsIHJldHVybmluZ1xuICogaXRzIHJlc3VsdCBvbmNlIGB1bnRpbGAgYWNjZXB0cyBpdCwgb3IgdGhyb3dpbmcgd2hlbiBhIHRpbWVvdXQgZWxhcHNlcy5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSB7QGxpbmsgcG9sbEluT2JzaWRpYW59IHdyYXBwZXIgKHdoaWNoIGJpbmRzXG4gKiBgYXR0ZW1wdGAgdG8gYW4gYGV2YWxJbk9ic2lkaWFuYCBjYWxsIGFuZCBpcyBleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMpIHNvIHRoZVxuICogdGltaW5nL3RpbWVvdXQgbG9naWMgc3RheXMgdW5pdC10ZXN0YWJsZS4gVGhlIGNsb2NrIGFuZCBzbGVlcCBhcmUgaW5qZWN0ZWQgc29cbiAqIHRoZSBsb29wIGlzIGRldGVybWluaXN0aWMgdW5kZXIgdGVzdC5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBwb2xsVW50aWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGxVbnRpbFBhcmFtczxSZXN1bHQ+IHtcbiAgLyoqIFJ1bnMgb25lIGF0dGVtcHQgYW5kIHJlc29sdmVzIHdpdGggaXRzIHJlc3VsdC4gKi9cbiAgYXR0ZW1wdCh0aGlzOiB2b2lkKTogUHJvbWlzZTxSZXN1bHQ+O1xuXG4gIC8qKiBEZWxheSBiZXR3ZWVuIGF0dGVtcHRzLCBpbiBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IGludGVydmFsSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcyAoaW5qZWN0ZWQgZm9yIGRldGVybWluaXN0aWMgdGVzdHMpLiAqL1xuICBub3dJbk1pbGxpc2Vjb25kcyh0aGlzOiB2b2lkKTogbnVtYmVyO1xuXG4gIC8qKiBTbGVlcHMgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIChpbmplY3RlZCBmb3IgZGV0ZXJtaW5pc3RpYyB0ZXN0cykuICovXG4gIHNsZWVwKHRoaXM6IHZvaWQsIG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogVG90YWwgYnVkZ2V0IGJlZm9yZSB0aGUgcG9sbCByZWplY3RzLCBpbiBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBPcHRpb25hbCBkZXRhaWwgYXBwZW5kZWQgdG8gdGhlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZS4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqIFdoZXRoZXIgYSBnaXZlbiBhdHRlbXB0IHJlc3VsdCBpcyBhY2NlcHRhYmxlIChzdG9wcyB0aGUgcG9sbCkuICovXG4gIHVudGlsKHRoaXM6IHZvaWQsIHJlc3VsdDogUmVzdWx0KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIGBhdHRlbXB0YCBpbW1lZGlhdGVseSwgdGhlbiByZXBlYXRlZGx5IGV2ZXJ5IGBpbnRlcnZhbEluTWlsbGlzZWNvbmRzYCxcbiAqIHVudGlsIGB1bnRpbChyZXN1bHQpYCBpcyB0cnV0aHkgXHUyMDE0IHJlc29sdmluZyB3aXRoIHRoYXQgcmVzdWx0IFx1MjAxNCBvciB0aGVcbiAqIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgIGJ1ZGdldCBlbGFwc2VzLCBhdCB3aGljaCBwb2ludCBpdCByZWplY3RzLiBBdCBsZWFzdCBvbmVcbiAqIGF0dGVtcHQgYWx3YXlzIHJ1bnM7IHRoZSB0aW1lb3V0IGlzIGNoZWNrZWQgYWZ0ZXIgZWFjaCB1bnNhdGlzZmllZCBhdHRlbXB0LCBzb1xuICogYSBzbG93IHNpbmdsZSBhdHRlbXB0IGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCBtaWQtZmxpZ2h0IGJ1dCBubyBmdXJ0aGVyIGF0dGVtcHRcbiAqIHN0YXJ0cyBwYXN0IHRoZSBkZWFkbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBvbGwgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZmlyc3QgYWNjZXB0ZWQgYXR0ZW1wdCByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb2xsVW50aWw8UmVzdWx0PihwYXJhbXM6IFBvbGxVbnRpbFBhcmFtczxSZXN1bHQ+KTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgY29uc3QgeyBhdHRlbXB0LCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBub3dJbk1pbGxpc2Vjb25kcywgc2xlZXAsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcywgdGltZW91dE1lc3NhZ2UsIHVudGlsIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRlYWRsaW5lID0gbm93SW5NaWxsaXNlY29uZHMoKSArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIGV4aXRzIHZpYSByZXR1cm4gb3IgdGhyb3cuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXR0ZW1wdCgpO1xuICAgIGlmICh1bnRpbChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAobm93SW5NaWxsaXNlY29uZHMoKSA+PSBkZWFkbGluZSkge1xuICAgICAgY29uc3Qgc3VmZml4ID0gdGltZW91dE1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHt0aW1lb3V0TWVzc2FnZX1gO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwb2xsSW5PYnNpZGlhbiB0aW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzJHtzdWZmaXh9YCk7XG4gICAgfVxuICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFpREEsZUFBc0IsVUFBa0IsUUFBa0Q7QUFDeEYsUUFBTSxFQUFFLFNBQVMsd0JBQXdCLG1CQUFtQixPQUFPLHVCQUF1QixnQkFBZ0IsTUFBTSxJQUFJO0FBQ3BILFFBQU0sV0FBVyxrQkFBa0IsSUFBSTtBQUd2QyxTQUFPLE1BQU07QUFDWCxVQUFNLFNBQVMsTUFBTSxRQUFRO0FBQzdCLFFBQUksTUFBTSxNQUFNLEdBQUc7QUFDakIsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLGtCQUFrQixLQUFLLFVBQVU7QUFDbkMsWUFBTSxTQUFTLG1CQUFtQixTQUFZLEtBQUssS0FBSyxjQUFjO0FBQ3RFLFlBQU0sSUFBSSxNQUFNLGtDQUFrQyxPQUFPLHFCQUFxQixDQUFDLGdCQUFnQixNQUFNLEVBQUU7QUFBQSxJQUN6RztBQUNBLFVBQU0sTUFBTSxzQkFBc0I7QUFBQSxFQUNwQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
* This avoids the onboarding flow entirely.
|
|
39
39
|
*/
|
|
40
40
|
import type { Browser } from 'webdriverio';
|
|
41
|
-
import type { ObsidianTransport, TransportEvalOptions } from './transport.mjs';
|
|
41
|
+
import type { ConsoleCaptureHandle, ObsidianTransport, TransportEvalOptions } from './transport.mjs';
|
|
42
42
|
/**
|
|
43
43
|
* Session connection info returned by {@link AppiumTransport.getSessionInfo},
|
|
44
44
|
* used to reattach from another process.
|
|
@@ -142,6 +142,17 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
142
142
|
* @param config - Appium transport configuration.
|
|
143
143
|
*/
|
|
144
144
|
constructor(config: AppiumTransportConfig);
|
|
145
|
+
/**
|
|
146
|
+
* Begins a console capture by stamping the device log with a unique marker.
|
|
147
|
+
*
|
|
148
|
+
* Uses `adb shell log` to write a marker into `logcat` at capture start so a
|
|
149
|
+
* later {@link AppiumTransport.readConsoleCaptureSince} can slice out
|
|
150
|
+
* everything the WebView logged afterwards — without the invasive `logcat -c`
|
|
151
|
+
* buffer clear.
|
|
152
|
+
*
|
|
153
|
+
* @returns A handle carrying the unique marker.
|
|
154
|
+
*/
|
|
155
|
+
beginConsoleCapture(): Promise<ConsoleCaptureHandle>;
|
|
145
156
|
/**
|
|
146
157
|
* Ends the Appium session.
|
|
147
158
|
*
|
|
@@ -186,6 +197,18 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
186
197
|
* @param _files - Map of relative file paths to content buffers (unused — adb pushes the directory directly).
|
|
187
198
|
*/
|
|
188
199
|
pushFiles(vaultPath: string, _files: Record<string, Uint8Array>): Promise<void>;
|
|
200
|
+
/**
|
|
201
|
+
* Dumps `adb logcat` and returns the WebView console/error output logged
|
|
202
|
+
* since the marker from {@link AppiumTransport.beginConsoleCapture}.
|
|
203
|
+
*
|
|
204
|
+
* Filters to the Chromium/WebView tags that carry JS `console.*` output and
|
|
205
|
+
* uncaught errors, and caps the result length. Bounded, post-hoc,
|
|
206
|
+
* failure-path-only — never a live monitor.
|
|
207
|
+
*
|
|
208
|
+
* @param handle - The capture handle (or `undefined` when capture never started).
|
|
209
|
+
* @returns The captured console/error text, or `undefined` if nothing relevant was logged.
|
|
210
|
+
*/
|
|
211
|
+
readConsoleCaptureSince(handle: ConsoleCaptureHandle | undefined): Promise<string | undefined>;
|
|
189
212
|
/**
|
|
190
213
|
* Registers a vault on mobile by pushing files and configuring localStorage.
|
|
191
214
|
*
|