@mnaoumov/obsidian-lib 10.11.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/components/all-windows-status-bar-item-component/package.json +6 -0
- package/components/shared-component-pool-component/package.json +6 -0
- package/components/worker-component/package.json +6 -0
- package/components/worker-pool-component/package.json +6 -0
- package/components/workspace-layout-state-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +477 -285
- package/dist/lib/cjs/__merged.d.cts +26 -10
- package/dist/lib/cjs/anchored-suggest.cjs +1 -1
- package/dist/lib/cjs/app.cjs +2 -2
- package/dist/lib/cjs/async-with-notice.cjs +4 -4
- package/dist/lib/cjs/attachment-path.cjs +9 -9
- package/dist/lib/cjs/attachment-path.d.cts +3 -3
- package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
- package/dist/lib/cjs/backlink-index.cjs +5 -5
- package/dist/lib/cjs/backlink.cjs +7 -7
- package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
- package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
- package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
- package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
- package/dist/lib/cjs/bug-report.cjs +38 -12
- package/dist/lib/cjs/bug-report.d.cts +65 -0
- package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
- package/dist/lib/cjs/bulk-operation.cjs +2 -2
- package/dist/lib/cjs/callout.cjs +6 -6
- package/dist/lib/cjs/canvas.cjs +11 -9
- package/dist/lib/cjs/canvas.d.cts +13 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
- package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
- package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
- package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
- package/dist/lib/cjs/codemirror/index.cjs +7 -7
- package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
- package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
- package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
- package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
- package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
- package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
- package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
- package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
- package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/index.cjs +15 -15
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
- package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
- package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
- package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
- package/dist/lib/cjs/community-plugins.cjs +3 -3
- package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
- package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
- package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
- package/dist/lib/cjs/components/async-events-component.cjs +1 -1
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
- package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
- package/dist/lib/cjs/components/component-ex.cjs +21 -11
- package/dist/lib/cjs/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
- package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
- package/dist/lib/cjs/components/disposable-component.cjs +2 -2
- package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
- package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
- package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
- package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
- package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
- package/dist/lib/cjs/components/index.cjs +54 -39
- package/dist/lib/cjs/components/index.d.cts +5 -0
- package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
- package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
- package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
- package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
- package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
- package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
- package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
- package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
- package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
- package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
- package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
- package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
- package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
- package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
- package/dist/lib/cjs/components/registry-component.cjs +2 -2
- package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
- package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
- package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
- package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
- package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
- package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
- package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
- package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
- package/dist/lib/cjs/components/worker-component.cjs +363 -0
- package/dist/lib/cjs/components/worker-component.d.cts +156 -0
- package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
- package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
- package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
- package/dist/lib/cjs/constructors/index.cjs +1 -1
- package/dist/lib/cjs/css-class.cjs +5 -1
- package/dist/lib/cjs/css-class.d.cts +16 -0
- package/dist/lib/cjs/data-handler.cjs +264 -6
- package/dist/lib/cjs/data-handler.d.cts +219 -2
- package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
- package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
- package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
- package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
- package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
- package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
- package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
- package/dist/lib/cjs/data-stores/index.cjs +6 -6
- package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
- package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
- package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
- package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
- package/dist/lib/cjs/dataview-link.cjs +2 -2
- package/dist/lib/cjs/dataview.cjs +27 -7
- package/dist/lib/cjs/dataview.d.cts +14 -0
- package/dist/lib/cjs/debug.cjs +3 -3
- package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
- package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
- package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
- package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
- package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
- package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
- package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
- package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
- package/dist/lib/cjs/disposable.cjs +150 -0
- package/dist/lib/cjs/disposable.d.cts +39 -0
- package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
- package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
- package/dist/lib/cjs/editor-suggest.cjs +1 -1
- package/dist/lib/cjs/editor.cjs +6 -6
- package/dist/lib/cjs/events.cjs +2 -2
- package/dist/lib/cjs/extensions-registrar.cjs +1 -1
- package/dist/lib/cjs/feature-request.cjs +1 -1
- package/dist/lib/cjs/file-change.cjs +10 -10
- package/dist/lib/cjs/file-explorer.cjs +2 -2
- package/dist/lib/cjs/file-manager.cjs +5 -5
- package/dist/lib/cjs/file-system.cjs +10 -10
- package/dist/lib/cjs/folder-note.cjs +4 -4
- package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
- package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
- package/dist/lib/cjs/frontmatter.cjs +5 -5
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/git-rename-history.cjs +1 -1
- package/dist/lib/cjs/git-rename-history.d.cts +2 -2
- package/dist/lib/cjs/hotkey.cjs +1 -1
- package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
- package/dist/lib/cjs/html-element.cjs +2 -2
- package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
- package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
- package/dist/lib/cjs/i18n/i18n.cjs +7 -7
- package/dist/lib/cjs/i18n/index.cjs +4 -4
- package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
- package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
- package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
- package/dist/lib/cjs/index.cjs +147 -126
- package/dist/lib/cjs/index.d.cts +7 -0
- package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
- package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/library-styles.cjs +3 -3
- package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
- package/dist/lib/cjs/link.cjs +76 -56
- package/dist/lib/cjs/link.d.cts +20 -14
- package/dist/lib/cjs/logger.cjs +4 -4
- package/dist/lib/cjs/loop.cjs +10 -16
- package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
- package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
- package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
- package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
- package/dist/lib/cjs/markdown-view.cjs +191 -3
- package/dist/lib/cjs/markdown-view.d.cts +48 -1
- package/dist/lib/cjs/markdown.cjs +12 -12
- package/dist/lib/cjs/metadata-cache.cjs +23 -23
- package/dist/lib/cjs/metadata-cache.d.cts +5 -4
- package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
- package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
- package/dist/lib/cjs/mobile-app-info.cjs +1 -1
- package/dist/lib/cjs/modals/alert.cjs +4 -4
- package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
- package/dist/lib/cjs/modals/confirm.cjs +4 -4
- package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
- package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
- package/dist/lib/cjs/modals/index.cjs +17 -11
- package/dist/lib/cjs/modals/index.d.cts +2 -0
- package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
- package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
- package/dist/lib/cjs/modals/modal.cjs +3 -3
- package/dist/lib/cjs/modals/prompt.cjs +10 -10
- package/dist/lib/cjs/modals/prompt.d.cts +1 -1
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
- package/dist/lib/cjs/modals/select-item.cjs +6 -6
- package/dist/lib/cjs/modals/select-option.cjs +3 -3
- package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
- package/dist/lib/cjs/note-priority.cjs +2 -2
- package/dist/lib/cjs/notebook-navigator.cjs +12 -2
- package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
- package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
- package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
- package/dist/lib/cjs/obsidian-settings.cjs +1 -1
- package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
- package/dist/lib/cjs/parse-link.cjs +14 -14
- package/dist/lib/cjs/path-compatibility.cjs +368 -0
- package/dist/lib/cjs/path-compatibility.d.cts +263 -0
- package/dist/lib/cjs/path-settings.cjs +3 -3
- package/dist/lib/cjs/pdf.cjs +2 -2
- package/dist/lib/cjs/plugin/index.cjs +18 -12
- package/dist/lib/cjs/plugin/index.d.cts +2 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
- package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
- package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
- package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
- package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
- package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
- package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
- package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
- package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
- package/dist/lib/cjs/plugin/plugin.cjs +133 -34
- package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
- package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
- package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
- package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
- package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
- package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
- package/dist/lib/cjs/popovers/index.cjs +3 -3
- package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
- package/dist/lib/cjs/popovers/popover.cjs +5 -5
- package/dist/lib/cjs/queue.cjs +8 -8
- package/dist/lib/cjs/react/app-context.cjs +3 -3
- package/dist/lib/cjs/react/index.cjs +1 -1
- package/dist/lib/cjs/reference-definition.cjs +1 -1
- package/dist/lib/cjs/reference.cjs +3 -3
- package/dist/lib/cjs/release-asset.cjs +5 -5
- package/dist/lib/cjs/rendered-markdown.cjs +4 -4
- package/dist/lib/cjs/request-url.cjs +4 -4
- package/dist/lib/cjs/resource-lock.cjs +46 -42
- package/dist/lib/cjs/resource-lock.d.cts +8 -7
- package/dist/lib/cjs/resource-url.cjs +3 -3
- package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
- package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
- package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/index.cjs +30 -30
- package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
- package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
- package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
- package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
- package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
- package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
- package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
- package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
- package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
- package/dist/lib/cjs/setting-ex.cjs +26 -26
- package/dist/lib/cjs/setting-group-ex.cjs +2 -2
- package/dist/lib/cjs/settings-recovery.cjs +217 -0
- package/dist/lib/cjs/settings-recovery.d.cts +178 -0
- package/dist/lib/cjs/settings-tabs.cjs +5 -5
- package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
- package/dist/lib/cjs/templater.cjs +14 -4
- package/dist/lib/cjs/templater.d.cts +6 -0
- package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
- package/dist/lib/cjs/transformers/index.cjs +1 -1
- package/dist/lib/cjs/trusted-input.cjs +1 -1
- package/dist/lib/cjs/validation.cjs +4 -4
- package/dist/lib/cjs/vault-delete.cjs +6 -6
- package/dist/lib/cjs/vault-transaction.cjs +5 -5
- package/dist/lib/cjs/vault.cjs +12 -12
- package/dist/lib/cjs/view-registrar.cjs +1 -1
- package/dist/lib/cjs/virtual-file.cjs +16 -14
- package/dist/lib/cjs/virtual-file.d.cts +2 -1
- package/dist/lib/cjs/wasm.cjs +119 -0
- package/dist/lib/cjs/wasm.d.cts +54 -0
- package/dist/lib/cjs/worker-protocol.cjs +209 -0
- package/dist/lib/cjs/worker-protocol.d.cts +282 -0
- package/dist/lib/cjs/workspace.cjs +1 -1
- package/dist/lib/esm/__merged.d.mts +26 -10
- package/dist/lib/esm/__merged.mjs +215 -5
- package/dist/lib/esm/app.mjs +2 -2
- package/dist/lib/esm/attachment-path.d.mts +3 -3
- package/dist/lib/esm/attachment-path.mjs +2 -2
- package/dist/lib/esm/backlink-index.mjs +2 -2
- package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
- package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
- package/dist/lib/esm/bug-report.d.mts +65 -0
- package/dist/lib/esm/bug-report.mjs +33 -10
- package/dist/lib/esm/canvas.d.mts +13 -0
- package/dist/lib/esm/canvas.mjs +6 -5
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
- package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
- package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
- package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
- package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
- package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
- package/dist/lib/esm/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/components/component-ex.mjs +19 -6
- package/dist/lib/esm/components/disposable-component.mjs +1 -1
- package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
- package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
- package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
- package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
- package/dist/lib/esm/components/index.d.mts +5 -0
- package/dist/lib/esm/components/index.mjs +12 -2
- package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
- package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
- package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
- package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
- package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
- package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
- package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
- package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
- package/dist/lib/esm/components/worker-component.d.mts +156 -0
- package/dist/lib/esm/components/worker-component.mjs +279 -0
- package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
- package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
- package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
- package/dist/lib/esm/css-class.d.mts +16 -0
- package/dist/lib/esm/css-class.mjs +5 -1
- package/dist/lib/esm/data-handler.d.mts +219 -2
- package/dist/lib/esm/data-handler.mjs +262 -5
- package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
- package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
- package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
- package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
- package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
- package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
- package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
- package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
- package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
- package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
- package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
- package/dist/lib/esm/dataview.d.mts +14 -0
- package/dist/lib/esm/dataview.mjs +19 -1
- package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
- package/dist/lib/esm/demo-vault-helper.mjs +29 -1
- package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
- package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
- package/dist/lib/esm/desktop-git-runner.mjs +3 -3
- package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
- package/dist/lib/esm/disposable.d.mts +39 -0
- package/dist/lib/esm/disposable.mjs +64 -0
- package/dist/lib/esm/file-system.mjs +2 -2
- package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/git-rename-history.d.mts +2 -2
- package/dist/lib/esm/git-rename-history.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
- package/dist/lib/esm/i18n/locales/en.mjs +27 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +15 -1
- package/dist/lib/esm/link.d.mts +20 -14
- package/dist/lib/esm/link.mjs +57 -38
- package/dist/lib/esm/loop.mjs +2 -8
- package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
- package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
- package/dist/lib/esm/markdown-view.d.mts +48 -1
- package/dist/lib/esm/markdown-view.mjs +192 -2
- package/dist/lib/esm/metadata-cache.d.mts +5 -4
- package/dist/lib/esm/metadata-cache.mjs +6 -6
- package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
- package/dist/lib/esm/misplaced-attachment.mjs +212 -0
- package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
- package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
- package/dist/lib/esm/modals/index.d.mts +2 -0
- package/dist/lib/esm/modals/index.mjs +5 -1
- package/dist/lib/esm/modals/prompt.d.mts +1 -1
- package/dist/lib/esm/modals/prompt.mjs +1 -1
- package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
- package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
- package/dist/lib/esm/notebook-navigator.d.mts +6 -0
- package/dist/lib/esm/notebook-navigator.mjs +11 -2
- package/dist/lib/esm/parse-link.mjs +4 -4
- package/dist/lib/esm/path-compatibility.d.mts +263 -0
- package/dist/lib/esm/path-compatibility.mjs +277 -0
- package/dist/lib/esm/plugin/index.d.mts +2 -0
- package/dist/lib/esm/plugin/index.mjs +6 -2
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
- package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
- package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
- package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
- package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
- package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
- package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
- package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
- package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
- package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
- package/dist/lib/esm/plugin/plugin.d.mts +35 -5
- package/dist/lib/esm/plugin/plugin.mjs +118 -9
- package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
- package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
- package/dist/lib/esm/release-asset.mjs +1 -1
- package/dist/lib/esm/resource-lock.d.mts +8 -7
- package/dist/lib/esm/resource-lock.mjs +31 -26
- package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
- package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
- package/dist/lib/esm/settings-recovery.d.mts +178 -0
- package/dist/lib/esm/settings-recovery.mjs +125 -0
- package/dist/lib/esm/settings-tabs.mjs +2 -2
- package/dist/lib/esm/templater.d.mts +6 -0
- package/dist/lib/esm/templater.mjs +11 -2
- package/dist/lib/esm/vault.mjs +1 -1
- package/dist/lib/esm/virtual-file.d.mts +2 -1
- package/dist/lib/esm/virtual-file.mjs +7 -5
- package/dist/lib/esm/wasm.d.mts +54 -0
- package/dist/lib/esm/wasm.mjs +30 -0
- package/dist/lib/esm/worker-protocol.d.mts +282 -0
- package/dist/lib/esm/worker-protocol.mjs +113 -0
- package/dist/styles.css +16 -1
- package/modals/copy-text-manually/package.json +6 -0
- package/modals/review-bug-report-diagnostics/package.json +6 -0
- package/package.json +10 -8
- package/plugin/plugin-instance/package.json +6 -0
- package/plugin/third-party-plugin/package.json +6 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
import { noop } from "@mnaoumov/typescript-lib/function";
|
|
34
|
+
import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
|
|
35
|
+
import {
|
|
36
|
+
invokeWorkerHandler,
|
|
37
|
+
isWorkerResponseMessage,
|
|
38
|
+
unwrapTransferredValue,
|
|
39
|
+
WORKER_PROTOCOL
|
|
40
|
+
} from "../worker-protocol.mjs";
|
|
41
|
+
import { ComponentEx } from "./component-ex.mjs";
|
|
42
|
+
class WorkerCallError extends Error {
|
|
43
|
+
/**
|
|
44
|
+
* The name of the error thrown in the worker.
|
|
45
|
+
*/
|
|
46
|
+
remoteName;
|
|
47
|
+
/**
|
|
48
|
+
* The stack of the error thrown in the worker, when there was one.
|
|
49
|
+
*/
|
|
50
|
+
remoteStack;
|
|
51
|
+
/**
|
|
52
|
+
* Creates the error.
|
|
53
|
+
*
|
|
54
|
+
* @param error - The serialized worker-side error.
|
|
55
|
+
*/
|
|
56
|
+
constructor(error) {
|
|
57
|
+
super(error.message);
|
|
58
|
+
this.name = "WorkerCallError";
|
|
59
|
+
this.remoteName = error.name;
|
|
60
|
+
this.remoteStack = error.stack;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
class WorkerComponent extends ComponentEx {
|
|
64
|
+
/**
|
|
65
|
+
* Whether calls run on the main thread, because no `Worker` could be created and fallback handlers were given.
|
|
66
|
+
*
|
|
67
|
+
* @returns Whether the fallback is in use.
|
|
68
|
+
*/
|
|
69
|
+
get isUsingFallback() {
|
|
70
|
+
return this.activeFallbackHandlers !== null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The number of calls that have not settled yet.
|
|
74
|
+
*
|
|
75
|
+
* @returns The count.
|
|
76
|
+
*/
|
|
77
|
+
get pendingCallCount() {
|
|
78
|
+
return this._pendingCallCount;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The handlers to run on the main thread when no `Worker` can be created, or `null`.
|
|
82
|
+
*/
|
|
83
|
+
fallbackHandlers;
|
|
84
|
+
/**
|
|
85
|
+
* The worker's name, or `null`.
|
|
86
|
+
*/
|
|
87
|
+
name;
|
|
88
|
+
/**
|
|
89
|
+
* The bundled worker source.
|
|
90
|
+
*/
|
|
91
|
+
source;
|
|
92
|
+
_pendingCallCount = 0;
|
|
93
|
+
activeFallbackHandlers = null;
|
|
94
|
+
lastCallId = 0;
|
|
95
|
+
pendingCalls = /* @__PURE__ */ new Map();
|
|
96
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins -- The renderer's Web Worker, not Node's.
|
|
97
|
+
worker = null;
|
|
98
|
+
workerUrl = null;
|
|
99
|
+
/**
|
|
100
|
+
* Creates the component.
|
|
101
|
+
*
|
|
102
|
+
* @param params - The parameters.
|
|
103
|
+
*/
|
|
104
|
+
constructor(params) {
|
|
105
|
+
super();
|
|
106
|
+
this.fallbackHandlers = params.fallbackHandlers ?? null;
|
|
107
|
+
this.name = params.name ?? null;
|
|
108
|
+
this.source = params.source;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Calls a worker method.
|
|
112
|
+
*
|
|
113
|
+
* @typeParam TMethod - The method.
|
|
114
|
+
* @param method - The method name.
|
|
115
|
+
* @param callArguments - The method's arguments.
|
|
116
|
+
* @param options - The call options.
|
|
117
|
+
* @returns The method's result. Rejects with a {@link WorkerCallError} when the handler failed, with the abort reason
|
|
118
|
+
* when the call was cancelled, and with an `Error` when the worker failed or the component unloaded first.
|
|
119
|
+
*/
|
|
120
|
+
async call(method, callArguments, options = {}) {
|
|
121
|
+
if (!this._loaded) {
|
|
122
|
+
throw new Error("The worker component is not loaded");
|
|
123
|
+
}
|
|
124
|
+
const abortSignal = options.abortSignal ?? new AbortController().signal;
|
|
125
|
+
abortSignal.throwIfAborted();
|
|
126
|
+
this._pendingCallCount++;
|
|
127
|
+
try {
|
|
128
|
+
const result = this.activeFallbackHandlers === null ? await this.callWorker(method, callArguments, abortSignal, options.transfer ?? []) : await callFallback(this.activeFallbackHandlers, method, callArguments, abortSignal);
|
|
129
|
+
return result;
|
|
130
|
+
} finally {
|
|
131
|
+
this._pendingCallCount--;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Starts the worker.
|
|
136
|
+
*/
|
|
137
|
+
onload() {
|
|
138
|
+
super.onload();
|
|
139
|
+
try {
|
|
140
|
+
this.startWorker();
|
|
141
|
+
} catch (error) {
|
|
142
|
+
this.stopWorker();
|
|
143
|
+
if (this.fallbackHandlers === null) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
this.activeFallbackHandlers = this.fallbackHandlers;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Terminates the worker and rejects the pending calls.
|
|
151
|
+
*/
|
|
152
|
+
onunload() {
|
|
153
|
+
super.onunload();
|
|
154
|
+
this.stopWorker();
|
|
155
|
+
this.rejectAll(new Error("The worker component was unloaded"));
|
|
156
|
+
this.activeFallbackHandlers = null;
|
|
157
|
+
}
|
|
158
|
+
async callWorker(method, callArguments, abortSignal, transfer) {
|
|
159
|
+
const worker = ensureNonNullable(this.worker);
|
|
160
|
+
this.lastCallId++;
|
|
161
|
+
const id = this.lastCallId;
|
|
162
|
+
let onAbort = noop;
|
|
163
|
+
try {
|
|
164
|
+
return await new Promise((resolve, reject) => {
|
|
165
|
+
onAbort = () => {
|
|
166
|
+
if (!this.pendingCalls.delete(id)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const cancelMessage = { id, kind: "cancel", protocol: WORKER_PROTOCOL };
|
|
170
|
+
worker.postMessage(cancelMessage);
|
|
171
|
+
reject(getAbortReason(abortSignal));
|
|
172
|
+
};
|
|
173
|
+
this.pendingCalls.set(id, { reject, resolve });
|
|
174
|
+
const callMessage = { arguments: callArguments, id, kind: "call", method, protocol: WORKER_PROTOCOL };
|
|
175
|
+
try {
|
|
176
|
+
worker.postMessage(callMessage, [...transfer]);
|
|
177
|
+
} catch (error) {
|
|
178
|
+
this.pendingCalls.delete(id);
|
|
179
|
+
reject(toError(error));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
183
|
+
});
|
|
184
|
+
} finally {
|
|
185
|
+
abortSignal.removeEventListener("abort", onAbort);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// eslint-disable-next-line n/no-unsupported-features/node-builtins -- The renderer's Web ErrorEvent, not Node's.
|
|
189
|
+
handleError = ($event) => {
|
|
190
|
+
$event.preventDefault();
|
|
191
|
+
this.rejectAll(new Error(`The worker failed: ${$event.message || "unknown error"}`));
|
|
192
|
+
};
|
|
193
|
+
handleMessage = ($event) => {
|
|
194
|
+
const message = $event.data;
|
|
195
|
+
if (!isWorkerResponseMessage(message)) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const pendingCall = this.pendingCalls.get(message.id);
|
|
199
|
+
if (!pendingCall) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
this.pendingCalls.delete(message.id);
|
|
203
|
+
if (message.kind === "result") {
|
|
204
|
+
pendingCall.resolve(message.value);
|
|
205
|
+
} else {
|
|
206
|
+
pendingCall.reject(new WorkerCallError(message.error));
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
handleMessageError = () => {
|
|
210
|
+
this.rejectAll(new Error("The worker sent a message that could not be deserialized"));
|
|
211
|
+
};
|
|
212
|
+
rejectAll(reason) {
|
|
213
|
+
const pendingCalls = [...this.pendingCalls.values()];
|
|
214
|
+
this.pendingCalls.clear();
|
|
215
|
+
for (const pendingCall of pendingCalls) {
|
|
216
|
+
pendingCall.reject(reason);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
revokeWorkerUrl() {
|
|
220
|
+
if (this.workerUrl === null) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
window.URL.revokeObjectURL(this.workerUrl);
|
|
224
|
+
this.workerUrl = null;
|
|
225
|
+
}
|
|
226
|
+
startWorker() {
|
|
227
|
+
this.workerUrl = window.URL.createObjectURL(new Blob([this.source], { type: "text/javascript" }));
|
|
228
|
+
const workerOptions = this.name === null ? {} : { name: this.name };
|
|
229
|
+
const worker = new window.Worker(this.workerUrl, workerOptions);
|
|
230
|
+
this.worker = worker;
|
|
231
|
+
worker.addEventListener("message", this.handleMessage);
|
|
232
|
+
worker.addEventListener("messageerror", this.handleMessageError);
|
|
233
|
+
worker.addEventListener("error", this.handleError);
|
|
234
|
+
}
|
|
235
|
+
stopWorker() {
|
|
236
|
+
this.terminateWorker();
|
|
237
|
+
this.revokeWorkerUrl();
|
|
238
|
+
}
|
|
239
|
+
terminateWorker() {
|
|
240
|
+
if (!this.worker) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
this.worker.removeEventListener("message", this.handleMessage);
|
|
244
|
+
this.worker.removeEventListener("messageerror", this.handleMessageError);
|
|
245
|
+
this.worker.removeEventListener("error", this.handleError);
|
|
246
|
+
this.worker.terminate();
|
|
247
|
+
this.worker = null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
async function callFallback(handlers, method, callArguments, callerSignal) {
|
|
251
|
+
const abortController = new AbortController();
|
|
252
|
+
function onAbort() {
|
|
253
|
+
abortController.abort(callerSignal.reason);
|
|
254
|
+
}
|
|
255
|
+
callerSignal.addEventListener("abort", onAbort, { once: true });
|
|
256
|
+
try {
|
|
257
|
+
const handlerPromise = invokeWorkerHandler(handlers, method, callArguments, { abortSignal: abortController.signal });
|
|
258
|
+
handlerPromise.catch(noop);
|
|
259
|
+
const abortPromise = new Promise((_resolve, reject) => {
|
|
260
|
+
abortController.signal.addEventListener("abort", () => {
|
|
261
|
+
reject(getAbortReason(abortController.signal));
|
|
262
|
+
}, { once: true });
|
|
263
|
+
});
|
|
264
|
+
return unwrapTransferredValue(await Promise.race([handlerPromise, abortPromise])).value;
|
|
265
|
+
} finally {
|
|
266
|
+
callerSignal.removeEventListener("abort", onAbort);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function getAbortReason(abortSignal) {
|
|
270
|
+
return toError(abortSignal.reason);
|
|
271
|
+
}
|
|
272
|
+
function toError(reason) {
|
|
273
|
+
return reason instanceof Error ? reason : new Error(String(reason));
|
|
274
|
+
}
|
|
275
|
+
export {
|
|
276
|
+
WorkerCallError,
|
|
277
|
+
WorkerComponent
|
|
278
|
+
};
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3dvcmtlci1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgY29tcG9uZW50IHRoYXQgb3ducyBvbmUgYnJvd3NlciBgV29ya2VyYCBidWlsdCBmcm9tIGJ1bmRsZWQgc291cmNlIGFuZCBjYWxscyBpdCB0aHJvdWdoIGEgdHlwZWQgcmVxdWVzdC9yZXNwb25zZVxuICogY2hhbm5lbC5cbiAqL1xuXG5pbXBvcnQgeyBub29wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHR5cGUge1xuICBTZXJpYWxpemVkV29ya2VyRXJyb3IsXG4gIFdvcmtlckFwaSxcbiAgV29ya2VyQXBpSGFuZGxlcnMsXG4gIFdvcmtlckNhbGxNZXNzYWdlLFxuICBXb3JrZXJDYW5jZWxNZXNzYWdlXG59IGZyb20gJy4uL3dvcmtlci1wcm90b2NvbC50cyc7XG5cbmltcG9ydCB7XG4gIGludm9rZVdvcmtlckhhbmRsZXIsXG4gIGlzV29ya2VyUmVzcG9uc2VNZXNzYWdlLFxuICB1bndyYXBUcmFuc2ZlcnJlZFZhbHVlLFxuICBXT1JLRVJfUFJPVE9DT0xcbn0gZnJvbSAnLi4vd29ya2VyLXByb3RvY29sLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgb2Yge0BsaW5rIFdvcmtlckNvbXBvbmVudC5jYWxsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJDb21wb25lbnRDYWxsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDYW5jZWxzIHRoZSBjYWxsLiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzIHdpdGggdGhlIHNpZ25hbCdzIHJlYXNvbiBhdCBvbmNlLCBhbmQgdGhlIHdvcmtlcidzIGhhbmRsZXIgc2VlcyBpdHNcbiAgICogb3duIGB0aGlzLmFib3J0U2lnbmFsYCBhYm9ydGVkOyB3aGF0ZXZlciBpdCBhbnN3ZXJzIGFmdGVyd2FyZHMgaXMgZHJvcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIE9iamVjdHMgaW5zaWRlIHRoZSBhcmd1bWVudHMgdG8gdHJhbnNmZXIgcmF0aGVyIHRoYW4gY29weS4gVGhleSBhcmUgdW51c2FibGUgb24gdGhlIG1haW4gdGhyZWFkIGFmdGVyd2FyZHMuXG4gICAqL1xuICByZWFkb25seSB0cmFuc2Zlcj86IHJlYWRvbmx5IFRyYW5zZmVyYWJsZVtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgb2Yge0BsaW5rIFdvcmtlckNvbXBvbmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgd29ya2VyIGV4cG9zZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2VyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8VEFwaSBleHRlbmRzIFdvcmtlckFwaTxUQXBpPj4ge1xuICAvKipcbiAgICogVGhlIHNhbWUgaGFuZGxlcnMgdGhlIHdvcmtlciBleHBvc2VzLCBydW4gb24gdGhlIG1haW4gdGhyZWFkIHdoZW4gbm8gYFdvcmtlcmAgY2FuIGJlIGNyZWF0ZWQuIFdpdGhvdXQgdGhlbSwgYVxuICAgKiBmYWlsdXJlIHRvIGNyZWF0ZSB0aGUgd29ya2VyIGZhaWxzIHRoZSBjb21wb25lbnQncyBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFsbGJhY2tIYW5kbGVycz86IFdvcmtlckFwaUhhbmRsZXJzPFRBcGk+O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2VyJ3MgbmFtZSwgc2hvd24gYnkgdGhlIGRldmVsb3BlciB0b29scy5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBidW5kbGVkIHdvcmtlciBzb3VyY2U6IHRoZSBzdHJpbmcgYSBgKi53b3JrZXIudHM/d29ya2VyLXNvdXJjZWAgaW1wb3J0IGdpdmVzIHdpdGhcbiAgICogYEBtbmFvdW1vdi9vYnNpZGlhbi1kZXYtdG9vbGtpdGAncyBgd29ya2Vyc2AgZmVhdHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBtZXRob2QgbmFtZXMgb2YgYSB7QGxpbmsgV29ya2VyQXBpfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtlck1ldGhvZDxUQXBpPiA9IEV4dHJhY3Q8a2V5b2YgVEFwaSwgc3RyaW5nPjtcblxuLyoqXG4gKiBUaGUgcmVzb2x2ZWQgcmVzdWx0IHR5cGUgb2YgYSB3b3JrZXIgbWV0aG9kLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVE1ldGhvZCAtIFRoZSBtZXRob2QuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtlck1ldGhvZFJlc3VsdDxUQXBpIGV4dGVuZHMgV29ya2VyQXBpPFRBcGk+LCBUTWV0aG9kIGV4dGVuZHMgV29ya2VyTWV0aG9kPFRBcGk+PiA9IEF3YWl0ZWQ8UmV0dXJuVHlwZTxUQXBpW1RNZXRob2RdPj47XG5cbmludGVyZmFjZSBQZW5kaW5nQ2FsbCB7XG4gIHJlYWRvbmx5IHJlamVjdDogKHJlYXNvbjogRXJyb3IpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHJlc29sdmU6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgZXJyb3IgYSBjYWxsIHJlamVjdHMgd2l0aCB3aGVuIHRoZSB3b3JrZXIncyBoYW5kbGVyIGZhaWxlZC4gSXQgY2FycmllcyB0aGUgd29ya2VyLXNpZGUgbmFtZSwgbWVzc2FnZSBhbmQgc3RhY2ssXG4gKiBiZWNhdXNlIGFuIGBFcnJvcmAgbG9zZXMgaXRzIGNsYXNzIGFjcm9zcyB0aGUgd29ya2VyIGJvdW5kYXJ5LlxuICovXG5leHBvcnQgY2xhc3MgV29ya2VyQ2FsbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGVycm9yIHRocm93biBpbiB0aGUgd29ya2VyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlbW90ZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN0YWNrIG9mIHRoZSBlcnJvciB0aHJvd24gaW4gdGhlIHdvcmtlciwgd2hlbiB0aGVyZSB3YXMgb25lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlbW90ZVN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3IgLSBUaGUgc2VyaWFsaXplZCB3b3JrZXItc2lkZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihlcnJvcjogU2VyaWFsaXplZFdvcmtlckVycm9yKSB7XG4gICAgc3VwZXIoZXJyb3IubWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtlckNhbGxFcnJvcic7XG4gICAgdGhpcy5yZW1vdGVOYW1lID0gZXJyb3IubmFtZTtcbiAgICB0aGlzLnJlbW90ZVN0YWNrID0gZXJyb3Iuc3RhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBPd25zIG9uZSBgV29ya2VyYCBmb3IgdGhlIGNvbXBvbmVudCdzIGxpZmV0aW1lLlxuICpcbiAqIE9uIGxvYWQgaXQgdHVybnMgdGhlIGJ1bmRsZWQgc291cmNlIGludG8gYSBCbG9iIFVSTCBhbmQgc3RhcnRzIHRoZSB3b3JrZXI7IG9uIHVubG9hZCBpdCB0ZXJtaW5hdGVzIHRoZSB3b3JrZXIsXG4gKiByZXZva2VzIHRoZSBVUkwgYW5kIHJlamVjdHMgZXZlcnkgcGVuZGluZyBjYWxsLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGUgcGx1Z2luIChvciBvZiBhbnkgY29tcG9uZW50KSwgc28gdGhlIHdvcmtlclxuICogbmV2ZXIgb3V0bGl2ZXMgd2hhdCB1c2VzIGl0LlxuICpcbiAqIFRoZSB3b3JrZXIgZW50cnkgcG9pbnQgY2FsbHMgYGV4cG9zZVdvcmtlckFwaWAgZnJvbSBgQG1uYW91bW92L29ic2lkaWFuLWxpYi93b3JrZXItcHJvdG9jb2xgLCBhbmRcbiAqIHtAbGluayBXb3JrZXJDb21wb25lbnQuY2FsbH0gcmVhY2hlcyBpdHMgaGFuZGxlcnMgYnkgbmFtZSwgdHlwZWQgYnkgYFRBcGlgLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIHdvcmtlciBleHBvc2VzLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2VyQ29tcG9uZW50PFRBcGkgZXh0ZW5kcyBXb3JrZXJBcGk8VEFwaT4+IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogV2hldGhlciBjYWxscyBydW4gb24gdGhlIG1haW4gdGhyZWFkLCBiZWNhdXNlIG5vIGBXb3JrZXJgIGNvdWxkIGJlIGNyZWF0ZWQgYW5kIGZhbGxiYWNrIGhhbmRsZXJzIHdlcmUgZ2l2ZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZhbGxiYWNrIGlzIGluIHVzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNVc2luZ0ZhbGxiYWNrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZhbGxiYWNrSGFuZGxlcnMgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjYWxscyB0aGF0IGhhdmUgbm90IHNldHRsZWQgeWV0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY291bnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBlbmRpbmdDYWxsQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NhbGxDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlcnMgdG8gcnVuIG9uIHRoZSBtYWluIHRocmVhZCB3aGVuIG5vIGBXb3JrZXJgIGNhbiBiZSBjcmVhdGVkLCBvciBgbnVsbGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFsbGJhY2tIYW5kbGVyczogbnVsbCB8IFdvcmtlckFwaUhhbmRsZXJzPFRBcGk+O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2VyJ3MgbmFtZSwgb3IgYG51bGxgLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWU6IG51bGwgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBidW5kbGVkIHdvcmtlciBzb3VyY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfcGVuZGluZ0NhbGxDb3VudCA9IDA7XG4gIHByaXZhdGUgYWN0aXZlRmFsbGJhY2tIYW5kbGVyczogbnVsbCB8IFdvcmtlckFwaUhhbmRsZXJzPFRBcGk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0Q2FsbElkID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nQ2FsbHMgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZ0NhbGw+KCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlIHJlbmRlcmVyJ3MgV2ViIFdvcmtlciwgbm90IE5vZGUncy5cbiAgcHJpdmF0ZSB3b3JrZXI6IG51bGwgfCBXb3JrZXIgPSBudWxsO1xuICBwcml2YXRlIHdvcmtlclVybDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogV29ya2VyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8VEFwaT4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmFsbGJhY2tIYW5kbGVycyA9IHBhcmFtcy5mYWxsYmFja0hhbmRsZXJzID8/IG51bGw7XG4gICAgdGhpcy5uYW1lID0gcGFyYW1zLm5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSB3b3JrZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRNZXRob2QgLSBUaGUgbWV0aG9kLlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gY2FsbEFyZ3VtZW50cyAtIFRoZSBtZXRob2QncyBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNhbGwgb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG1ldGhvZCdzIHJlc3VsdC4gUmVqZWN0cyB3aXRoIGEge0BsaW5rIFdvcmtlckNhbGxFcnJvcn0gd2hlbiB0aGUgaGFuZGxlciBmYWlsZWQsIHdpdGggdGhlIGFib3J0IHJlYXNvblxuICAgKiAgIHdoZW4gdGhlIGNhbGwgd2FzIGNhbmNlbGxlZCwgYW5kIHdpdGggYW4gYEVycm9yYCB3aGVuIHRoZSB3b3JrZXIgZmFpbGVkIG9yIHRoZSBjb21wb25lbnQgdW5sb2FkZWQgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FsbDxUTWV0aG9kIGV4dGVuZHMgV29ya2VyTWV0aG9kPFRBcGk+PihcbiAgICBtZXRob2Q6IFRNZXRob2QsXG4gICAgY2FsbEFyZ3VtZW50czogUGFyYW1ldGVyczxUQXBpW1RNZXRob2RdPixcbiAgICBvcHRpb25zOiBXb3JrZXJDb21wb25lbnRDYWxsT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8V29ya2VyTWV0aG9kUmVzdWx0PFRBcGksIFRNZXRob2Q+PiB7XG4gICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHdvcmtlciBjb21wb25lbnQgaXMgbm90IGxvYWRlZCcpO1xuICAgIH1cbiAgICBjb25zdCBhYm9ydFNpZ25hbCA9IG9wdGlvbnMuYWJvcnRTaWduYWwgPz8gbmV3IEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgdGhpcy5fcGVuZGluZ0NhbGxDb3VudCsrO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFjdGl2ZUZhbGxiYWNrSGFuZGxlcnMgPT09IG51bGxcbiAgICAgICAgPyBhd2FpdCB0aGlzLmNhbGxXb3JrZXIobWV0aG9kLCBjYWxsQXJndW1lbnRzLCBhYm9ydFNpZ25hbCwgb3B0aW9ucy50cmFuc2ZlciA/PyBbXSlcbiAgICAgICAgOiBhd2FpdCBjYWxsRmFsbGJhY2sodGhpcy5hY3RpdmVGYWxsYmFja0hhbmRsZXJzLCBtZXRob2QsIGNhbGxBcmd1bWVudHMsIGFib3J0U2lnbmFsKTtcbiAgICAgIHJldHVybiByZXN1bHQgYXMgV29ya2VyTWV0aG9kUmVzdWx0PFRBcGksIFRNZXRob2Q+O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9wZW5kaW5nQ2FsbENvdW50LS07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd29ya2VyLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5zdGFydFdvcmtlcigpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnN0b3BXb3JrZXIoKTtcbiAgICAgIGlmICh0aGlzLmZhbGxiYWNrSGFuZGxlcnMgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2ZUZhbGxiYWNrSGFuZGxlcnMgPSB0aGlzLmZhbGxiYWNrSGFuZGxlcnM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZXMgdGhlIHdvcmtlciBhbmQgcmVqZWN0cyB0aGUgcGVuZGluZyBjYWxscy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICAgIHRoaXMuc3RvcFdvcmtlcigpO1xuICAgIHRoaXMucmVqZWN0QWxsKG5ldyBFcnJvcignVGhlIHdvcmtlciBjb21wb25lbnQgd2FzIHVubG9hZGVkJykpO1xuICAgIHRoaXMuYWN0aXZlRmFsbGJhY2tIYW5kbGVycyA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhbGxXb3JrZXIoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgY2FsbEFyZ3VtZW50czogcmVhZG9ubHkgdW5rbm93bltdLFxuICAgIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgICB0cmFuc2ZlcjogcmVhZG9ubHkgVHJhbnNmZXJhYmxlW11cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQSBsb2FkZWQgY29tcG9uZW50IHdpdGhvdXQgZmFsbGJhY2sgaGFuZGxlcnMgaW4gdXNlIGFsd2F5cyBob2xkcyBpdHMgd29ya2VyLlxuICAgIGNvbnN0IHdvcmtlciA9IGVuc3VyZU5vbk51bGxhYmxlKHRoaXMud29ya2VyKTtcblxuICAgIHRoaXMubGFzdENhbGxJZCsrO1xuICAgIGNvbnN0IGlkID0gdGhpcy5sYXN0Q2FsbElkO1xuICAgIGxldCBvbkFib3J0ID0gbm9vcDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8dW5rbm93bj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBvbkFib3J0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2FsbHMuZGVsZXRlKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjYW5jZWxNZXNzYWdlOiBXb3JrZXJDYW5jZWxNZXNzYWdlID0geyBpZCwga2luZDogJ2NhbmNlbCcsIHByb3RvY29sOiBXT1JLRVJfUFJPVE9DT0wgfTtcbiAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoY2FuY2VsTWVzc2FnZSk7XG4gICAgICAgICAgcmVqZWN0KGdldEFib3J0UmVhc29uKGFib3J0U2lnbmFsKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGVuZGluZ0NhbGxzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICAgIGNvbnN0IGNhbGxNZXNzYWdlOiBXb3JrZXJDYWxsTWVzc2FnZSA9IHsgYXJndW1lbnRzOiBjYWxsQXJndW1lbnRzLCBpZCwga2luZDogJ2NhbGwnLCBtZXRob2QsIHByb3RvY29sOiBXT1JLRVJfUFJPVE9DT0wgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UoY2FsbE1lc3NhZ2UsIFsuLi50cmFuc2Zlcl0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMucGVuZGluZ0NhbGxzLmRlbGV0ZShpZCk7XG4gICAgICAgICAgcmVqZWN0KHRvRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZSByZW5kZXJlcidzIFdlYiBFcnJvckV2ZW50LCBub3QgTm9kZSdzLlxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZUVycm9yID0gKCRldmVudDogRXJyb3JFdmVudCk6IHZvaWQgPT4ge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVqZWN0QWxsKG5ldyBFcnJvcihgVGhlIHdvcmtlciBmYWlsZWQ6ICR7JGV2ZW50Lm1lc3NhZ2UgfHwgJ3Vua25vd24gZXJyb3InfWApKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZU1lc3NhZ2UgPSAoJGV2ZW50OiBNZXNzYWdlRXZlbnQ8dW5rbm93bj4pOiB2b2lkID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gJGV2ZW50LmRhdGE7XG4gICAgaWYgKCFpc1dvcmtlclJlc3BvbnNlTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nQ2FsbCA9IHRoaXMucGVuZGluZ0NhbGxzLmdldChtZXNzYWdlLmlkKTtcbiAgICBpZiAoIXBlbmRpbmdDYWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0NhbGxzLmRlbGV0ZShtZXNzYWdlLmlkKTtcbiAgICBpZiAobWVzc2FnZS5raW5kID09PSAncmVzdWx0Jykge1xuICAgICAgcGVuZGluZ0NhbGwucmVzb2x2ZShtZXNzYWdlLnZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ0NhbGwucmVqZWN0KG5ldyBXb3JrZXJDYWxsRXJyb3IobWVzc2FnZS5lcnJvcikpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZU1lc3NhZ2VFcnJvciA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLnJlamVjdEFsbChuZXcgRXJyb3IoJ1RoZSB3b3JrZXIgc2VudCBhIG1lc3NhZ2UgdGhhdCBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkJykpO1xuICB9O1xuXG4gIHByaXZhdGUgcmVqZWN0QWxsKHJlYXNvbjogRXJyb3IpOiB2b2lkIHtcbiAgICBjb25zdCBwZW5kaW5nQ2FsbHMgPSBbLi4udGhpcy5wZW5kaW5nQ2FsbHMudmFsdWVzKCldO1xuICAgIHRoaXMucGVuZGluZ0NhbGxzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBwZW5kaW5nQ2FsbCBvZiBwZW5kaW5nQ2FsbHMpIHtcbiAgICAgIHBlbmRpbmdDYWxsLnJlamVjdChyZWFzb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmV2b2tlV29ya2VyVXJsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndvcmtlclVybCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLndvcmtlclVybCk7XG4gICAgdGhpcy53b3JrZXJVcmwgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFdvcmtlcigpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtlclVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLnNvdXJjZV0sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSkpO1xuICAgIGNvbnN0IHdvcmtlck9wdGlvbnM6IFdvcmtlck9wdGlvbnMgPSB0aGlzLm5hbWUgPT09IG51bGwgPyB7fSA6IHsgbmFtZTogdGhpcy5uYW1lIH07XG4gICAgY29uc3Qgd29ya2VyID0gbmV3IHdpbmRvdy5Xb3JrZXIodGhpcy53b3JrZXJVcmwsIHdvcmtlck9wdGlvbnMpO1xuICAgIHRoaXMud29ya2VyID0gd29ya2VyO1xuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVNZXNzYWdlKTtcbiAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZWVycm9yJywgdGhpcy5oYW5kbGVNZXNzYWdlRXJyb3IpO1xuICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuaGFuZGxlRXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV29ya2VyKCk6IHZvaWQge1xuICAgIHRoaXMudGVybWluYXRlV29ya2VyKCk7XG4gICAgdGhpcy5yZXZva2VXb3JrZXJVcmwoKTtcbiAgfVxuXG4gIHByaXZhdGUgdGVybWluYXRlV29ya2VyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy53b3JrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlTWVzc2FnZSk7XG4gICAgdGhpcy53b3JrZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZWVycm9yJywgdGhpcy5oYW5kbGVNZXNzYWdlRXJyb3IpO1xuICAgIHRoaXMud29ya2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5oYW5kbGVFcnJvcik7XG4gICAgdGhpcy53b3JrZXIudGVybWluYXRlKCk7XG4gICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhbGxGYWxsYmFjayhcbiAgaGFuZGxlcnM6IG9iamVjdCxcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIGNhbGxBcmd1bWVudHM6IHJlYWRvbmx5IHVua25vd25bXSxcbiAgY2FsbGVyU2lnbmFsOiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgZnVuY3Rpb24gb25BYm9ydCgpOiB2b2lkIHtcbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoY2FsbGVyU2lnbmFsLnJlYXNvbik7XG4gIH1cbiAgY2FsbGVyU2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGhhbmRsZXJQcm9taXNlID0gaW52b2tlV29ya2VySGFuZGxlcihoYW5kbGVycywgbWV0aG9kLCBjYWxsQXJndW1lbnRzLCB7IGFib3J0U2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICAgIC8vIFRoZSByYWNlIGJlbG93IG1heSBzZXR0bGUgb24gdGhlIGFib3J0IGZpcnN0OyB0aGUgaGFuZGxlcidzIG93biBsYXRlciByZWplY3Rpb24gaXMgdGhlbiBub2JvZHkncyB0byByZXBvcnQuXG4gICAgaGFuZGxlclByb21pc2UuY2F0Y2gobm9vcCk7XG4gICAgY29uc3QgYWJvcnRQcm9taXNlID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICByZWplY3QoZ2V0QWJvcnRSZWFzb24oYWJvcnRDb250cm9sbGVyLnNpZ25hbCkpO1xuICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB1bndyYXBUcmFuc2ZlcnJlZFZhbHVlKGF3YWl0IFByb21pc2UucmFjZShbaGFuZGxlclByb21pc2UsIGFib3J0UHJvbWlzZV0pKS52YWx1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjYWxsZXJTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRBYm9ydFJlYXNvbihhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBFcnJvciB7XG4gIHJldHVybiB0b0Vycm9yKGFib3J0U2lnbmFsLnJlYXNvbik7XG59XG5cbmZ1bmN0aW9uIHRvRXJyb3IocmVhc29uOiB1bmtub3duKTogRXJyb3Ige1xuICByZXR1cm4gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsWUFBWTtBQUNyQixTQUFTLHlCQUF5QjtBQVVsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/// <reference lib="dom" />
|
|
3
|
+
/**
|
|
4
|
+
* @file
|
|
5
|
+
*
|
|
6
|
+
* A component that owns several workers built from the same bundled source and spreads calls over them.
|
|
7
|
+
*/
|
|
8
|
+
import type { WorkerApi, WorkerApiHandlers } from '../worker-protocol.mjs';
|
|
9
|
+
import type { WorkerComponentCallOptions, WorkerMethod, WorkerMethodResult } from './worker-component.mjs';
|
|
10
|
+
import { ComponentEx } from './component-ex.mjs';
|
|
11
|
+
import { WorkerComponent } from './worker-component.mjs';
|
|
12
|
+
/**
|
|
13
|
+
* The most workers {@link getDefaultWorkerPoolSize} suggests, so a pool on a many-core desktop does not starve
|
|
14
|
+
* Obsidian's own renderer of memory.
|
|
15
|
+
*/
|
|
16
|
+
export declare const MAX_DEFAULT_WORKER_POOL_SIZE = 4;
|
|
17
|
+
/**
|
|
18
|
+
* Options of {@link WorkerPoolComponent.call}: the same as {@link WorkerComponent.call}'s.
|
|
19
|
+
*/
|
|
20
|
+
export type WorkerPoolComponentCallOptions = WorkerComponentCallOptions;
|
|
21
|
+
/**
|
|
22
|
+
* Parameters of {@link WorkerPoolComponent}.
|
|
23
|
+
*
|
|
24
|
+
* @typeParam TApi - The API every worker exposes.
|
|
25
|
+
*/
|
|
26
|
+
export interface WorkerPoolComponentConstructorParams<TApi extends WorkerApi<TApi>> {
|
|
27
|
+
/**
|
|
28
|
+
* The handlers to run on the main thread when no `Worker` can be created. See {@link WorkerComponent}.
|
|
29
|
+
*/
|
|
30
|
+
readonly fallbackHandlers?: WorkerApiHandlers<TApi>;
|
|
31
|
+
/**
|
|
32
|
+
* The workers' name prefix, shown by the developer tools; each worker gets `<name> <index>`.
|
|
33
|
+
*/
|
|
34
|
+
readonly name?: string;
|
|
35
|
+
/**
|
|
36
|
+
* The number of workers. Defaults to {@link getDefaultWorkerPoolSize}.
|
|
37
|
+
*/
|
|
38
|
+
readonly size?: number;
|
|
39
|
+
/**
|
|
40
|
+
* The bundled worker source.
|
|
41
|
+
*/
|
|
42
|
+
readonly source: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Owns a fixed number of {@link WorkerComponent} children and sends each call to the one with the fewest pending calls.
|
|
46
|
+
*
|
|
47
|
+
* Use it for CPU-bound jobs that split into independent calls. A job that keeps state in a worker (a loaded corpus, an
|
|
48
|
+
* instantiated module) addresses each worker by index through {@link WorkerPoolComponent.getWorker} instead.
|
|
49
|
+
*
|
|
50
|
+
* @typeParam TApi - The API every worker exposes.
|
|
51
|
+
*/
|
|
52
|
+
export declare class WorkerPoolComponent<TApi extends WorkerApi<TApi>> extends ComponentEx {
|
|
53
|
+
protected readonly params: WorkerPoolComponentConstructorParams<TApi>;
|
|
54
|
+
/**
|
|
55
|
+
* The number of workers.
|
|
56
|
+
*
|
|
57
|
+
* @returns The size.
|
|
58
|
+
*/
|
|
59
|
+
get size(): number;
|
|
60
|
+
private readonly workers;
|
|
61
|
+
/**
|
|
62
|
+
* Creates the pool.
|
|
63
|
+
*
|
|
64
|
+
* @param params - The parameters.
|
|
65
|
+
*/
|
|
66
|
+
constructor(params: WorkerPoolComponentConstructorParams<TApi>);
|
|
67
|
+
/**
|
|
68
|
+
* Calls a method on the least busy worker.
|
|
69
|
+
*
|
|
70
|
+
* @typeParam TMethod - The method.
|
|
71
|
+
* @param method - The method name.
|
|
72
|
+
* @param callArguments - The method's arguments.
|
|
73
|
+
* @param options - The call options.
|
|
74
|
+
* @returns The method's result.
|
|
75
|
+
*/
|
|
76
|
+
call<TMethod extends WorkerMethod<TApi>>(method: TMethod, callArguments: Parameters<TApi[TMethod]>, options?: WorkerPoolComponentCallOptions): Promise<WorkerMethodResult<TApi, TMethod>>;
|
|
77
|
+
/**
|
|
78
|
+
* Calls a method on every worker with the same arguments, for instance to configure them all.
|
|
79
|
+
*
|
|
80
|
+
* @typeParam TMethod - The method.
|
|
81
|
+
* @param method - The method name.
|
|
82
|
+
* @param callArguments - The method's arguments, cloned for each worker; nothing can be transferred to all of them.
|
|
83
|
+
* @param abortSignal - Cancels every call.
|
|
84
|
+
* @returns The results, in worker order.
|
|
85
|
+
*/
|
|
86
|
+
callAll<TMethod extends WorkerMethod<TApi>>(method: TMethod, callArguments: Parameters<TApi[TMethod]>, abortSignal?: AbortSignal): Promise<WorkerMethodResult<TApi, TMethod>[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Gets one worker, for jobs that keep state in a particular worker.
|
|
89
|
+
*
|
|
90
|
+
* @param index - The worker index, from `0` to {@link WorkerPoolComponent.size} minus one.
|
|
91
|
+
* @returns The worker.
|
|
92
|
+
*/
|
|
93
|
+
getWorker(index: number): WorkerComponent<TApi>;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Suggests a pool size: one fewer than the logical processors, so the main thread keeps one, between `1` and
|
|
97
|
+
* {@link MAX_DEFAULT_WORKER_POOL_SIZE}.
|
|
98
|
+
*
|
|
99
|
+
* @param hardwareConcurrency - The number of logical processors. Defaults to `navigator.hardwareConcurrency`.
|
|
100
|
+
* @returns The suggested size.
|
|
101
|
+
*/
|
|
102
|
+
export declare function getDefaultWorkerPoolSize(hardwareConcurrency?: number): number;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { ComponentEx } from "./component-ex.mjs";
|
|
7
|
+
import { WorkerComponent } from "./worker-component.mjs";
|
|
8
|
+
const MAX_DEFAULT_WORKER_POOL_SIZE = 4;
|
|
9
|
+
class WorkerPoolComponent extends ComponentEx {
|
|
10
|
+
/**
|
|
11
|
+
* Creates the pool.
|
|
12
|
+
*
|
|
13
|
+
* @param params - The parameters.
|
|
14
|
+
*/
|
|
15
|
+
constructor(params) {
|
|
16
|
+
super();
|
|
17
|
+
this.params = params;
|
|
18
|
+
const size = params.size ?? getDefaultWorkerPoolSize();
|
|
19
|
+
if (!Number.isSafeInteger(size) || size < 1) {
|
|
20
|
+
throw new Error(`A worker pool needs a positive integer size, not ${String(size)}`);
|
|
21
|
+
}
|
|
22
|
+
for (let index = 0; index < size; index++) {
|
|
23
|
+
const workerParams = {
|
|
24
|
+
source: params.source,
|
|
25
|
+
...params.fallbackHandlers !== void 0 && { fallbackHandlers: params.fallbackHandlers },
|
|
26
|
+
...params.name !== void 0 && { name: `${params.name} ${String(index)}` }
|
|
27
|
+
};
|
|
28
|
+
this.workers.push(this.addChild(new WorkerComponent(workerParams)));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
params;
|
|
32
|
+
/**
|
|
33
|
+
* The number of workers.
|
|
34
|
+
*
|
|
35
|
+
* @returns The size.
|
|
36
|
+
*/
|
|
37
|
+
get size() {
|
|
38
|
+
return this.workers.length;
|
|
39
|
+
}
|
|
40
|
+
workers = [];
|
|
41
|
+
/**
|
|
42
|
+
* Calls a method on the least busy worker.
|
|
43
|
+
*
|
|
44
|
+
* @typeParam TMethod - The method.
|
|
45
|
+
* @param method - The method name.
|
|
46
|
+
* @param callArguments - The method's arguments.
|
|
47
|
+
* @param options - The call options.
|
|
48
|
+
* @returns The method's result.
|
|
49
|
+
*/
|
|
50
|
+
async call(method, callArguments, options) {
|
|
51
|
+
let leastBusy = this.getWorker(0);
|
|
52
|
+
for (const worker of this.workers) {
|
|
53
|
+
if (worker.pendingCallCount < leastBusy.pendingCallCount) {
|
|
54
|
+
leastBusy = worker;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return await leastBusy.call(method, callArguments, options);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Calls a method on every worker with the same arguments, for instance to configure them all.
|
|
61
|
+
*
|
|
62
|
+
* @typeParam TMethod - The method.
|
|
63
|
+
* @param method - The method name.
|
|
64
|
+
* @param callArguments - The method's arguments, cloned for each worker; nothing can be transferred to all of them.
|
|
65
|
+
* @param abortSignal - Cancels every call.
|
|
66
|
+
* @returns The results, in worker order.
|
|
67
|
+
*/
|
|
68
|
+
async callAll(method, callArguments, abortSignal) {
|
|
69
|
+
const options = abortSignal === void 0 ? {} : { abortSignal };
|
|
70
|
+
return await Promise.all(this.workers.map(async (worker) => await worker.call(method, callArguments, options)));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Gets one worker, for jobs that keep state in a particular worker.
|
|
74
|
+
*
|
|
75
|
+
* @param index - The worker index, from `0` to {@link WorkerPoolComponent.size} minus one.
|
|
76
|
+
* @returns The worker.
|
|
77
|
+
*/
|
|
78
|
+
getWorker(index) {
|
|
79
|
+
const worker = this.workers[index];
|
|
80
|
+
if (!worker) {
|
|
81
|
+
throw new Error(`The worker pool has no worker at index ${String(index)}`);
|
|
82
|
+
}
|
|
83
|
+
return worker;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function getDefaultWorkerPoolSize(hardwareConcurrency) {
|
|
87
|
+
const processorCount = hardwareConcurrency ?? window.navigator.hardwareConcurrency;
|
|
88
|
+
return Math.max(1, Math.min(MAX_DEFAULT_WORKER_POOL_SIZE, processorCount - 1));
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
MAX_DEFAULT_WORKER_POOL_SIZE,
|
|
92
|
+
WorkerPoolComponent,
|
|
93
|
+
getDefaultWorkerPoolSize
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvd29ya2VyLXBvb2wtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSBjb21wb25lbnQgdGhhdCBvd25zIHNldmVyYWwgd29ya2VycyBidWlsdCBmcm9tIHRoZSBzYW1lIGJ1bmRsZWQgc291cmNlIGFuZCBzcHJlYWRzIGNhbGxzIG92ZXIgdGhlbS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFdvcmtlckFwaSxcbiAgV29ya2VyQXBpSGFuZGxlcnNcbn0gZnJvbSAnLi4vd29ya2VyLXByb3RvY29sLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgV29ya2VyQ29tcG9uZW50Q2FsbE9wdGlvbnMsXG4gIFdvcmtlck1ldGhvZCxcbiAgV29ya2VyTWV0aG9kUmVzdWx0XG59IGZyb20gJy4vd29ya2VyLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgV29ya2VyQ29tcG9uZW50IH0gZnJvbSAnLi93b3JrZXItY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBUaGUgbW9zdCB3b3JrZXJzIHtAbGluayBnZXREZWZhdWx0V29ya2VyUG9vbFNpemV9IHN1Z2dlc3RzLCBzbyBhIHBvb2wgb24gYSBtYW55LWNvcmUgZGVza3RvcCBkb2VzIG5vdCBzdGFydmVcbiAqIE9ic2lkaWFuJ3Mgb3duIHJlbmRlcmVyIG9mIG1lbW9yeS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9ERUZBVUxUX1dPUktFUl9QT09MX1NJWkUgPSA0O1xuXG4vKipcbiAqIE9wdGlvbnMgb2Yge0BsaW5rIFdvcmtlclBvb2xDb21wb25lbnQuY2FsbH06IHRoZSBzYW1lIGFzIHtAbGluayBXb3JrZXJDb21wb25lbnQuY2FsbH0ncy5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2VyUG9vbENvbXBvbmVudENhbGxPcHRpb25zID0gV29ya2VyQ29tcG9uZW50Q2FsbE9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBvZiB7QGxpbmsgV29ya2VyUG9vbENvbXBvbmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSBldmVyeSB3b3JrZXIgZXhwb3Nlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZXJQb29sQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8VEFwaSBleHRlbmRzIFdvcmtlckFwaTxUQXBpPj4ge1xuICAvKipcbiAgICogVGhlIGhhbmRsZXJzIHRvIHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQgd2hlbiBubyBgV29ya2VyYCBjYW4gYmUgY3JlYXRlZC4gU2VlIHtAbGluayBXb3JrZXJDb21wb25lbnR9LlxuICAgKi9cbiAgcmVhZG9ubHkgZmFsbGJhY2tIYW5kbGVycz86IFdvcmtlckFwaUhhbmRsZXJzPFRBcGk+O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2VycycgbmFtZSBwcmVmaXgsIHNob3duIGJ5IHRoZSBkZXZlbG9wZXIgdG9vbHM7IGVhY2ggd29ya2VyIGdldHMgYDxuYW1lPiA8aW5kZXg+YC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygd29ya2Vycy4gRGVmYXVsdHMgdG8ge0BsaW5rIGdldERlZmF1bHRXb3JrZXJQb29sU2l6ZX0uXG4gICAqL1xuICByZWFkb25seSBzaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVuZGxlZCB3b3JrZXIgc291cmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3ducyBhIGZpeGVkIG51bWJlciBvZiB7QGxpbmsgV29ya2VyQ29tcG9uZW50fSBjaGlsZHJlbiBhbmQgc2VuZHMgZWFjaCBjYWxsIHRvIHRoZSBvbmUgd2l0aCB0aGUgZmV3ZXN0IHBlbmRpbmcgY2FsbHMuXG4gKlxuICogVXNlIGl0IGZvciBDUFUtYm91bmQgam9icyB0aGF0IHNwbGl0IGludG8gaW5kZXBlbmRlbnQgY2FsbHMuIEEgam9iIHRoYXQga2VlcHMgc3RhdGUgaW4gYSB3b3JrZXIgKGEgbG9hZGVkIGNvcnB1cywgYW5cbiAqIGluc3RhbnRpYXRlZCBtb2R1bGUpIGFkZHJlc3NlcyBlYWNoIHdvcmtlciBieSBpbmRleCB0aHJvdWdoIHtAbGluayBXb3JrZXJQb29sQ29tcG9uZW50LmdldFdvcmtlcn0gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIGV2ZXJ5IHdvcmtlciBleHBvc2VzLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2VyUG9vbENvbXBvbmVudDxUQXBpIGV4dGVuZHMgV29ya2VyQXBpPFRBcGk+PiBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygd29ya2Vycy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNpemUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53b3JrZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgd29ya2VyczogV29ya2VyQ29tcG9uZW50PFRBcGk+W10gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcG9vbC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFdvcmtlclBvb2xDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxUQXBpPikge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3Qgc2l6ZSA9IHBhcmFtcy5zaXplID8/IGdldERlZmF1bHRXb3JrZXJQb29sU2l6ZSgpO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoc2l6ZSkgfHwgc2l6ZSA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSB3b3JrZXIgcG9vbCBuZWVkcyBhIHBvc2l0aXZlIGludGVnZXIgc2l6ZSwgbm90ICR7U3RyaW5nKHNpemUpfWApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykge1xuICAgICAgY29uc3Qgd29ya2VyUGFyYW1zID0ge1xuICAgICAgICBzb3VyY2U6IHBhcmFtcy5zb3VyY2UsXG4gICAgICAgIC4uLihwYXJhbXMuZmFsbGJhY2tIYW5kbGVycyAhPT0gdW5kZWZpbmVkICYmIHsgZmFsbGJhY2tIYW5kbGVyczogcGFyYW1zLmZhbGxiYWNrSGFuZGxlcnMgfSksXG4gICAgICAgIC4uLihwYXJhbXMubmFtZSAhPT0gdW5kZWZpbmVkICYmIHsgbmFtZTogYCR7cGFyYW1zLm5hbWV9ICR7U3RyaW5nKGluZGV4KX1gIH0pXG4gICAgICB9O1xuICAgICAgdGhpcy53b3JrZXJzLnB1c2godGhpcy5hZGRDaGlsZChuZXcgV29ya2VyQ29tcG9uZW50PFRBcGk+KHdvcmtlclBhcmFtcykpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gdGhlIGxlYXN0IGJ1c3kgd29ya2VyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRNZXRob2QgLSBUaGUgbWV0aG9kLlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gY2FsbEFyZ3VtZW50cyAtIFRoZSBtZXRob2QncyBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNhbGwgb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG1ldGhvZCdzIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYWxsPFRNZXRob2QgZXh0ZW5kcyBXb3JrZXJNZXRob2Q8VEFwaT4+KFxuICAgIG1ldGhvZDogVE1ldGhvZCxcbiAgICBjYWxsQXJndW1lbnRzOiBQYXJhbWV0ZXJzPFRBcGlbVE1ldGhvZF0+LFxuICAgIG9wdGlvbnM/OiBXb3JrZXJQb29sQ29tcG9uZW50Q2FsbE9wdGlvbnNcbiAgKTogUHJvbWlzZTxXb3JrZXJNZXRob2RSZXN1bHQ8VEFwaSwgVE1ldGhvZD4+IHtcbiAgICBsZXQgbGVhc3RCdXN5ID0gdGhpcy5nZXRXb3JrZXIoMCk7XG4gICAgZm9yIChjb25zdCB3b3JrZXIgb2YgdGhpcy53b3JrZXJzKSB7XG4gICAgICBpZiAod29ya2VyLnBlbmRpbmdDYWxsQ291bnQgPCBsZWFzdEJ1c3kucGVuZGluZ0NhbGxDb3VudCkge1xuICAgICAgICBsZWFzdEJ1c3kgPSB3b3JrZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBsZWFzdEJ1c3kuY2FsbChtZXRob2QsIGNhbGxBcmd1bWVudHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGV2ZXJ5IHdvcmtlciB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cywgZm9yIGluc3RhbmNlIHRvIGNvbmZpZ3VyZSB0aGVtIGFsbC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUTWV0aG9kIC0gVGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIGNhbGxBcmd1bWVudHMgLSBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBjbG9uZWQgZm9yIGVhY2ggd29ya2VyOyBub3RoaW5nIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBhbGwgb2YgdGhlbS5cbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gQ2FuY2VscyBldmVyeSBjYWxsLlxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0cywgaW4gd29ya2VyIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNhbGxBbGw8VE1ldGhvZCBleHRlbmRzIFdvcmtlck1ldGhvZDxUQXBpPj4oXG4gICAgbWV0aG9kOiBUTWV0aG9kLFxuICAgIGNhbGxBcmd1bWVudHM6IFBhcmFtZXRlcnM8VEFwaVtUTWV0aG9kXT4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbFxuICApOiBQcm9taXNlPFdvcmtlck1ldGhvZFJlc3VsdDxUQXBpLCBUTWV0aG9kPltdPiB7XG4gICAgY29uc3Qgb3B0aW9uczogV29ya2VyQ29tcG9uZW50Q2FsbE9wdGlvbnMgPSBhYm9ydFNpZ25hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGFib3J0U2lnbmFsIH07XG4gICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKHRoaXMud29ya2Vycy5tYXAoYXN5bmMgKHdvcmtlcikgPT4gYXdhaXQgd29ya2VyLmNhbGwobWV0aG9kLCBjYWxsQXJndW1lbnRzLCBvcHRpb25zKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb25lIHdvcmtlciwgZm9yIGpvYnMgdGhhdCBrZWVwIHN0YXRlIGluIGEgcGFydGljdWxhciB3b3JrZXIuXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCAtIFRoZSB3b3JrZXIgaW5kZXgsIGZyb20gYDBgIHRvIHtAbGluayBXb3JrZXJQb29sQ29tcG9uZW50LnNpemV9IG1pbnVzIG9uZS5cbiAgICogQHJldHVybnMgVGhlIHdvcmtlci5cbiAgICovXG4gIHB1YmxpYyBnZXRXb3JrZXIoaW5kZXg6IG51bWJlcik6IFdvcmtlckNvbXBvbmVudDxUQXBpPiB7XG4gICAgY29uc3Qgd29ya2VyID0gdGhpcy53b3JrZXJzW2luZGV4XTtcbiAgICBpZiAoIXdvcmtlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgd29ya2VyIHBvb2wgaGFzIG5vIHdvcmtlciBhdCBpbmRleCAke1N0cmluZyhpbmRleCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZXI7XG4gIH1cbn1cblxuLyoqXG4gKiBTdWdnZXN0cyBhIHBvb2wgc2l6ZTogb25lIGZld2VyIHRoYW4gdGhlIGxvZ2ljYWwgcHJvY2Vzc29ycywgc28gdGhlIG1haW4gdGhyZWFkIGtlZXBzIG9uZSwgYmV0d2VlbiBgMWAgYW5kXG4gKiB7QGxpbmsgTUFYX0RFRkFVTFRfV09SS0VSX1BPT0xfU0laRX0uXG4gKlxuICogQHBhcmFtIGhhcmR3YXJlQ29uY3VycmVuY3kgLSBUaGUgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycy4gRGVmYXVsdHMgdG8gYG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5YC5cbiAqIEByZXR1cm5zIFRoZSBzdWdnZXN0ZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRXb3JrZXJQb29sU2l6ZShoYXJkd2FyZUNvbmN1cnJlbmN5PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcHJvY2Vzc29yQ291bnQgPSBoYXJkd2FyZUNvbmN1cnJlbmN5ID8/IHdpbmRvdy5uYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeTtcbiAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGgubWluKE1BWF9ERUZBVUxUX1dPUktFUl9QT09MX1NJWkUsIHByb2Nlc3NvckNvdW50IC0gMSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFnQkEsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyx1QkFBdUI7QUFNekIsTUFBTSwrQkFBK0I7QUEwQ3JDLE1BQU0sNEJBQTBELFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFpQjFFLFlBQStCLFFBQW9EO0FBQ3hGLFVBQU07QUFEOEI7QUFFcEMsVUFBTSxPQUFPLE9BQU8sUUFBUSx5QkFBeUI7QUFDckQsUUFBSSxDQUFDLE9BQU8sY0FBYyxJQUFJLEtBQUssT0FBTyxHQUFHO0FBQzNDLFlBQU0sSUFBSSxNQUFNLG9EQUFvRCxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQUEsSUFDcEY7QUFDQSxhQUFTLFFBQVEsR0FBRyxRQUFRLE1BQU0sU0FBUztBQUN6QyxZQUFNLGVBQWU7QUFBQSxRQUNuQixRQUFRLE9BQU87QUFBQSxRQUNmLEdBQUksT0FBTyxxQkFBcUIsVUFBYSxFQUFFLGtCQUFrQixPQUFPLGlCQUFpQjtBQUFBLFFBQ3pGLEdBQUksT0FBTyxTQUFTLFVBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxJQUFJLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRztBQUFBLE1BQzdFO0FBQ0EsV0FBSyxRQUFRLEtBQUssS0FBSyxTQUFTLElBQUksZ0JBQXNCLFlBQVksQ0FBQyxDQUFDO0FBQUEsSUFDMUU7QUFBQSxFQUNGO0FBQUEsRUFkc0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFYdEMsSUFBVyxPQUFlO0FBQ3hCLFdBQU8sS0FBSyxRQUFRO0FBQUEsRUFDdEI7QUFBQSxFQUVpQixVQUFtQyxDQUFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFnQ3JELE1BQWEsS0FDWCxRQUNBLGVBQ0EsU0FDNEM7QUFDNUMsUUFBSSxZQUFZLEtBQUssVUFBVSxDQUFDO0FBQ2hDLGVBQVcsVUFBVSxLQUFLLFNBQVM7QUFDakMsVUFBSSxPQUFPLG1CQUFtQixVQUFVLGtCQUFrQjtBQUN4RCxvQkFBWTtBQUFBLE1BQ2Q7QUFBQSxJQUNGO0FBQ0EsV0FBTyxNQUFNLFVBQVUsS0FBSyxRQUFRLGVBQWUsT0FBTztBQUFBLEVBQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxNQUFhLFFBQ1gsUUFDQSxlQUNBLGFBQzhDO0FBQzlDLFVBQU0sVUFBc0MsZ0JBQWdCLFNBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWTtBQUMzRixXQUFPLE1BQU0sUUFBUSxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sV0FBVyxNQUFNLE9BQU8sS0FBSyxRQUFRLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFBQSxFQUNoSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sVUFBVSxPQUFzQztBQUNyRCxVQUFNLFNBQVMsS0FBSyxRQUFRLEtBQUs7QUFDakMsUUFBSSxDQUFDLFFBQVE7QUFDWCxZQUFNLElBQUksTUFBTSwwQ0FBMEMsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLElBQzNFO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVNPLFNBQVMseUJBQXlCLHFCQUFzQztBQUM3RSxRQUFNLGlCQUFpQix1QkFBdUIsT0FBTyxVQUFVO0FBQy9ELFNBQU8sS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLDhCQUE4QixpQkFBaUIsQ0FBQyxDQUFDO0FBQy9FOyIsCiAgIm5hbWVzIjogW10KfQo=
|