taon 18.0.34 → 19.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 +175 -175
- package/assets/shared/shared_folder_info.txt +1 -1
- package/bin/start.js +279 -279
- package/bin/taon +6 -6
- package/bin/taon-debug +5 -5
- package/bin/taon-debug-brk +5 -5
- package/browser/README.md +24 -24
- package/browser/fesm2022/taon.mjs +68 -85
- package/browser/fesm2022/taon.mjs.map +1 -1
- package/browser/lib/base-classes/base-context.d.ts +6 -6
- package/browser/lib/base-classes/base.d.ts +6 -6
- package/browser/lib/index.d.ts +6 -32
- package/browser/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
- package/browser/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
- package/cli.js.map +1 -1
- package/client/README.md +24 -24
- package/client/fesm2022/taon.mjs +68 -85
- package/client/fesm2022/taon.mjs.map +1 -1
- package/client/lib/base-classes/base-context.d.ts +6 -6
- package/client/lib/base-classes/base.d.ts +6 -6
- package/client/lib/index.d.ts +6 -32
- package/client/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
- package/client/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
- package/index.js.map +1 -1
- package/lib/base-classes/base-abstract-entity.js.map +1 -1
- package/lib/base-classes/base-class.js.map +1 -1
- package/lib/base-classes/base-context.d.ts +6 -6
- package/lib/base-classes/base-context.js.map +1 -1
- package/lib/base-classes/base-controller.js.map +1 -1
- package/lib/base-classes/base-crud-controller.js.map +1 -1
- package/lib/base-classes/base-entity.js.map +1 -1
- package/lib/base-classes/base-injector.js.map +1 -1
- package/lib/base-classes/base-migration.js.map +1 -1
- package/lib/base-classes/base-provider.js.map +1 -1
- package/lib/base-classes/base-repository.js.map +1 -1
- package/lib/base-classes/base-subscriber-for-entity.js.map +1 -1
- package/lib/base-classes/base-subscriber.d.ts +4 -0
- package/lib/base-classes/base-subscriber.js +25 -0
- package/lib/base-classes/base-subscriber.js.map +1 -0
- package/lib/base-classes/base.d.ts +6 -6
- package/lib/base-classes/base.js.map +1 -1
- package/lib/build-info._auto-generated_.js.map +1 -1
- package/lib/constants.js.map +1 -1
- package/lib/context-db-migrations.js.map +1 -1
- package/lib/create-context.js.map +1 -1
- package/lib/decorators/classes/controller-decorator.js.map +1 -1
- package/lib/decorators/classes/entity-decorator.js.map +1 -1
- package/lib/decorators/classes/migration-decorator.js.map +1 -1
- package/lib/decorators/classes/provider-decorator.js.map +1 -1
- package/lib/decorators/classes/repository-decorator.js.map +1 -1
- package/lib/decorators/classes/subscriber-decorator.js.map +1 -1
- package/lib/decorators/http/http-decorators.js.map +1 -1
- package/lib/decorators/http/http-methods-decorators.js.map +1 -1
- package/lib/decorators/http/http-params-decorators.js.map +1 -1
- package/lib/dependency-injection/di-container.js.map +1 -1
- package/lib/endpoint-context.js.map +1 -1
- package/lib/entity-process.js.map +1 -1
- package/lib/env.js.map +1 -1
- package/lib/formly/formly-group-wrapper-component.js +1 -0
- package/lib/formly/formly-group-wrapper-component.js.map +1 -1
- package/lib/formly/formly-repeat-component.js +1 -0
- package/lib/formly/formly-repeat-component.js.map +1 -1
- package/lib/formly/formly.models.js.map +1 -1
- package/lib/formly/fromly.js.map +1 -1
- package/lib/formly/type-from-entity.js.map +1 -1
- package/lib/get-response-value.js.map +1 -1
- package/lib/helpers/class-helpers.js +2 -2
- package/lib/helpers/class-helpers.js.map +1 -1
- package/lib/helpers/taon-helpers.js.map +1 -1
- package/lib/index._auto-generated_.js.map +1 -1
- package/lib/index.d.ts +6 -32
- package/lib/index.js.map +1 -1
- package/lib/inject.js.map +1 -1
- package/lib/models.js.map +1 -1
- package/lib/orm.js.map +1 -1
- package/lib/realtime/realtime-client.js.map +1 -1
- package/lib/realtime/realtime-core.js.map +1 -1
- package/lib/realtime/realtime-server.js.map +1 -1
- package/lib/realtime/realtime-strategy/index.js.map +1 -1
- package/lib/realtime/realtime-strategy/realtime-abstract-mock.d.ts +10 -0
- package/lib/realtime/realtime-strategy/realtime-abstract-mock.js +214 -0
- package/lib/realtime/realtime-strategy/realtime-abstract-mock.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.d.ts +0 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.js +5 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/index.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.d.ts +22 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.js +139 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-namespace.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.d.ts +16 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.js +68 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-main-wrapper.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.d.ts +10 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.js +56 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-namespace.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.d.ts +10 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.js +50 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc-renderer-wrapper.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.d.ts +13 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.js +3 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc-models/realtime-strategy-ipc.models.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-ipc.js.map +1 -1
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.d.ts +2 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.js +6 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/index.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.d.ts +16 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.js +54 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-client.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.d.ts +17 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.js +52 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-namespaces.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.d.ts +11 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.js +39 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-server.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.d.ts +13 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.js +46 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock-socket.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.d.ts +11 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.js +3 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock-models/realtime-strategy-mock.models.js.map +1 -0
- package/lib/realtime/realtime-strategy/realtime-strategy-mock.js.map +1 -1
- package/lib/realtime/realtime-strategy/realtime-strategy-socket-io.js.map +1 -1
- package/lib/realtime/realtime-strategy/realtime-strategy.js.map +1 -1
- package/lib/realtime/realtime-subs-manager.js.map +1 -1
- package/lib/realtime/realtime.models.js.map +1 -1
- package/lib/storage.js.map +1 -1
- package/lib/symbols.js.map +1 -1
- package/lib/ui/directives/firedev-inject-html.directive.d.ts +6 -0
- package/lib/ui/directives/firedev-long-press.directive.d.ts +22 -0
- package/lib/ui/directives/index.js +2 -2
- package/lib/ui/directives/index.js.map +1 -1
- package/lib/ui/directives/view-mode.js.map +1 -1
- package/lib/ui/index.js +2 -2
- package/lib/ui/index.js.map +1 -1
- package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.d.ts +2 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.js +5 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/index.js.map +1 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/taon-admin-edit-mode.component.d.ts +29 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-admin-edit-mode/taon-admin-edit-mode.module.d.ts +2 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.d.ts +1 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.js +5 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/index.js.map +1 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-db-admin/taon-db-admin.component.d.ts +8 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.d.ts +2 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.js +5 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/index.js.map +1 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/taon-file-general-opt.component.d.ts +13 -0
- package/lib/ui/taon-admin-mode-configuration/components/taon-file-general-opt/taon-file-general-opt.module.d.ts +2 -0
- package/lib/ui/taon-admin-mode-configuration/index.js +2 -2
- package/lib/ui/taon-admin-mode-configuration/index.js.map +1 -1
- package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.d.ts +5 -0
- package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.js +3 -0
- package/lib/ui/taon-admin-mode-configuration/models/taon-admin-mode-tabs.js.map +1 -0
- package/lib/ui/taon-admin-mode-configuration/taon-admin-control.service.d.ts +14 -0
- package/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.module.d.ts +2 -0
- package/lib/ui/taon-admin-mode-configuration/taon-admin.models.js.map +1 -1
- package/lib/ui/taon-github-fork-me-corner/index.js +2 -2
- package/lib/ui/taon-github-fork-me-corner/index.js.map +1 -1
- package/lib/ui/taon-github-fork-me-ribbon/index.js +2 -2
- package/lib/ui/taon-github-fork-me-ribbon/index.js.map +1 -1
- package/lib/ui/taon-notifications/index.js.map +1 -1
- package/lib/ui/taon-notifications/taon-notifications.models.js +2 -2
- package/lib/ui/taon-notifications/taon-notifications.models.js.map +1 -1
- package/lib/ui/taon-progress-bar/index.js +2 -2
- package/lib/ui/taon-progress-bar/index.js.map +1 -1
- package/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
- package/lib/ui/taon-session-passcode/index.js +2 -2
- package/lib/ui/taon-session-passcode/index.js.map +1 -1
- package/lib/ui/taon-table/index.js +2 -2
- package/lib/ui/taon-table/index.js.map +1 -1
- package/lib/ui/taon.models.js.map +1 -1
- package/lib/ui/toan-full-material.module.d.ts +2 -0
- package/lib/validators.js.map +1 -1
- package/migrations/index.js.map +1 -1
- package/migrations/migrations_index._auto-generated_.js.map +1 -1
- package/old-app .js +1 -0
- package/old-app .js.map +1 -1
- package/package.json +3 -3
- package/playground.js.map +1 -1
- package/taon.jsonc +39 -39
- package/tmp-environment.json +3 -3
- package/websql/README.md +24 -24
- package/websql/fesm2022/taon.mjs +68 -85
- package/websql/fesm2022/taon.mjs.map +1 -1
- package/websql/lib/base-classes/base-context.d.ts +6 -6
- package/websql/lib/base-classes/base.d.ts +6 -6
- package/websql/lib/index.d.ts +6 -32
- package/websql/lib/ui/taon-progress-bar/taon-progress-bar.component.d.ts +1 -3
- package/websql/lib/ui/taon-progress-bar/taon-progress-bar.module.d.ts +1 -2
- package/browser/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -18
- package/browser/esm2022/lib/base-classes/base-class.mjs +0 -17
- package/browser/esm2022/lib/base-classes/base-context.mjs +0 -14
- package/browser/esm2022/lib/base-classes/base-controller.mjs +0 -19
- package/browser/esm2022/lib/base-classes/base-crud-controller.mjs +0 -279
- package/browser/esm2022/lib/base-classes/base-entity.mjs +0 -18
- package/browser/esm2022/lib/base-classes/base-injector.mjs +0 -167
- package/browser/esm2022/lib/base-classes/base-migration.mjs +0 -23
- package/browser/esm2022/lib/base-classes/base-provider.mjs +0 -6
- package/browser/esm2022/lib/base-classes/base-repository.mjs +0 -514
- package/browser/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
- package/browser/esm2022/lib/base-classes/base.mjs +0 -26
- package/browser/esm2022/lib/constants.mjs +0 -4
- package/browser/esm2022/lib/context-db-migrations.mjs +0 -425
- package/browser/esm2022/lib/create-context.mjs +0 -127
- package/browser/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
- package/browser/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -30
- package/browser/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
- package/browser/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
- package/browser/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
- package/browser/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
- package/browser/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
- package/browser/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
- package/browser/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
- package/browser/esm2022/lib/dependency-injection/di-container.mjs +0 -32
- package/browser/esm2022/lib/endpoint-context.mjs +0 -1705
- package/browser/esm2022/lib/entity-process.mjs +0 -198
- package/browser/esm2022/lib/env.mjs +0 -6
- package/browser/esm2022/lib/get-response-value.mjs +0 -27
- package/browser/esm2022/lib/helpers/class-helpers.mjs +0 -183
- package/browser/esm2022/lib/helpers/taon-helpers.mjs +0 -120
- package/browser/esm2022/lib/index.mjs +0 -70
- package/browser/esm2022/lib/inject.mjs +0 -36
- package/browser/esm2022/lib/models.mjs +0 -106
- package/browser/esm2022/lib/orm.mjs +0 -6
- package/browser/esm2022/lib/realtime/realtime-client.mjs +0 -141
- package/browser/esm2022/lib/realtime/realtime-core.mjs +0 -62
- package/browser/esm2022/lib/realtime/realtime-server.mjs +0 -292
- package/browser/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
- package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
- package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
- package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
- package/browser/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
- package/browser/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
- package/browser/esm2022/lib/realtime/realtime.models.mjs +0 -4
- package/browser/esm2022/lib/storage.mjs +0 -5
- package/browser/esm2022/lib/symbols.mjs +0 -97
- package/browser/esm2022/lib/ui/directives/index.mjs +0 -6
- package/browser/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
- package/browser/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
- package/browser/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
- package/browser/esm2022/lib/ui/index.mjs +0 -12
- package/browser/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
- package/browser/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
- package/browser/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
- package/browser/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
- package/browser/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
- package/browser/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
- package/browser/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
- package/browser/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
- package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
- package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
- package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
- package/browser/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
- package/browser/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
- package/browser/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -98
- package/browser/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
- package/browser/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
- package/browser/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
- package/browser/esm2022/lib/ui/taon-table/index.mjs +0 -5
- package/browser/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
- package/browser/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
- package/browser/esm2022/lib/validators.mjs +0 -76
- package/browser/esm2022/public-api.mjs +0 -2
- package/browser/esm2022/taon.mjs +0 -5
- package/client/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -18
- package/client/esm2022/lib/base-classes/base-class.mjs +0 -17
- package/client/esm2022/lib/base-classes/base-context.mjs +0 -14
- package/client/esm2022/lib/base-classes/base-controller.mjs +0 -19
- package/client/esm2022/lib/base-classes/base-crud-controller.mjs +0 -279
- package/client/esm2022/lib/base-classes/base-entity.mjs +0 -18
- package/client/esm2022/lib/base-classes/base-injector.mjs +0 -167
- package/client/esm2022/lib/base-classes/base-migration.mjs +0 -23
- package/client/esm2022/lib/base-classes/base-provider.mjs +0 -6
- package/client/esm2022/lib/base-classes/base-repository.mjs +0 -514
- package/client/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
- package/client/esm2022/lib/base-classes/base.mjs +0 -26
- package/client/esm2022/lib/constants.mjs +0 -4
- package/client/esm2022/lib/context-db-migrations.mjs +0 -425
- package/client/esm2022/lib/create-context.mjs +0 -127
- package/client/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
- package/client/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -30
- package/client/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
- package/client/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
- package/client/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
- package/client/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
- package/client/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
- package/client/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
- package/client/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
- package/client/esm2022/lib/dependency-injection/di-container.mjs +0 -32
- package/client/esm2022/lib/endpoint-context.mjs +0 -1705
- package/client/esm2022/lib/entity-process.mjs +0 -198
- package/client/esm2022/lib/env.mjs +0 -6
- package/client/esm2022/lib/get-response-value.mjs +0 -27
- package/client/esm2022/lib/helpers/class-helpers.mjs +0 -183
- package/client/esm2022/lib/helpers/taon-helpers.mjs +0 -120
- package/client/esm2022/lib/index.mjs +0 -70
- package/client/esm2022/lib/inject.mjs +0 -36
- package/client/esm2022/lib/models.mjs +0 -106
- package/client/esm2022/lib/orm.mjs +0 -6
- package/client/esm2022/lib/realtime/realtime-client.mjs +0 -141
- package/client/esm2022/lib/realtime/realtime-core.mjs +0 -62
- package/client/esm2022/lib/realtime/realtime-server.mjs +0 -292
- package/client/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
- package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
- package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
- package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
- package/client/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
- package/client/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
- package/client/esm2022/lib/realtime/realtime.models.mjs +0 -4
- package/client/esm2022/lib/storage.mjs +0 -5
- package/client/esm2022/lib/symbols.mjs +0 -97
- package/client/esm2022/lib/ui/directives/index.mjs +0 -6
- package/client/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
- package/client/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
- package/client/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
- package/client/esm2022/lib/ui/index.mjs +0 -12
- package/client/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
- package/client/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
- package/client/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
- package/client/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
- package/client/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
- package/client/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
- package/client/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
- package/client/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
- package/client/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
- package/client/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
- package/client/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
- package/client/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
- package/client/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
- package/client/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -98
- package/client/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
- package/client/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
- package/client/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
- package/client/esm2022/lib/ui/taon-table/index.mjs +0 -5
- package/client/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
- package/client/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
- package/client/esm2022/lib/validators.mjs +0 -76
- package/client/esm2022/public-api.mjs +0 -2
- package/client/esm2022/taon.mjs +0 -5
- package/websql/esm2022/lib/base-classes/base-abstract-entity.mjs +0 -25
- package/websql/esm2022/lib/base-classes/base-class.mjs +0 -17
- package/websql/esm2022/lib/base-classes/base-context.mjs +0 -14
- package/websql/esm2022/lib/base-classes/base-controller.mjs +0 -19
- package/websql/esm2022/lib/base-classes/base-crud-controller.mjs +0 -238
- package/websql/esm2022/lib/base-classes/base-entity.mjs +0 -16
- package/websql/esm2022/lib/base-classes/base-injector.mjs +0 -167
- package/websql/esm2022/lib/base-classes/base-migration.mjs +0 -23
- package/websql/esm2022/lib/base-classes/base-provider.mjs +0 -6
- package/websql/esm2022/lib/base-classes/base-repository.mjs +0 -431
- package/websql/esm2022/lib/base-classes/base-subscriber-for-entity.mjs +0 -156
- package/websql/esm2022/lib/base-classes/base.mjs +0 -26
- package/websql/esm2022/lib/constants.mjs +0 -4
- package/websql/esm2022/lib/context-db-migrations.mjs +0 -274
- package/websql/esm2022/lib/create-context.mjs +0 -126
- package/websql/esm2022/lib/decorators/classes/controller-decorator.mjs +0 -18
- package/websql/esm2022/lib/decorators/classes/entity-decorator.mjs +0 -28
- package/websql/esm2022/lib/decorators/classes/migration-decorator.mjs +0 -18
- package/websql/esm2022/lib/decorators/classes/provider-decorator.mjs +0 -18
- package/websql/esm2022/lib/decorators/classes/repository-decorator.mjs +0 -18
- package/websql/esm2022/lib/decorators/classes/subscriber-decorator.mjs +0 -18
- package/websql/esm2022/lib/decorators/http/http-decorators.mjs +0 -24
- package/websql/esm2022/lib/decorators/http/http-methods-decorators.mjs +0 -78
- package/websql/esm2022/lib/decorators/http/http-params-decorators.mjs +0 -47
- package/websql/esm2022/lib/dependency-injection/di-container.mjs +0 -32
- package/websql/esm2022/lib/endpoint-context.mjs +0 -1586
- package/websql/esm2022/lib/entity-process.mjs +0 -198
- package/websql/esm2022/lib/env.mjs +0 -6
- package/websql/esm2022/lib/get-response-value.mjs +0 -25
- package/websql/esm2022/lib/helpers/class-helpers.mjs +0 -183
- package/websql/esm2022/lib/helpers/taon-helpers.mjs +0 -120
- package/websql/esm2022/lib/index.mjs +0 -72
- package/websql/esm2022/lib/inject.mjs +0 -36
- package/websql/esm2022/lib/models.mjs +0 -97
- package/websql/esm2022/lib/orm.mjs +0 -65
- package/websql/esm2022/lib/realtime/realtime-client.mjs +0 -141
- package/websql/esm2022/lib/realtime/realtime-core.mjs +0 -62
- package/websql/esm2022/lib/realtime/realtime-server.mjs +0 -176
- package/websql/esm2022/lib/realtime/realtime-strategy/index.mjs +0 -7
- package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-ipc.mjs +0 -218
- package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-mock.mjs +0 -224
- package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy-socket-io.mjs +0 -29
- package/websql/esm2022/lib/realtime/realtime-strategy/realtime-strategy.mjs +0 -14
- package/websql/esm2022/lib/realtime/realtime-subs-manager.mjs +0 -81
- package/websql/esm2022/lib/realtime/realtime.models.mjs +0 -4
- package/websql/esm2022/lib/storage.mjs +0 -5
- package/websql/esm2022/lib/symbols.mjs +0 -97
- package/websql/esm2022/lib/ui/directives/index.mjs +0 -6
- package/websql/esm2022/lib/ui/directives/safe.pipe.mjs +0 -43
- package/websql/esm2022/lib/ui/directives/taon-inject-html.directive.mjs +0 -24
- package/websql/esm2022/lib/ui/directives/taon-long-press.directive.mjs +0 -120
- package/websql/esm2022/lib/ui/index.mjs +0 -12
- package/websql/esm2022/lib/ui/taon-admin-mode-configuration/index.mjs +0 -4
- package/websql/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin-mode-configuration.component.mjs +0 -194
- package/websql/esm2022/lib/ui/taon-admin-mode-configuration/taon-admin.service.mjs +0 -55
- package/websql/esm2022/lib/ui/taon-full-material.module.mjs +0 -179
- package/websql/esm2022/lib/ui/taon-github-fork-me-corner/index.mjs +0 -5
- package/websql/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.component.mjs +0 -18
- package/websql/esm2022/lib/ui/taon-github-fork-me-corner/taon-github-fork-me-corner.module.mjs +0 -21
- package/websql/esm2022/lib/ui/taon-notifications/index.mjs +0 -7
- package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.component.mjs +0 -25
- package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.models.mjs +0 -5
- package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.module.mjs +0 -21
- package/websql/esm2022/lib/ui/taon-notifications/taon-notifications.service.mjs +0 -48
- package/websql/esm2022/lib/ui/taon-progress-bar/index.mjs +0 -5
- package/websql/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.component.mjs +0 -50
- package/websql/esm2022/lib/ui/taon-progress-bar/taon-progress-bar.module.mjs +0 -22
- package/websql/esm2022/lib/ui/taon-session-passcode/index.mjs +0 -4
- package/websql/esm2022/lib/ui/taon-session-passcode/taon-session-passcode.component.mjs +0 -120
- package/websql/esm2022/lib/ui/taon-table/index.mjs +0 -5
- package/websql/esm2022/lib/ui/taon-table/taon-table.component.mjs +0 -160
- package/websql/esm2022/lib/ui/taon-table/taon-table.module.mjs +0 -57
- package/websql/esm2022/lib/validators.mjs +0 -76
- package/websql/esm2022/public-api.mjs +0 -2
- package/websql/esm2022/taon.mjs +0 -5
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { Symbols } from '../symbols';
|
|
2
|
-
import { Helpers, _ } from 'tnp-core/websql';
|
|
3
|
-
import { ClassHelpers } from '../helpers/class-helpers';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
export class RealtimeServer {
|
|
6
|
-
constructor(core) {
|
|
7
|
-
this.core = core;
|
|
8
|
-
this.core = core;
|
|
9
|
-
if (!core.ctx.disabledRealtime) {
|
|
10
|
-
this.init();
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
init() {
|
|
14
|
-
if (!this.core.ctx.config.frontendHost) {
|
|
15
|
-
console.warn(`[Taon][Realtime]
|
|
16
|
-
|
|
17
|
-
Frontend host is not defined
|
|
18
|
-
REALTIME COMMUNICATION WILL NOT WORK
|
|
19
|
-
|
|
20
|
-
provide "frontendHost" property in your taon config
|
|
21
|
-
|
|
22
|
-
`);
|
|
23
|
-
}
|
|
24
|
-
const nspPath = {
|
|
25
|
-
global: this.core.pathFor(),
|
|
26
|
-
realtime: this.core.pathFor(Symbols.REALTIME.NAMESPACE(this.core.ctx.contextName)),
|
|
27
|
-
};
|
|
28
|
-
this.core.connectSocketBE = this.core.strategy.ioServer(Helpers.isWebSQL ? this.core.ctx.uri.origin : this.core.ctx.serverTcpUdp, {
|
|
29
|
-
path: nspPath.global.pathname,
|
|
30
|
-
cors: {
|
|
31
|
-
origin: this.core.ctx.config.frontendHost,
|
|
32
|
-
methods: this.core.allHttpMethods,
|
|
33
|
-
},
|
|
34
|
-
}, // @ts-ignore
|
|
35
|
-
this.core.ctx);
|
|
36
|
-
this.core.ctx.logRealtime &&
|
|
37
|
-
console.info(`[backend] CREATE GLOBAL NAMESPACE: '${this.core.connectSocketBE.path()}'` +
|
|
38
|
-
` , path: '${nspPath.global.pathname}'`);
|
|
39
|
-
this.core.connectSocketBE.on('connection', clientSocket => {
|
|
40
|
-
console.info(`[backend] client connected to namespace "${nspPath.global.pathname}", ` +
|
|
41
|
-
` host: ${this.core.ctx.host}`);
|
|
42
|
-
});
|
|
43
|
-
this.core.socketBE = this.core.strategy.ioServer(Helpers.isWebSQL || Helpers.isElectron
|
|
44
|
-
? this.core.ctx.uri.origin
|
|
45
|
-
: this.core.ctx.serverTcpUdp, {
|
|
46
|
-
path: nspPath.realtime.pathname,
|
|
47
|
-
cors: {
|
|
48
|
-
origin: this.core.ctx.config.frontendHost,
|
|
49
|
-
methods: this.core.allHttpMethods,
|
|
50
|
-
},
|
|
51
|
-
}, // @ts-ignore
|
|
52
|
-
this.core.ctx);
|
|
53
|
-
this.core.ctx.logRealtime &&
|
|
54
|
-
console.info(`[backend] CREATE REALTIME NAMESPACE: '${this.core.socketBE.path()}'` +
|
|
55
|
-
` , path: '${nspPath.realtime.pathname}' `);
|
|
56
|
-
this.core.socketBE.on('connection', backendSocketForClient => {
|
|
57
|
-
console.info(`[backend] client connected to namespace "${nspPath.realtime.pathname}", ` +
|
|
58
|
-
` host: ${this.core.ctx.host}`);
|
|
59
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_SUBSCRIBE_CUSTOM(this.core.ctx.contextName), roomName => {
|
|
60
|
-
this.core.ctx.logRealtime &&
|
|
61
|
-
console.info(`Joining room ${roomName} in namespace REALTIME` +
|
|
62
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
63
|
-
backendSocketForClient.join(roomName);
|
|
64
|
-
});
|
|
65
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_SUBSCRIBE_ENTITY_UPDATE_EVENTS(this.core.ctx.contextName), roomName => {
|
|
66
|
-
this.core.ctx.logRealtime &&
|
|
67
|
-
console.info(`[backend] Joining room ${roomName} in namespace REALTIME` +
|
|
68
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
69
|
-
backendSocketForClient.join(roomName);
|
|
70
|
-
});
|
|
71
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_SUBSCRIBE_ENTITY_PROPERTY_UPDATE_EVENTS(this.core.ctx.contextName), roomName => {
|
|
72
|
-
this.core.ctx.logRealtime &&
|
|
73
|
-
console.info(`[backend] Joining room ${roomName} in namespace REALTIME ` +
|
|
74
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
75
|
-
backendSocketForClient.join(roomName);
|
|
76
|
-
});
|
|
77
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_UNSUBSCRIBE_CUSTOM(this.core.ctx.contextName), roomName => {
|
|
78
|
-
this.core.ctx.logRealtime &&
|
|
79
|
-
console.info(`[backend] Leaving room ${roomName} in namespace REALTIME` +
|
|
80
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
81
|
-
backendSocketForClient.leave(roomName);
|
|
82
|
-
});
|
|
83
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_UNSUBSCRIBE_ENTITY_UPDATE_EVENTS(this.core.ctx.contextName), roomName => {
|
|
84
|
-
this.core.ctx.logRealtime &&
|
|
85
|
-
console.info(`[backend] Leaving room ${roomName} in namespace REALTIME ` +
|
|
86
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
87
|
-
backendSocketForClient.leave(roomName);
|
|
88
|
-
});
|
|
89
|
-
backendSocketForClient.on(Symbols.REALTIME.ROOM_UNSUBSCRIBE_ENTITY_PROPERTY_UPDATE_EVENTS(this.core.ctx.contextName), roomName => {
|
|
90
|
-
this.core.ctx.logRealtime &&
|
|
91
|
-
console.info(`[backend] Leaving room ${roomName} in namespace REALTIME ` +
|
|
92
|
-
` host: ${this.core.ctx.contextName}/${this.core.ctx.host}`);
|
|
93
|
-
backendSocketForClient.leave(roomName);
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
triggerChanges(entityObjOrClass, property, valueOfUniqueProperty, customEvent, customEventData) {
|
|
98
|
-
let roomName;
|
|
99
|
-
if (this.core.ctx.disabledRealtime) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
if (customEvent) {
|
|
103
|
-
roomName = Symbols.REALTIME.ROOM_NAME_CUSTOM(this.core.ctx.contextName, customEvent);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
let entityFn = entityObjOrClass;
|
|
107
|
-
const entityIsObject = !_.isFunction(entityObjOrClass) && _.isObject(entityObjOrClass);
|
|
108
|
-
if (entityIsObject) {
|
|
109
|
-
entityFn = ClassHelpers.getClassFnFromObject(entityObjOrClass);
|
|
110
|
-
}
|
|
111
|
-
const uniqueKey = ClassHelpers.getUniqueKey(entityFn);
|
|
112
|
-
if (entityIsObject) {
|
|
113
|
-
valueOfUniqueProperty = entityObjOrClass[uniqueKey];
|
|
114
|
-
}
|
|
115
|
-
if (!valueOfUniqueProperty) {
|
|
116
|
-
Helpers.error(`[Taon][Realtime] Entity without iD ! ${ClassHelpers.getName(entityFn)} `, true, true);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
roomName = _.isString(property)
|
|
120
|
-
? Symbols.REALTIME.ROOM_NAME_UPDATE_ENTITY_PROPERTY(this.core.ctx.contextName, ClassHelpers.getName(entityFn), property, valueOfUniqueProperty)
|
|
121
|
-
: Symbols.REALTIME.ROOM_NAME_UPDATE_ENTITY(this.core.ctx.contextName, ClassHelpers.getName(entityFn), valueOfUniqueProperty);
|
|
122
|
-
}
|
|
123
|
-
this.core.socketBE.in(roomName).emit(roomName, // roomName == eventName in room na
|
|
124
|
-
customEvent ? customEventData : '');
|
|
125
|
-
}
|
|
126
|
-
triggerEntityChanges(entityObjOrClass, idToTrigger) {
|
|
127
|
-
if (this.core.ctx.disabledRealtime) {
|
|
128
|
-
const className = ClassHelpers.getName(entityObjOrClass);
|
|
129
|
-
console.warn(`[Taon][TriggerEntityChanges] Entity "${className}' is not realtime`);
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
this.triggerChanges(entityObjOrClass, void 0, idToTrigger);
|
|
133
|
-
}
|
|
134
|
-
triggerEntityPropertyChanges(entityObjOrClass, property, idToTrigger) {
|
|
135
|
-
if (this.core.ctx.disabledRealtime) {
|
|
136
|
-
const className = ClassHelpers.getName(entityObjOrClass);
|
|
137
|
-
console.warn(`[Taon][TriggerEntityPropertyChanges][property=${property}] Entity "${className}' is not realtime`);
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (_.isArray(property)) {
|
|
141
|
-
property.forEach(propertyFromArr => {
|
|
142
|
-
this.triggerChanges(entityObjOrClass, propertyFromArr, idToTrigger);
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
this.triggerChanges(entityObjOrClass, property, idToTrigger);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
triggerEntityTableChanges(entityClassOrInstance) {
|
|
150
|
-
const className = ClassHelpers.getName(entityClassOrInstance);
|
|
151
|
-
if (this.core.ctx.disabledRealtime) {
|
|
152
|
-
console.warn(`[Taon][TriggerEntityTableChanges] Entity "${className}' is not realtime`);
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
this.triggerChanges(entityClassOrInstance, void 0, void 0, Symbols.REALTIME.TABLE_CHANGE(this.core.ctx.contextName, className));
|
|
156
|
-
}
|
|
157
|
-
triggerCustomEvent(customEvent, dataToPush) {
|
|
158
|
-
this.triggerChanges(void 0, void 0, void 0, customEvent, dataToPush);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Listen to custom events from users
|
|
162
|
-
* @param customEvent global event name
|
|
163
|
-
*/
|
|
164
|
-
listenChangesCustomEvent(customEvent) {
|
|
165
|
-
const sub = new Subject();
|
|
166
|
-
this.core.socketBE.on('connection', backendSocketForClient => {
|
|
167
|
-
backendSocketForClient.on(customEvent, (data, ...args) => {
|
|
168
|
-
sub.next(data);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
return sub.asObservable();
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
;
|
|
175
|
-
({}); // @--end-of-file-for-module=taon lib/realtime/realtime-server.ts
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbHRpbWUtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3Rhb24vcHJvamVjdHMvdGFvbi9zcmMvbGliL3JlYWx0aW1lL3JlYWx0aW1lLXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXhELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHM0MsTUFBTSxPQUFPLGNBQWM7SUFFekIsWUFBb0IsSUFBa0I7UUFBbEIsU0FBSSxHQUFKLElBQUksQ0FBYztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRS9CLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVkLENBQUM7SUFDSCxDQUFDO0lBR08sSUFBSTtRQUdWLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQzs7Ozs7OztPQU9aLENBQUMsQ0FBQztRQUNMLENBQUM7UUFHRCxNQUFNLE9BQU8sR0FBRztZQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMzQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUN0RDtTQUNG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MUUsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FDakIscUJBQTRCLEVBQzVCLEtBQUssQ0FBQyxFQUNOLEtBQUssQ0FBQyxFQUNOLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FDcEUsQ0FBQztJQUNKLENBQUM7SUFRTSxrQkFBa0IsQ0FBQyxXQUFtQixFQUFFLFVBQWU7UUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUlEOzs7T0FHRztJQUNILHdCQUF3QixDQUFDLFdBQW1CO1FBRTFDLE1BQU0sR0FBRyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxFQUFFO1lBQzNELHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRTtnQkFDdkQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFNUIsQ0FBQztDQUlGO0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxpRUFBaUUiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuXG5pbXBvcnQgeyBTeW1ib2xzIH0gZnJvbSAnLi4vc3ltYm9scyc7XG5pbXBvcnQgeyBIZWxwZXJzLCBfIH0gZnJvbSAndG5wLWNvcmUvd2Vic3FsJztcbmltcG9ydCB7IFJlYWx0aW1lQ29yZSB9IGZyb20gJy4vcmVhbHRpbWUtY29yZSc7XG5pbXBvcnQgeyBDbGFzc0hlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzL2NsYXNzLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRW50aXR5IH0gZnJvbSAnLi4vYmFzZS1jbGFzc2VzL2Jhc2UtZW50aXR5JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVTZXJ2ZXIge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29yZTogUmVhbHRpbWVDb3JlKSB7XG4gICAgdGhpcy5jb3JlID0gY29yZTtcbiAgICBpZiAoIWNvcmUuY3R4LmRpc2FibGVkUmVhbHRpbWUpIHtcblxuICAgICAgdGhpcy5pbml0KCk7XG5cbiAgICB9XG4gIH1cblxuXG4gIHByaXZhdGUgaW5pdCgpIHtcblxuXG4gICAgaWYgKCF0aGlzLmNvcmUuY3R4LmNvbmZpZy5mcm9udGVuZEhvc3QpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1Rhb25dW1JlYWx0aW1lXVxuXG4gICAgICBGcm9udGVuZCBob3N0IGlzIG5vdCBkZWZpbmVkXG4gICAgICBSRUFMVElNRSBDT01NVU5JQ0FUSU9OIFdJTEwgTk9UIFdPUktcblxuICAgICAgcHJvdmlkZSBcImZyb250ZW5kSG9zdFwiIHByb3BlcnR5IGluIHlvdXIgdGFvbiBjb25maWdcblxuICAgICAgYCk7XG4gICAgfVxuXG5cbiAgICBjb25zdCBuc3BQYXRoID0ge1xuICAgICAgZ2xvYmFsOiB0aGlzLmNvcmUucGF0aEZvcigpLFxuICAgICAgcmVhbHRpbWU6IHRoaXMuY29yZS5wYXRoRm9yKFxuICAgICAgICBTeW1ib2xzLlJFQUxUSU1FLk5BTUVTUEFDRSh0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lKSxcbiAgICAgICksXG4gICAgfTtcblxuXG5cblxuXG5cbiAgICB0aGlzLmNvcmUuY29ubmVjdFNvY2tldEJFID0gdGhpcy5jb3JlLnN0cmF0ZWd5LmlvU2VydmVyKFxuICAgICAgSGVscGVycy5pc1dlYlNRTCA/IHRoaXMuY29yZS5jdHgudXJpLm9yaWdpbiA6IHRoaXMuY29yZS5jdHguc2VydmVyVGNwVWRwLFxuICAgICAge1xuICAgICAgICBwYXRoOiBuc3BQYXRoLmdsb2JhbC5wYXRobmFtZSxcblxuICAgICAgICBjb3JzOiB7XG4gICAgICAgICAgb3JpZ2luOiB0aGlzLmNvcmUuY3R4LmNvbmZpZy5mcm9udGVuZEhvc3QsXG4gICAgICAgICAgbWV0aG9kczogdGhpcy5jb3JlLmFsbEh0dHBNZXRob2RzLFxuICAgICAgICB9LFxuICAgICAgfSwgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5jb3JlLmN0eCxcbiAgICApO1xuXG4gICAgdGhpcy5jb3JlLmN0eC5sb2dSZWFsdGltZSAmJlxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW2JhY2tlbmRdIENSRUFURSBHTE9CQUwgTkFNRVNQQUNFOiAnJHt0aGlzLmNvcmUuY29ubmVjdFNvY2tldEJFLnBhdGgoKX0nYCArXG4gICAgICAgICAgYCAsIHBhdGg6ICcke25zcFBhdGguZ2xvYmFsLnBhdGhuYW1lfSdgLFxuICAgICAgKTtcblxuICAgIHRoaXMuY29yZS5jb25uZWN0U29ja2V0QkUub24oJ2Nvbm5lY3Rpb24nLCBjbGllbnRTb2NrZXQgPT4ge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW2JhY2tlbmRdIGNsaWVudCBjb25uZWN0ZWQgdG8gbmFtZXNwYWNlIFwiJHtuc3BQYXRoLmdsb2JhbC5wYXRobmFtZX1cIiwgYCArXG4gICAgICAgICAgYCBob3N0OiAke3RoaXMuY29yZS5jdHguaG9zdH1gLFxuICAgICAgKTtcbiAgICB9KTtcblxuXG5cblxuICAgIHRoaXMuY29yZS5zb2NrZXRCRSA9IHRoaXMuY29yZS5zdHJhdGVneS5pb1NlcnZlcihcbiAgICAgIEhlbHBlcnMuaXNXZWJTUUwgfHwgSGVscGVycy5pc0VsZWN0cm9uXG4gICAgICAgID8gdGhpcy5jb3JlLmN0eC51cmkub3JpZ2luXG4gICAgICAgIDogdGhpcy5jb3JlLmN0eC5zZXJ2ZXJUY3BVZHAsXG4gICAgICB7XG4gICAgICAgIHBhdGg6IG5zcFBhdGgucmVhbHRpbWUucGF0aG5hbWUsXG4gICAgICAgIGNvcnM6IHtcbiAgICAgICAgICBvcmlnaW46IHRoaXMuY29yZS5jdHguY29uZmlnLmZyb250ZW5kSG9zdCxcbiAgICAgICAgICBtZXRob2RzOiB0aGlzLmNvcmUuYWxsSHR0cE1ldGhvZHMsXG4gICAgICAgIH0sXG4gICAgICB9LCAvLyBAdHMtaWdub3JlXG4gICAgICB0aGlzLmNvcmUuY3R4LFxuICAgICk7XG5cbiAgICB0aGlzLmNvcmUuY3R4LmxvZ1JlYWx0aW1lICYmXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBbYmFja2VuZF0gQ1JFQVRFIFJFQUxUSU1FIE5BTUVTUEFDRTogJyR7dGhpcy5jb3JlLnNvY2tldEJFLnBhdGgoKX0nYCArXG4gICAgICAgICAgYCAsIHBhdGg6ICcke25zcFBhdGgucmVhbHRpbWUucGF0aG5hbWV9JyBgLFxuICAgICAgKTtcblxuICAgIHRoaXMuY29yZS5zb2NrZXRCRS5vbignY29ubmVjdGlvbicsIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQgPT4ge1xuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW2JhY2tlbmRdIGNsaWVudCBjb25uZWN0ZWQgdG8gbmFtZXNwYWNlIFwiJHtuc3BQYXRoLnJlYWx0aW1lLnBhdGhuYW1lfVwiLCBgICtcbiAgICAgICAgICBgIGhvc3Q6ICR7dGhpcy5jb3JlLmN0eC5ob3N0fWAsXG4gICAgICApO1xuXG4gICAgICBiYWNrZW5kU29ja2V0Rm9yQ2xpZW50Lm9uKFxuICAgICAgICBTeW1ib2xzLlJFQUxUSU1FLlJPT01fU1VCU0NSSUJFX0NVU1RPTSh0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lKSxcbiAgICAgICAgcm9vbU5hbWUgPT4ge1xuICAgICAgICAgIHRoaXMuY29yZS5jdHgubG9nUmVhbHRpbWUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgYEpvaW5pbmcgcm9vbSAke3Jvb21OYW1lfSBpbiBuYW1lc3BhY2UgIFJFQUxUSU1FYCArXG4gICAgICAgICAgICAgICAgYCBob3N0OiAke3RoaXMuY29yZS5jdHguY29udGV4dE5hbWV9LyR7dGhpcy5jb3JlLmN0eC5ob3N0fWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQuam9pbihyb29tTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBiYWNrZW5kU29ja2V0Rm9yQ2xpZW50Lm9uKFxuICAgICAgICBTeW1ib2xzLlJFQUxUSU1FLlJPT01fU1VCU0NSSUJFX0VOVElUWV9VUERBVEVfRVZFTlRTKFxuICAgICAgICAgIHRoaXMuY29yZS5jdHguY29udGV4dE5hbWUsXG4gICAgICAgICksXG4gICAgICAgIHJvb21OYW1lID0+IHtcbiAgICAgICAgICB0aGlzLmNvcmUuY3R4LmxvZ1JlYWx0aW1lICYmXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgIGBbYmFja2VuZF0gSm9pbmluZyByb29tICR7cm9vbU5hbWV9IGluIG5hbWVzcGFjZSAgUkVBTFRJTUVgICtcbiAgICAgICAgICAgICAgICBgIGhvc3Q6ICR7dGhpcy5jb3JlLmN0eC5jb250ZXh0TmFtZX0vJHt0aGlzLmNvcmUuY3R4Lmhvc3R9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYmFja2VuZFNvY2tldEZvckNsaWVudC5qb2luKHJvb21OYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQub24oXG4gICAgICAgIFN5bWJvbHMuUkVBTFRJTUUuUk9PTV9TVUJTQ1JJQkVfRU5USVRZX1BST1BFUlRZX1VQREFURV9FVkVOVFMoXG4gICAgICAgICAgdGhpcy5jb3JlLmN0eC5jb250ZXh0TmFtZSxcbiAgICAgICAgKSxcbiAgICAgICAgcm9vbU5hbWUgPT4ge1xuICAgICAgICAgIHRoaXMuY29yZS5jdHgubG9nUmVhbHRpbWUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgYFtiYWNrZW5kXSBKb2luaW5nIHJvb20gJHtyb29tTmFtZX0gaW4gbmFtZXNwYWNlIFJFQUxUSU1FIGAgK1xuICAgICAgICAgICAgICAgIGAgaG9zdDogJHt0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lfS8ke3RoaXMuY29yZS5jdHguaG9zdH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBiYWNrZW5kU29ja2V0Rm9yQ2xpZW50LmpvaW4ocm9vbU5hbWUpO1xuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgYmFja2VuZFNvY2tldEZvckNsaWVudC5vbihcbiAgICAgICAgU3ltYm9scy5SRUFMVElNRS5ST09NX1VOU1VCU0NSSUJFX0NVU1RPTSh0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lKSxcbiAgICAgICAgcm9vbU5hbWUgPT4ge1xuICAgICAgICAgIHRoaXMuY29yZS5jdHgubG9nUmVhbHRpbWUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgICAgYFtiYWNrZW5kXSBMZWF2aW5nIHJvb20gJHtyb29tTmFtZX0gaW4gbmFtZXNwYWNlICBSRUFMVElNRWAgK1xuICAgICAgICAgICAgICAgIGAgaG9zdDogJHt0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lfS8ke3RoaXMuY29yZS5jdHguaG9zdH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBiYWNrZW5kU29ja2V0Rm9yQ2xpZW50LmxlYXZlKHJvb21OYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQub24oXG4gICAgICAgIFN5bWJvbHMuUkVBTFRJTUUuUk9PTV9VTlNVQlNDUklCRV9FTlRJVFlfVVBEQVRFX0VWRU5UUyhcbiAgICAgICAgICB0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lLFxuICAgICAgICApLFxuICAgICAgICByb29tTmFtZSA9PiB7XG4gICAgICAgICAgdGhpcy5jb3JlLmN0eC5sb2dSZWFsdGltZSAmJlxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICBgW2JhY2tlbmRdIExlYXZpbmcgcm9vbSAke3Jvb21OYW1lfSBpbiBuYW1lc3BhY2UgUkVBTFRJTUUgYCArXG4gICAgICAgICAgICAgICAgYCBob3N0OiAke3RoaXMuY29yZS5jdHguY29udGV4dE5hbWV9LyR7dGhpcy5jb3JlLmN0eC5ob3N0fWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQubGVhdmUocm9vbU5hbWUpO1xuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgYmFja2VuZFNvY2tldEZvckNsaWVudC5vbihcbiAgICAgICAgU3ltYm9scy5SRUFMVElNRS5ST09NX1VOU1VCU0NSSUJFX0VOVElUWV9QUk9QRVJUWV9VUERBVEVfRVZFTlRTKFxuICAgICAgICAgIHRoaXMuY29yZS5jdHguY29udGV4dE5hbWUsXG4gICAgICAgICksXG4gICAgICAgIHJvb21OYW1lID0+IHtcbiAgICAgICAgICB0aGlzLmNvcmUuY3R4LmxvZ1JlYWx0aW1lICYmXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgICAgIGBbYmFja2VuZF0gTGVhdmluZyByb29tICR7cm9vbU5hbWV9IGluIG5hbWVzcGFjZSBSRUFMVElNRSBgICtcbiAgICAgICAgICAgICAgICBgIGhvc3Q6ICR7dGhpcy5jb3JlLmN0eC5jb250ZXh0TmFtZX0vJHt0aGlzLmNvcmUuY3R4Lmhvc3R9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYmFja2VuZFNvY2tldEZvckNsaWVudC5sZWF2ZShyb29tTmFtZSk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuXG5cblxuXG4gIH1cblxuXG5cblxuICBwcml2YXRlIHRyaWdnZXJDaGFuZ2VzKFxuICAgIGVudGl0eU9iak9yQ2xhc3M6IEZ1bmN0aW9uLFxuICAgIHByb3BlcnR5Pzogc3RyaW5nLFxuICAgIHZhbHVlT2ZVbmlxdWVQcm9wZXJ0eT86IG51bWJlciB8IHN0cmluZyxcbiAgICBjdXN0b21FdmVudD86IHN0cmluZyxcbiAgICBjdXN0b21FdmVudERhdGE/OiBhbnksXG4gICkge1xuXG5cblxuXG4gICAgbGV0IHJvb21OYW1lOiBzdHJpbmc7XG5cbiAgICBpZiAodGhpcy5jb3JlLmN0eC5kaXNhYmxlZFJlYWx0aW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbUV2ZW50KSB7XG4gICAgICByb29tTmFtZSA9IFN5bWJvbHMuUkVBTFRJTUUuUk9PTV9OQU1FX0NVU1RPTShcbiAgICAgICAgdGhpcy5jb3JlLmN0eC5jb250ZXh0TmFtZSxcbiAgICAgICAgY3VzdG9tRXZlbnQsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZW50aXR5Rm4gPSBlbnRpdHlPYmpPckNsYXNzIGFzIEZ1bmN0aW9uO1xuICAgICAgY29uc3QgZW50aXR5SXNPYmplY3QgPVxuICAgICAgICAhXy5pc0Z1bmN0aW9uKGVudGl0eU9iak9yQ2xhc3MpICYmIF8uaXNPYmplY3QoZW50aXR5T2JqT3JDbGFzcyk7XG5cbiAgICAgIGlmIChlbnRpdHlJc09iamVjdCkge1xuICAgICAgICBlbnRpdHlGbiA9IENsYXNzSGVscGVycy5nZXRDbGFzc0ZuRnJvbU9iamVjdChlbnRpdHlPYmpPckNsYXNzKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdW5pcXVlS2V5ID0gQ2xhc3NIZWxwZXJzLmdldFVuaXF1ZUtleShlbnRpdHlGbik7XG5cbiAgICAgIGlmIChlbnRpdHlJc09iamVjdCkge1xuICAgICAgICB2YWx1ZU9mVW5pcXVlUHJvcGVydHkgPSBlbnRpdHlPYmpPckNsYXNzW3VuaXF1ZUtleV07XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsdWVPZlVuaXF1ZVByb3BlcnR5KSB7XG4gICAgICAgIEhlbHBlcnMuZXJyb3IoXG4gICAgICAgICAgYFtUYW9uXVtSZWFsdGltZV0gRW50aXR5IHdpdGhvdXQgaUQgISAke0NsYXNzSGVscGVycy5nZXROYW1lKFxuICAgICAgICAgICAgZW50aXR5Rm4sXG4gICAgICAgICAgKX0gYCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcm9vbU5hbWUgPSBfLmlzU3RyaW5nKHByb3BlcnR5KVxuICAgICAgICA/IFN5bWJvbHMuUkVBTFRJTUUuUk9PTV9OQU1FX1VQREFURV9FTlRJVFlfUFJPUEVSVFkoXG4gICAgICAgICAgICB0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lLFxuICAgICAgICAgICAgQ2xhc3NIZWxwZXJzLmdldE5hbWUoZW50aXR5Rm4pLFxuICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICB2YWx1ZU9mVW5pcXVlUHJvcGVydHksXG4gICAgICAgICAgKVxuICAgICAgICA6IFN5bWJvbHMuUkVBTFRJTUUuUk9PTV9OQU1FX1VQREFURV9FTlRJVFkoXG4gICAgICAgICAgICB0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lLFxuICAgICAgICAgICAgQ2xhc3NIZWxwZXJzLmdldE5hbWUoZW50aXR5Rm4pLFxuICAgICAgICAgICAgdmFsdWVPZlVuaXF1ZVByb3BlcnR5LFxuICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5jb3JlLnNvY2tldEJFLmluKHJvb21OYW1lKS5lbWl0KFxuICAgICAgcm9vbU5hbWUsIC8vIHJvb21OYW1lID09IGV2ZW50TmFtZSBpbiByb29tIG5hXG4gICAgICBjdXN0b21FdmVudCA/IGN1c3RvbUV2ZW50RGF0YSA6ICcnLFxuICAgICk7XG5cbiAgfVxuXG5cblxuXG5cbiAgcHVibGljIHRyaWdnZXJFbnRpdHlDaGFuZ2VzKFxuICAgIGVudGl0eU9iak9yQ2xhc3M6IEZ1bmN0aW9uLFxuICAgIGlkVG9UcmlnZ2VyPzogbnVtYmVyIHwgc3RyaW5nLFxuICApIHtcbiAgICBpZiAodGhpcy5jb3JlLmN0eC5kaXNhYmxlZFJlYWx0aW1lKSB7XG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBDbGFzc0hlbHBlcnMuZ2V0TmFtZShlbnRpdHlPYmpPckNsYXNzKTtcblxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1Rhb25dW1RyaWdnZXJFbnRpdHlDaGFuZ2VzXSBFbnRpdHkgXCIke2NsYXNzTmFtZX0nIGlzIG5vdCByZWFsdGltZWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJDaGFuZ2VzKGVudGl0eU9iak9yQ2xhc3MgYXMgYW55LCB2b2lkIDAsIGlkVG9UcmlnZ2VyKTtcbiAgfVxuXG5cblxuICBwdWJsaWMgdHJpZ2dlckVudGl0eVByb3BlcnR5Q2hhbmdlczxFTlRJVFkgZXh0ZW5kcyBCYXNlRW50aXR5PihcbiAgICBlbnRpdHlPYmpPckNsYXNzOiBuZXcgKC4uLmFyZ3MpID0+IEVOVElUWSxcbiAgICBwcm9wZXJ0eToga2V5b2YgRU5USVRZIHwgKGtleW9mIEVOVElUWSlbXSxcbiAgICBpZFRvVHJpZ2dlcj86IG51bWJlciB8IHN0cmluZyxcbiAgKSB7XG4gICAgaWYgKHRoaXMuY29yZS5jdHguZGlzYWJsZWRSZWFsdGltZSkge1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gQ2xhc3NIZWxwZXJzLmdldE5hbWUoZW50aXR5T2JqT3JDbGFzcyk7XG5cbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtUYW9uXVtUcmlnZ2VyRW50aXR5UHJvcGVydHlDaGFuZ2VzXVtwcm9wZXJ0eT0ke1xuICAgICAgICAgIHByb3BlcnR5IGFzIHN0cmluZ1xuICAgICAgICB9XSBFbnRpdHkgXCIke2NsYXNzTmFtZX0nIGlzIG5vdCByZWFsdGltZWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkocHJvcGVydHkpKSB7XG4gICAgICBwcm9wZXJ0eS5mb3JFYWNoKHByb3BlcnR5RnJvbUFyciA9PiB7XG4gICAgICAgIHRoaXMudHJpZ2dlckNoYW5nZXMoXG4gICAgICAgICAgZW50aXR5T2JqT3JDbGFzcyxcbiAgICAgICAgICBwcm9wZXJ0eUZyb21BcnIgYXMgYW55LFxuICAgICAgICAgIGlkVG9UcmlnZ2VyLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJpZ2dlckNoYW5nZXMoZW50aXR5T2JqT3JDbGFzcywgcHJvcGVydHkgYXMgYW55LCBpZFRvVHJpZ2dlcik7XG4gICAgfVxuICB9XG5cblxuXG4gIHB1YmxpYyB0cmlnZ2VyRW50aXR5VGFibGVDaGFuZ2VzKGVudGl0eUNsYXNzT3JJbnN0YW5jZTogRnVuY3Rpb24gfCBvYmplY3QpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBDbGFzc0hlbHBlcnMuZ2V0TmFtZShlbnRpdHlDbGFzc09ySW5zdGFuY2UpO1xuXG4gICAgaWYgKHRoaXMuY29yZS5jdHguZGlzYWJsZWRSZWFsdGltZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW1Rhb25dW1RyaWdnZXJFbnRpdHlUYWJsZUNoYW5nZXNdIEVudGl0eSBcIiR7Y2xhc3NOYW1lfScgaXMgbm90IHJlYWx0aW1lYCxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyQ2hhbmdlcyhcbiAgICAgIGVudGl0eUNsYXNzT3JJbnN0YW5jZSBhcyBhbnksXG4gICAgICB2b2lkIDAsXG4gICAgICB2b2lkIDAsXG4gICAgICBTeW1ib2xzLlJFQUxUSU1FLlRBQkxFX0NIQU5HRSh0aGlzLmNvcmUuY3R4LmNvbnRleHROYW1lLCBjbGFzc05hbWUpLFxuICAgICk7XG4gIH1cblxuXG5cblxuXG5cblxuICBwdWJsaWMgdHJpZ2dlckN1c3RvbUV2ZW50KGN1c3RvbUV2ZW50OiBzdHJpbmcsIGRhdGFUb1B1c2g6IGFueSkge1xuICAgIHRoaXMudHJpZ2dlckNoYW5nZXModm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgY3VzdG9tRXZlbnQsIGRhdGFUb1B1c2gpO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gY3VzdG9tIGV2ZW50cyBmcm9tIHVzZXJzXG4gICAqIEBwYXJhbSBjdXN0b21FdmVudCAgZ2xvYmFsIGV2ZW50IG5hbWVcbiAgICovXG4gIGxpc3RlbkNoYW5nZXNDdXN0b21FdmVudChjdXN0b21FdmVudDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIHRoaXMuY29yZS5zb2NrZXRCRS5vbignY29ubmVjdGlvbicsIGJhY2tlbmRTb2NrZXRGb3JDbGllbnQgPT4ge1xuICAgICAgYmFja2VuZFNvY2tldEZvckNsaWVudC5vbihjdXN0b21FdmVudCwgKGRhdGEsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgc3ViLm5leHQoZGF0YSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdWIuYXNPYnNlcnZhYmxlKCk7XG5cbiAgfVxuXG5cblxufVxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9dGFvbiBsaWIvcmVhbHRpbWUvcmVhbHRpbWUtc2VydmVyLnRzIl19
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export * from './realtime-strategy';
|
|
2
|
-
export * from './realtime-strategy-ipc';
|
|
3
|
-
export * from './realtime-strategy-mock';
|
|
4
|
-
export * from './realtime-strategy-socket-io';
|
|
5
|
-
;
|
|
6
|
-
({}); // @--end-of-file-for-module=taon lib/realtime/realtime-strategy/index.ts
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90bXAtbGlicy1mb3ItZGlzdC13ZWJzcWwvdGFvbi9wcm9qZWN0cy90YW9uL3NyYy9saWIvcmVhbHRpbWUvcmVhbHRpbWUtc3RyYXRlZ3kvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUU3QyxDQUFDO0FBQUEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlFQUF5RSIsInNvdXJjZXNDb250ZW50IjpbIlxuXG5leHBvcnQgKiBmcm9tICcuL3JlYWx0aW1lLXN0cmF0ZWd5JztcbmV4cG9ydCAqIGZyb20gJy4vcmVhbHRpbWUtc3RyYXRlZ3ktaXBjJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhbHRpbWUtc3RyYXRlZ3ktbW9jayc7XG5leHBvcnQgKiBmcm9tICcuL3JlYWx0aW1lLXN0cmF0ZWd5LXNvY2tldC1pbyc7XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT10YW9uIGxpYi9yZWFsdGltZS9yZWFsdGltZS1zdHJhdGVneS9pbmRleC50cyJdfQ==
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { RealtimeStrategy } from './realtime-strategy';
|
|
2
|
-
export class MockServerIpc {
|
|
3
|
-
static { this.serverByContextName = new Map(); }
|
|
4
|
-
static from(contextName) {
|
|
5
|
-
if (!MockServerIpc.serverByContextName.has(contextName)) {
|
|
6
|
-
MockServerIpc.serverByContextName.set(contextName, new MockServerIpc(contextName));
|
|
7
|
-
}
|
|
8
|
-
return MockServerIpc.serverByContextName.get(contextName);
|
|
9
|
-
}
|
|
10
|
-
constructor(contextName) {
|
|
11
|
-
this.contextName = contextName;
|
|
12
|
-
this.namespacesByName = new Map();
|
|
13
|
-
MockServerIpc.serverByContextName.set(contextName, this);
|
|
14
|
-
}
|
|
15
|
-
of(namespace) {
|
|
16
|
-
if (!this.namespacesByName.has(namespace)) {
|
|
17
|
-
this.namespacesByName.set(namespace, new MockNamespaceIpc(namespace, this));
|
|
18
|
-
}
|
|
19
|
-
return this.namespacesByName.get(namespace);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export class MockNamespaceIpc {
|
|
23
|
-
constructor(
|
|
24
|
-
/**
|
|
25
|
-
* Namespace name
|
|
26
|
-
*/
|
|
27
|
-
name, server) {
|
|
28
|
-
this.name = name;
|
|
29
|
-
this.server = server;
|
|
30
|
-
this.electronClients = new Set();
|
|
31
|
-
this.roomsByRoomName = {};
|
|
32
|
-
this.namespaceEventHandlers = {};
|
|
33
|
-
}
|
|
34
|
-
on(eventName, callback) {
|
|
35
|
-
/* */
|
|
36
|
-
/* */
|
|
37
|
-
/* */
|
|
38
|
-
/* */
|
|
39
|
-
/* */
|
|
40
|
-
/* */
|
|
41
|
-
/* */
|
|
42
|
-
/* */
|
|
43
|
-
/* */
|
|
44
|
-
/* */
|
|
45
|
-
/* */
|
|
46
|
-
/* */
|
|
47
|
-
/* */
|
|
48
|
-
/* */
|
|
49
|
-
/* */
|
|
50
|
-
/* */
|
|
51
|
-
/* */
|
|
52
|
-
/* */
|
|
53
|
-
/* */
|
|
54
|
-
/* */
|
|
55
|
-
/* */
|
|
56
|
-
/* */
|
|
57
|
-
/* */
|
|
58
|
-
/* */
|
|
59
|
-
/* */
|
|
60
|
-
/* */
|
|
61
|
-
/* */
|
|
62
|
-
/* */
|
|
63
|
-
/* */
|
|
64
|
-
return (void 0);
|
|
65
|
-
}
|
|
66
|
-
off(event, callback) {
|
|
67
|
-
/* */
|
|
68
|
-
/* */
|
|
69
|
-
/* */
|
|
70
|
-
/* */
|
|
71
|
-
/* */
|
|
72
|
-
/* */
|
|
73
|
-
/* */
|
|
74
|
-
/* */
|
|
75
|
-
/* */
|
|
76
|
-
/* */
|
|
77
|
-
/* */
|
|
78
|
-
/* */
|
|
79
|
-
return (void 0);
|
|
80
|
-
}
|
|
81
|
-
emit(eventName, ...args) {
|
|
82
|
-
/* */
|
|
83
|
-
/* */
|
|
84
|
-
/* */
|
|
85
|
-
/* */
|
|
86
|
-
/* */
|
|
87
|
-
/* */
|
|
88
|
-
/* */
|
|
89
|
-
/* */
|
|
90
|
-
/* */
|
|
91
|
-
return (void 0);
|
|
92
|
-
}
|
|
93
|
-
to(roomName) {
|
|
94
|
-
const electronClientsInroom = this.roomsByRoomName[roomName];
|
|
95
|
-
return new RoomEmitterIpc(electronClientsInroom, this.name, true);
|
|
96
|
-
}
|
|
97
|
-
in(roomName) {
|
|
98
|
-
const electronClientsInroom = this.roomsByRoomName[roomName];
|
|
99
|
-
return new RoomEmitterIpc(electronClientsInroom, this.name, false);
|
|
100
|
-
}
|
|
101
|
-
join(webContents, roomName) {
|
|
102
|
-
if (!this.roomsByRoomName[roomName]) {
|
|
103
|
-
this.roomsByRoomName[roomName] = new Set();
|
|
104
|
-
}
|
|
105
|
-
this.roomsByRoomName[roomName].add(webContents);
|
|
106
|
-
}
|
|
107
|
-
leave(webContents, roomName) {
|
|
108
|
-
if (this.roomsByRoomName[roomName]) {
|
|
109
|
-
this.roomsByRoomName[roomName].delete(webContents);
|
|
110
|
-
if (this.roomsByRoomName[roomName].size === 0) {
|
|
111
|
-
delete this.roomsByRoomName[roomName];
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
path() {
|
|
116
|
-
return this.name;
|
|
117
|
-
}
|
|
118
|
-
get nsp() {
|
|
119
|
-
const self = this;
|
|
120
|
-
return {
|
|
121
|
-
get name() {
|
|
122
|
-
return self.name;
|
|
123
|
-
},
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
class RoomEmitterIpc {
|
|
128
|
-
constructor(electronClients,
|
|
129
|
-
/**
|
|
130
|
-
* namespace name
|
|
131
|
-
*/
|
|
132
|
-
name, includeSender = false, sender = null) {
|
|
133
|
-
this.electronClients = electronClients;
|
|
134
|
-
this.name = name;
|
|
135
|
-
this.includeSender = includeSender;
|
|
136
|
-
this.sender = sender;
|
|
137
|
-
}
|
|
138
|
-
emit(eventName, ...args) {
|
|
139
|
-
const emitEvent = `(${this.name}) "${eventName}"`;
|
|
140
|
-
this.electronClients?.forEach(webContents => {
|
|
141
|
-
webContents.send(emitEvent, ...args);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
export class MockSocketIpc {
|
|
146
|
-
get name() {
|
|
147
|
-
return this.namespaceName;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* @param namespaceName instead url for ipc
|
|
151
|
-
*/
|
|
152
|
-
constructor(namespaceName) {
|
|
153
|
-
this.namespaceName = namespaceName;
|
|
154
|
-
this.socketEventHandlers = {};
|
|
155
|
-
this.ipcRenderer = window.require('electron').ipcRenderer;
|
|
156
|
-
}
|
|
157
|
-
on(eventName, callback) {
|
|
158
|
-
if (!this.socketEventHandlers[eventName]) {
|
|
159
|
-
this.socketEventHandlers[eventName] = new Set();
|
|
160
|
-
}
|
|
161
|
-
this.socketEventHandlers[eventName].add(callback);
|
|
162
|
-
const listenToEvent = `(${this.name}) "${eventName}"`;
|
|
163
|
-
this.ipcRenderer.on(listenToEvent, (rendereEvent, data) => {
|
|
164
|
-
callback(data);
|
|
165
|
-
});
|
|
166
|
-
if (eventName === 'connect') {
|
|
167
|
-
const connectionEventKey = `(${this.name}) "connection"`;
|
|
168
|
-
this.ipcRenderer.send(connectionEventKey, this.name);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
off(event, callback) {
|
|
172
|
-
if (!this.socketEventHandlers[event]) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
if (callback) {
|
|
176
|
-
this.socketEventHandlers[event].delete(callback);
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
delete this.socketEventHandlers[event];
|
|
180
|
-
}
|
|
181
|
-
const removeListener = `(${this.name}) "${event}"`;
|
|
182
|
-
this.ipcRenderer.removeListener(removeListener, data => {
|
|
183
|
-
callback(data);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
emit(event, ...args) {
|
|
187
|
-
const emitEvent = `(${this.name}) "${event}"`;
|
|
188
|
-
this.ipcRenderer.send(emitEvent, ...args);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Purpose:
|
|
193
|
-
* - backend-browser communication between 2 processes in electron mode
|
|
194
|
-
*/
|
|
195
|
-
export class RealtimeStrategyIpc extends RealtimeStrategy {
|
|
196
|
-
toString() {
|
|
197
|
-
return 'ipc';
|
|
198
|
-
}
|
|
199
|
-
constructor(ctx) {
|
|
200
|
-
super(ctx);
|
|
201
|
-
this.ctx = ctx;
|
|
202
|
-
}
|
|
203
|
-
ioServer(__, opt) {
|
|
204
|
-
const namespace = opt?.path || '/';
|
|
205
|
-
const server = MockServerIpc.from(this.ctx.contextName);
|
|
206
|
-
return server.of(namespace);
|
|
207
|
-
}
|
|
208
|
-
get ioClient() {
|
|
209
|
-
const clientIo = (__, opt) => {
|
|
210
|
-
const namespace = opt?.path || '/';
|
|
211
|
-
return new MockSocketIpc(namespace);
|
|
212
|
-
};
|
|
213
|
-
return clientIo;
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
;
|
|
217
|
-
({}); // @--end-of-file-for-module=taon lib/realtime/realtime-strategy/realtime-strategy-ipc.ts
|
|
218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbHRpbWUtc3RyYXRlZ3ktaXBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3Rhb24vcHJvamVjdHMvdGFvbi9zcmMvbGliL3JlYWx0aW1lL3JlYWx0aW1lLXN0cmF0ZWd5L3JlYWx0aW1lLXN0cmF0ZWd5LWlwYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVl2RCxNQUFNLE9BQU8sYUFBYTthQUNqQix3QkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQUFBbkMsQ0FBb0M7SUFFOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFtQjtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3hELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQ25DLFdBQVcsRUFDWCxJQUFJLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FDL0IsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUtELFlBQW1CLFdBQW1CO1FBQW5CLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBSHRDLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO1FBSXJELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFJRCxFQUFFLENBQUMsU0FBaUI7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUN2QixTQUFTLEVBQ1QsSUFBSSxnQkFB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QyxFQUM5QixFQUFFO1lBQ2pCLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxRQUFlLENBQUM7SUFDekIsQ0FBQztDQUVGO0FBRUEsQ0FBQztBQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyx5RkFBeUYiLCJzb3VyY2VzQ29udGVudCI6WyJcblxuXG5pbXBvcnQgeyBTZXJ2ZXIsIFNlcnZlck9wdGlvbnMgfSBmcm9tICdzb2NrZXQuaW8nO1xuaW1wb3J0IHsgRW5kcG9pbnRDb250ZXh0IH0gZnJvbSAnLi4vLi4vZW5kcG9pbnQtY29udGV4dCc7XG5pbXBvcnQgeyBSZWFsdGltZVN0cmF0ZWd5IH0gZnJvbSAnLi9yZWFsdGltZS1zdHJhdGVneSc7XG5pbXBvcnQgdHlwZSB7IGlvLCBNYW5hZ2VyT3B0aW9ucywgU29ja2V0T3B0aW9ucyB9IGZyb20gJ3NvY2tldC5pby1jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBpcGNSZW5kZXJlciB9IGZyb20gJ2VsZWN0cm9uJztcbmltcG9ydCB7IFN5bWJvbHMgfSBmcm9tICcuLi8uLi9zeW1ib2xzJztcbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG5pbXBvcnQgeyBSZWFsdGltZU1vZGVscyB9IGZyb20gJy4uL3JlYWx0aW1lLm1vZGVscyc7XG5cblxuXG5leHBvcnQgY2xhc3MgTW9ja1NlcnZlcklwYyB7XG4gIHN0YXRpYyBzZXJ2ZXJCeUNvbnRleHROYW1lID0gbmV3IE1hcDxzdHJpbmcsIE1vY2tTZXJ2ZXJJcGM+KCk7XG5cbiAgc3RhdGljIGZyb20oY29udGV4dE5hbWU6IHN0cmluZyk6IE1vY2tTZXJ2ZXJJcGMge1xuICAgIGlmICghTW9ja1NlcnZlcklwYy5zZXJ2ZXJCeUNvbnRleHROYW1lLmhhcyhjb250ZXh0TmFtZSkpIHtcbiAgICAgIE1vY2tTZXJ2ZXJJcGMuc2VydmVyQnlDb250ZXh0TmFtZS5zZXQoXG4gICAgICAgIGNvbnRleHROYW1lLFxuICAgICAgICBuZXcgTW9ja1NlcnZlcklwYyhjb250ZXh0TmFtZSksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gTW9ja1NlcnZlcklwYy5zZXJ2ZXJCeUNvbnRleHROYW1lLmdldChjb250ZXh0TmFtZSk7XG4gIH1cblxuICBuYW1lc3BhY2VzQnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIE1vY2tOYW1lc3BhY2VJcGM+KCk7XG5cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGV4dE5hbWU6IHN0cmluZykge1xuICAgIE1vY2tTZXJ2ZXJJcGMuc2VydmVyQnlDb250ZXh0TmFtZS5zZXQoY29udGV4dE5hbWUsIHRoaXMpO1xuICB9XG5cblxuXG4gIG9mKG5hbWVzcGFjZTogc3RyaW5nKTogTW9ja05hbWVzcGFjZUlwYyB7XG4gICAgaWYgKCF0aGlzLm5hbWVzcGFjZXNCeU5hbWUuaGFzKG5hbWVzcGFjZSkpIHtcbiAgICAgIHRoaXMubmFtZXNwYWNlc0J5TmFtZS5zZXQoXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgbmV3IE1vY2tOYW1lc3BhY2VJcGMobmFtZXNwYWNlLCB0aGlzKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZXNCeU5hbWUuZ2V0KG5hbWVzcGFjZSk7XG4gIH1cblxufVxuXG5cblxuZXhwb3J0IGNsYXNzIE1vY2tOYW1lc3BhY2VJcGMge1xuXG4gIGVsZWN0cm9uQ2xpZW50cyA9IG5ldyBTZXQ8RWxlY3Ryb24uV2ViQ29udGVudHM+KCk7XG4gIHJvb21zQnlSb29tTmFtZToge1xuICAgIFtyb29tTmFtZTogc3RyaW5nXTogU2V0PEVsZWN0cm9uLldlYkNvbnRlbnRzPjtcbiAgfSA9IHt9O1xuXG4gIHByaXZhdGUgbmFtZXNwYWNlRXZlbnRIYW5kbGVyczoge1xuICAgIFtldmVudE5hbWU6IHN0cmluZ106IFNldDxSZWFsdGltZU1vZGVscy5FdmVudEhhbmRsZXI+O1xuICB9ID0ge307XG5cblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIE5hbWVzcGFjZSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgc2VydmVyOiBNb2NrU2VydmVySXBjLFxuICApIHt9XG5cblxuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogUmVhbHRpbWVNb2RlbHMuRXZlbnRIYW5kbGVyKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgICByZXR1cm4gKHZvaWQgMCk7XG4gIH1cblxuXG5cbiAgb2ZmKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrPzogUmVhbHRpbWVNb2RlbHMuRXZlbnRIYW5kbGVyKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gICAgcmV0dXJuICh2b2lkIDApO1xuICB9XG5cblxuXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gICAgcmV0dXJuICh2b2lkIDApO1xuICB9XG5cblxuXG4gIHRvKHJvb21OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVjdHJvbkNsaWVudHNJbnJvb20gPSB0aGlzLnJvb21zQnlSb29tTmFtZVtyb29tTmFtZV07XG4gICAgcmV0dXJuIG5ldyBSb29tRW1pdHRlcklwYyhlbGVjdHJvbkNsaWVudHNJbnJvb20sIHRoaXMubmFtZSwgdHJ1ZSk7XG4gIH1cblxuXG5cbiAgaW4ocm9vbU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGVsZWN0cm9uQ2xpZW50c0lucm9vbSA9IHRoaXMucm9vbXNCeVJvb21OYW1lW3Jvb21OYW1lXTtcbiAgICByZXR1cm4gbmV3IFJvb21FbWl0dGVySXBjKGVsZWN0cm9uQ2xpZW50c0lucm9vbSwgdGhpcy5uYW1lLCBmYWxzZSk7XG4gIH1cblxuXG5cbiAgam9pbih3ZWJDb250ZW50czogRWxlY3Ryb24uV2ViQ29udGVudHMsIHJvb21OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucm9vbXNCeVJvb21OYW1lW3Jvb21OYW1lXSkge1xuICAgICAgdGhpcy5yb29tc0J5Um9vbU5hbWVbcm9vbU5hbWVdID0gbmV3IFNldCgpO1xuICAgIH1cbiAgICB0aGlzLnJvb21zQnlSb29tTmFtZVtyb29tTmFtZV0uYWRkKHdlYkNvbnRlbnRzKTtcbiAgfVxuXG5cblxuICBsZWF2ZSh3ZWJDb250ZW50czogRWxlY3Ryb24uV2ViQ29udGVudHMsIHJvb21OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5yb29tc0J5Um9vbU5hbWVbcm9vbU5hbWVdKSB7XG4gICAgICB0aGlzLnJvb21zQnlSb29tTmFtZVtyb29tTmFtZV0uZGVsZXRlKHdlYkNvbnRlbnRzKTtcbiAgICAgIGlmICh0aGlzLnJvb21zQnlSb29tTmFtZVtyb29tTmFtZV0uc2l6ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5yb29tc0J5Um9vbU5hbWVbcm9vbU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cblxuICBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuXG5cbiAgZ2V0IG5zcCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLm5hbWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxufVxuXG5cblxuXG5jbGFzcyBSb29tRW1pdHRlcklwYyB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVjdHJvbkNsaWVudHM6IFNldDxFbGVjdHJvbi5XZWJDb250ZW50cz4sXG4gICAgLyoqXG4gICAgICogbmFtZXNwYWNlIG5hbWVcbiAgICAgKi9cbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIGluY2x1ZGVTZW5kZXI6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBwcml2YXRlIHNlbmRlcjogTW9ja1NvY2tldElwYyA9IG51bGwsIC8vIFRPRE8gUVVJQ0sgRklYIGhvdyB0byBpbmNsdWRlIHNlbmRlclxuICApIHt9XG5cblxuXG4gIGVtaXQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgZW1pdEV2ZW50ID0gYCgke3RoaXMubmFtZX0pIFwiJHtldmVudE5hbWV9XCJgO1xuICAgIHRoaXMuZWxlY3Ryb25DbGllbnRzPy5mb3JFYWNoKHdlYkNvbnRlbnRzID0+IHtcbiAgICAgIHdlYkNvbnRlbnRzLnNlbmQoZW1pdEV2ZW50LCAuLi5hcmdzKTtcbiAgICB9KTtcbiAgfVxuXG59XG5cblxuXG5leHBvcnQgY2xhc3MgTW9ja1NvY2tldElwYyB7XG5cblxuXG4gIGlwY1JlbmRlcmVyITogdHlwZW9mIGlwY1JlbmRlcmVyO1xuXG5cblxuICBwcml2YXRlIHNvY2tldEV2ZW50SGFuZGxlcnMgPSB7fSBhcyB7XG4gICAgW2V2ZW50TmFtZTogc3RyaW5nXTogU2V0PFJlYWx0aW1lTW9kZWxzLkV2ZW50SGFuZGxlcj47XG4gIH07XG5cblxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZU5hbWU7XG4gIH1cblxuXG5cblxuXG4gIC8qKlxuICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBpbnN0ZWFkIHVybCBmb3IgaXBjXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZXNwYWNlTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5pcGNSZW5kZXJlciA9ICh3aW5kb3cgYXMgYW55KS5yZXF1aXJlKCdlbGVjdHJvbicpLmlwY1JlbmRlcmVyO1xuICB9XG5cblxuXG4gIG9uKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldEV2ZW50SGFuZGxlcnNbZXZlbnROYW1lXSkge1xuICAgICAgdGhpcy5zb2NrZXRFdmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gPSBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHRoaXMuc29ja2V0RXZlbnRIYW5kbGVyc1tldmVudE5hbWVdLmFkZChjYWxsYmFjayk7XG5cbiAgICBjb25zdCBsaXN0ZW5Ub0V2ZW50ID0gYCgke3RoaXMubmFtZX0pIFwiJHtldmVudE5hbWV9XCJgO1xuICAgIHRoaXMuaXBjUmVuZGVyZXIub24obGlzdGVuVG9FdmVudCwgKHJlbmRlcmVFdmVudCwgZGF0YSkgPT4ge1xuICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZXZlbnROYW1lID09PSAnY29ubmVjdCcpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25FdmVudEtleSA9IGAoJHt0aGlzLm5hbWV9KSBcImNvbm5lY3Rpb25cImA7XG4gICAgICB0aGlzLmlwY1JlbmRlcmVyLnNlbmQoY29ubmVjdGlvbkV2ZW50S2V5LCB0aGlzLm5hbWUpO1xuICAgIH1cbiAgfVxuXG5cblxuICBvZmYoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s/OiAoZXZlbnQ6IGFueSwgLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0RXZlbnRIYW5kbGVyc1tldmVudF0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuc29ja2V0RXZlbnRIYW5kbGVyc1tldmVudF0uZGVsZXRlKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHRoaXMuc29ja2V0RXZlbnRIYW5kbGVyc1tldmVudF07XG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZUxpc3RlbmVyID0gYCgke3RoaXMubmFtZX0pIFwiJHtldmVudH1cImA7XG5cbiAgICB0aGlzLmlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKHJlbW92ZUxpc3RlbmVyLCBkYXRhID0+IHtcbiAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cblxuXG4gIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBlbWl0RXZlbnQgPSBgKCR7dGhpcy5uYW1lfSkgXCIke2V2ZW50fVwiYDtcbiAgICB0aGlzLmlwY1JlbmRlcmVyLnNlbmQoZW1pdEV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG59XG5cblxuLyoqXG4gKiBQdXJwb3NlOlxuICogLSBiYWNrZW5kLWJyb3dzZXIgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIDIgcHJvY2Vzc2VzIGluIGVsZWN0cm9uIG1vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFJlYWx0aW1lU3RyYXRlZ3lJcGMgZXh0ZW5kcyBSZWFsdGltZVN0cmF0ZWd5IHtcblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnaXBjJztcbiAgfVxuXG5cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY3R4OiBFbmRwb2ludENvbnRleHQpIHtcbiAgICBzdXBlcihjdHgpO1xuICB9XG5cblxuXG4gIGlvU2VydmVyKF9fOiBzdHJpbmcsIG9wdDogU2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IG5hbWVzcGFjZSA9IG9wdD8ucGF0aCB8fCAnLyc7XG4gICAgY29uc3Qgc2VydmVyID0gTW9ja1NlcnZlcklwYy5mcm9tKHRoaXMuY3R4LmNvbnRleHROYW1lKTtcbiAgICByZXR1cm4gc2VydmVyLm9mKG5hbWVzcGFjZSkgYXMgYW55O1xuICB9XG5cbiAgZ2V0IGlvQ2xpZW50KCkge1xuICAgIGNvbnN0IGNsaWVudElvID0gKFxuICAgICAgX186IHN0cmluZyxcbiAgICAgIG9wdD86IFBhcnRpYWw8TWFuYWdlck9wdGlvbnMgJiBTb2NrZXRPcHRpb25zPixcbiAgICApOiBNb2NrU29ja2V0SXBjID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZSA9IG9wdD8ucGF0aCB8fCAnLyc7XG4gICAgICByZXR1cm4gbmV3IE1vY2tTb2NrZXRJcGMobmFtZXNwYWNlKTtcbiAgICB9O1xuICAgIHJldHVybiBjbGllbnRJbyBhcyBhbnk7XG4gIH1cblxufVxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9dGFvbiBsaWIvcmVhbHRpbWUvcmVhbHRpbWUtc3RyYXRlZ3kvcmVhbHRpbWUtc3RyYXRlZ3ktaXBjLnRzIl19
|