@microsoft/windows-admin-center-sdk 2.298.1 → 2.302.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/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +239 -568
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +2 -2
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/actions/containers/action-bar/action-bar.component.js +2 -7
- package/angular/esm2015/src/controls/alert-bar/alert-bar.component.js +5 -5
- package/angular/esm2015/src/controls/common/base.component.js +1 -8
- package/angular/esm2015/src/controls/data-table/data-table.component.js +9 -39
- package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +8 -11
- package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +9 -8
- package/angular/esm2015/src/controls/form/form-field/file/file-form-field.component.js +2 -14
- package/angular/esm2015/src/controls/form/form-field/form-field.component.js +2 -9
- package/angular/esm2015/src/controls/layout/layout-definition.component.js +2 -9
- package/angular/esm2015/src/controls/layout/layout.component.js +2 -11
- package/angular/esm2015/src/controls/master-view/master-view.component.js +5 -32
- package/angular/esm2015/src/controls/page-alert-bar/models/index.js +1 -1
- package/angular/esm2015/src/controls/pivot/pivot-tab.component.js +1 -1
- package/angular/esm2015/src/controls/pivot/pivot.component.js +4 -21
- package/angular/esm2015/src/controls/property-grid/property-grid-item.component.js +2 -50
- package/angular/esm2015/src/controls/property-grid/property-grid.component.js +60 -73
- package/angular/esm2015/src/controls/property-grid/property-grid.module.js +1 -5
- package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +70 -151
- package/angular/esm2015/src/controls/settings/settings.component.js +8 -48
- package/angular/esm2015/src/controls/settings/settings.module.js +9 -21
- package/angular/esm2015/src/controls/wizard/wizard.component.js +65 -55
- package/angular/esm2015/src/generated/strings.js +1 -1
- package/angular/esm2015/src/service/app-context.service.js +1 -3
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +239 -545
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/package.json +0 -2
- package/angular/src/controls/common/base.component.d.ts +0 -5
- package/angular/src/controls/data-table/data-table.component.d.ts +0 -15
- package/angular/src/controls/form/form-field/checklist/checklist-form-field.component.d.ts +0 -1
- package/angular/src/controls/form/form-field/file/file-form-field.component.d.ts +0 -4
- package/angular/src/controls/layout/layout-definition.component.d.ts +1 -6
- package/angular/src/controls/master-view/master-view.component.d.ts +2 -118
- package/angular/src/controls/page-alert-bar/models/index.d.ts +1 -1
- package/angular/src/controls/pivot/pivot-tab.component.d.ts +1 -0
- package/angular/src/controls/pivot/pivot.component.d.ts +0 -7
- package/angular/src/controls/property-grid/property-grid-item.component.d.ts +3 -53
- package/angular/src/controls/property-grid/property-grid.component.d.ts +2 -1
- package/angular/src/controls/property-grid/property-grid.module.d.ts +3 -4
- package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +1 -32
- package/angular/src/controls/settings/settings.component.d.ts +1 -18
- package/angular/src/controls/settings/settings.module.d.ts +1 -3
- package/angular/src/generated/strings.d.ts +0 -3
- package/core/base/environment.d.ts +0 -10
- package/core/base/environment.js.map +1 -1
- package/core/data/gateway-connection.d.ts +0 -34
- package/core/data/gateway-connection.js +2 -59
- package/core/data/gateway-connection.js.map +1 -1
- package/core/data/node-connection.d.ts +0 -4
- package/core/data/node-connection.js.map +1 -1
- package/core/data/powershell.d.ts +0 -4
- package/core/data/powershell.js +0 -1
- package/core/data/powershell.js.map +1 -1
- package/core/diagnostics/sme-web-telemetry-models.d.ts +3 -20
- package/core/diagnostics/sme-web-telemetry-models.js +2 -6
- package/core/diagnostics/sme-web-telemetry-models.js.map +1 -1
- package/core/diagnostics/sme-web-telemetry.d.ts +1 -13
- package/core/diagnostics/sme-web-telemetry.js +11 -51
- package/core/diagnostics/sme-web-telemetry.js.map +1 -1
- package/core/generated/powershell-scripts.d.ts +0 -4
- package/core/generated/powershell-scripts.js +0 -4
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/index.d.ts +0 -2
- package/core/index.js +0 -1
- package/core/index.js.map +1 -1
- package/core/manifest/environment-modules.js +0 -10
- package/core/manifest/environment-modules.js.map +1 -1
- package/core/notification/powershell-notification.js +1 -1
- package/core/notification/powershell-notification.js.map +1 -1
- package/core/performance/performance-tracker.d.ts +0 -67
- package/core/performance/performance-tracker.js +4 -211
- package/core/performance/performance-tracker.js.map +1 -1
- package/core/rpc/credssp/rpc-credssp-model.d.ts +2 -27
- package/core/rpc/credssp/rpc-credssp-model.js +0 -10
- package/core/rpc/credssp/rpc-credssp-model.js.map +1 -1
- package/core/security/credssp-manager.d.ts +1 -15
- package/core/security/credssp-manager.js +0 -28
- package/core/security/credssp-manager.js.map +1 -1
- package/core/shared/gateway-inventory/gateway-inventory.d.ts +0 -10
- package/core/shared/gateway-inventory/gateway-inventory.js +0 -11
- package/core/shared/gateway-inventory/gateway-inventory.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +3 -5
- package/styles/css/main.css +1 -1
- package/tools/module-template/gulpfile.ts/index.ts +1 -1
- package/tools/package-lock.json +975 -14946
- package/tools/wac-cli/src/create/main.d.ts +3 -6
- package/tools/wac-cli/src/create/main.js +35 -87
- package/tools/wac-cli/src/create/main.js.map +1 -1
- package/tools/wac-cli/src/index.js +2 -2
- package/tools/wac-cli/src/index.js.map +1 -1
- package/tools/wac-cli/templates/{solution/manifest.json → manifest/solution-manifest.json} +0 -19
- package/tools/wac-cli/templates/{wac-template/src/manifest.json → manifest/tool-manifest.json} +0 -0
- package/tools/wac-cli/templates/wac-template/angular.json +2 -2
- package/tools/wac-cli/templates/wac-template/gulpfile.ts/config-data.ts +1 -1
- package/tools/wac-cli/templates/wac-template/package.json +8 -0
- package/tools/wac-cli/templates/wac-template/src/app/app-routing.module.ts +1 -1
- package/tools/wac-cli/templates/wac-template/src/main.ts +0 -2
- package/tools/wac-cli/templates/wac-template/src/polyfills.ts +1 -1
- package/tools/wac-cli/templates/wac-template/src/test.ts +2 -2
- package/core/data/gateway-status.d.ts +0 -24
- package/core/data/gateway-status.js +0 -3
- package/core/data/gateway-status.js.map +0 -1
- package/core/data/wdac-operations.d.ts +0 -123
- package/core/data/wdac-operations.js +0 -144
- package/core/data/wdac-operations.js.map +0 -1
- package/tools/wac-cli/templates/internal/npmrc.txt +0 -6
- package/tools/wac-cli/templates/internal/package.json +0 -101
- package/tools/wac-cli/templates/solution/strings.resjson +0 -16
- package/tools/wac-cli/templates/wac-template/src/version.ts +0 -3
- package/tools/wac-cli/templates/wac-template/version.json +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/data/powershell.ts"],"names":[],"mappings":"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","file":"powershell.js","sourcesContent":["\r\nimport { empty, Observable, Observer, throwError } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, expand, mergeMap, tap } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { TelemetryEventStates } from '../diagnostics/sme-web-telemetry-models';\r\nimport { Strings } from '../generated/strings';\r\nimport { Disposable, DisposableLifetimeManager, Disposer } from './disposable';\r\nimport { headerConstants, HttpStatusCode } from './http-constants';\r\nimport { Net } from './net';\r\nimport { NodeConnection, NodeRequestOptions } from './node-connection';\r\n\r\n/**\r\n * PowerShell run options.\r\n */\r\nexport interface PowerShellOptions extends NodeRequestOptions {\r\n /**\r\n * Close the runspace after the call.\r\n * (default is false)\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Close the runspace on error.\r\n */\r\n closeOnError?: boolean;\r\n\r\n /**\r\n * Timeout milliseconds to shutdown the session.\r\n * (default is null and forever)\r\n */\r\n timeoutMs?: number;\r\n\r\n /**\r\n * Processing data progressively instead of waiting all result.\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The node request options to control the underlying node connections in a powershell session\r\n */\r\nexport interface PowerShellSessionRequestOptions extends NodeRequestOptions {\r\n /**\r\n * Specify the session pool mode on the gateway.\r\n */\r\n automatic?: boolean;\r\n}\r\n\r\n/**\r\n * PowerShell context object interface.\r\n */\r\nexport interface PowerShellContext {\r\n /**\r\n * The node name.\r\n */\r\n nodeName: string;\r\n\r\n /**\r\n * The shared key name for runspace.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The array of referenced containers.\r\n */\r\n lifetimes: DisposableLifetimeManager[];\r\n\r\n /**\r\n * The request options for the powershell session\r\n */\r\n requestOptions: PowerShellSessionRequestOptions;\r\n}\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\n export interface PowerShellCommandWithoutState {\r\n /**\r\n * The name of PowerShell module. (optional, it uses default module if not specified.)\r\n */\r\n module?: string;\r\n\r\n /**\r\n * The command name.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters (arguments).\r\n */\r\n parameters?: any;\r\n\r\n /**\r\n * Set if the command should be run in a local runspace.\r\n */\r\n useInProcRunspace?: boolean;\r\n\r\n /**\r\n * The script string.\r\n */\r\n script: string;\r\n}\r\n\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\nexport interface PowerShellCommand extends PowerShellCommandWithoutState {\r\n /**\r\n * The state of command object.\r\n */\r\n state: string;\r\n}\r\n\r\n/**\r\n * PowerShell command queue item.\r\n */\r\nexport interface PowerShellCommandItem {\r\n /**\r\n * The command to execute.\r\n */\r\n command: PowerShellCommand;\r\n\r\n /**\r\n * Options for how to handle the command (reserved)\r\n */\r\n options?: PowerShellOptions;\r\n\r\n /**\r\n * Deferred object currently waiting for command run.\r\n */\r\n observer: Observer<any>;\r\n}\r\n\r\ninterface PowerShellCommandPacket extends PowerShellCommand {\r\n\r\n /**\r\n * The invocation mode with Net.powerShellApiInvokeCommand API.\r\n * Default is WorkItem which uses WebSocket communication.\r\n * Polling mode uses pooled runspaces on the gateway and the gateway will recycle and shutdown them automatically.\r\n */\r\n invokeMode?: 'WorkItem' | 'Polling';\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The PowerShellSession class.\r\n */\r\nexport class PowerShellSession implements Disposable {\r\n /**\r\n * Initializes a new instance of the PowerShellSession class.\r\n *\r\n * @param powerShell the PowerShell object.\r\n * @param lifetime the disposable lifetime manager object.\r\n */\r\n public constructor(powerShell: PowerShell);\r\n public constructor(powerShell: PowerShell, lifetime: DisposableLifetimeManager);\r\n public constructor(public powerShell: PowerShell, private lifetime?: DisposableLifetimeManager) {\r\n }\r\n\r\n /**\r\n * Gets the node name of session.\r\n */\r\n public get nodeName(): string {\r\n return this.powerShell.nodeName;\r\n }\r\n\r\n /**\r\n * Dispose the session object.\r\n */\r\n public dispose(): void {\r\n if (this.lifetime) {\r\n this.lifetime.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport interface FallbackError extends AjaxError {\r\n handlerError: {\r\n message: string;\r\n code: 'ManageAsDialogCancel';\r\n };\r\n}\r\n\r\n/**\r\n * Class containing methods related to PowerShell runspace creation/deletion/command using PowerShell Raw API plugin.\r\n * - It's auto holding the session as long as it's used within last 3 minutes.\r\n */\r\nexport class PowerShellRaw implements Disposable {\r\n // 3 minutes holding time.\r\n private static maxDeltaTimeInMs: number = 3 * 60 * 1000;\r\n private sessionId: string;\r\n private timestampInMs = 0;\r\n private markDelete = false;\r\n private internalActive = false;\r\n private cancelPending = false;\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellRaw class.\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param context The context of PowerShell run.\r\n */\r\n constructor(private nodeConnection: NodeConnection, private context: PowerShellContext) {\r\n }\r\n\r\n /**\r\n * Gets active status of PowerShell execution.\r\n */\r\n public get active(): boolean {\r\n return this.internalActive;\r\n }\r\n\r\n /**\r\n * Dispose the runspace.\r\n */\r\n public dispose(): void {\r\n if (!this.active) {\r\n // only close sessions that have been created.\r\n // If a result was cached a component may not\r\n // execute a command and still dispose the session\r\n // when the component is destroyed.\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n } else {\r\n this.markDelete = true;\r\n }\r\n }\r\n\r\n /**\r\n * Runs the given command\r\n *\r\n * @param command The command to execute.\r\n * @param options the powershell options.\r\n */\r\n public runCommand(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n // take the timestamp only success/healthy case.\r\n // error session would be auto-deleted after expiration time.\r\n this.internalActive = true;\r\n return this.command(command, options)\r\n .pipe(\r\n catchError((error) => this.fallbackToJea(error, command, options)),\r\n expand((data: any, index: number) => {\r\n this.timestampInMs = Date.now();\r\n if (this.checkCompleted(data)) {\r\n return empty();\r\n }\r\n\r\n if (this.cancelPending) {\r\n // submit cancel request.\r\n // after set active state to false and complete the observable.\r\n this.cancelPending = false;\r\n return this.cancel()\r\n .pipe(\r\n catchError((error, caught) => {\r\n this.internalActive = false;\r\n return empty();\r\n }),\r\n mergeMap(x => {\r\n this.internalActive = false;\r\n return empty();\r\n }));\r\n }\r\n\r\n const url = Net.powerShellApiRetrieveOutput.format(this.sessionId);\r\n return this.nodeConnection.get(this.context.nodeName, url, this.context.requestOptions)\r\n .pipe(\r\n catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return this.fallbackToJea(error, command, options);\r\n }\r\n ));\r\n }));\r\n }\r\n\r\n /**\r\n * Close/Delete the session / runspace.\r\n */\r\n public close(): void {\r\n if (this.context.requestOptions.automatic) {\r\n return;\r\n }\r\n\r\n if (this.sessionId) {\r\n const sessionUri: string = Net.powerShellApiSessions.format(this.sessionId);\r\n this.sessionId = null;\r\n this.nodeConnection.deleteQuick(this.context.nodeName, sessionUri, <NodeRequestOptions>this.context.requestOptions);\r\n return;\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Verbose,\r\n source: 'PowerShell/close',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableSessionClose.message\r\n });\r\n }\r\n\r\n /**\r\n * Cancel the command.\r\n */\r\n public cancelCommand(): Observable<any> {\r\n if (this.internalActive) {\r\n this.cancelPending = true;\r\n }\r\n\r\n return empty();\r\n }\r\n\r\n /**\r\n * Perform the JEA fallback, if applicable.\r\n *\r\n * @param error The error to handle\r\n * @param command The command\r\n * @param options The request options\r\n */\r\n private fallbackToJea(error: FallbackError, command: PowerShellCommand, options: PowerShellOptions): Observable<any> {\r\n const authError = Net.isUnauthorized(error) || error.status === HttpStatusCode.BadRequest;\r\n const responseEndpoint = error && error.xhr && error.xhr.getResponseHeader(headerConstants.POWERSHELL_ENDPOINT);\r\n let requestEndpoint = (options && options.powerShellEndpoint);\r\n requestEndpoint = requestEndpoint || (this.context.requestOptions && this.context.requestOptions.powerShellEndpoint);\r\n const cancel = error.handlerError && error.handlerError.code && error.handlerError.code === 'ManageAsDialogCancel';\r\n const credSSP = (options && options.authenticationMechanism === 'Credssp');\r\n\r\n if (!cancel && authError && responseEndpoint && requestEndpoint !== responseEndpoint && !credSSP) {\r\n this.context.requestOptions.powerShellEndpoint = responseEndpoint;\r\n return this.command(command, options)\r\n .pipe(tap(() => {\r\n // The JEA request went through - persist this context in authorization manager.\r\n this.nodeConnection.saveJeaContext(this.context.nodeName, responseEndpoint);\r\n }));\r\n }\r\n\r\n // close on error if sessionId is available.\r\n if (options && options.closeOnError) {\r\n if (!this.sessionId) {\r\n this.sessionId = error && error.xhr && error.xhr.response && error.xhr.response.sessionId;\r\n }\r\n\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n }\r\n\r\n this.internalActive = false;\r\n return throwError(error);\r\n }\r\n\r\n private cancel(): Observable<any> {\r\n if (this.sessionId && this.internalActive) {\r\n const cancelUri: string = Net.powerShellApiCancelCommand.format(this.sessionId);\r\n return this.nodeConnection.post(this.context.nodeName, cancelUri, null, this.context.requestOptions);\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Warning,\r\n source: 'PowerShell',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableCancelCommand.message\r\n });\r\n return empty();\r\n }\r\n\r\n /**\r\n * Gets if timestamp was expired.\r\n */\r\n private get _isExpired(): boolean {\r\n const now = Date.now();\r\n return this.timestampInMs !== 0 && (now - this.timestampInMs) > PowerShellRaw.maxDeltaTimeInMs;\r\n }\r\n\r\n /**\r\n * Initiate command execution. It auto recycles old sessions.\r\n *\r\n * @param command the PowerShell command.\r\n */\r\n private command(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const commandPacket: PowerShellCommandPacket = { ...command };\r\n\r\n commandPacket.useInProcRunspace = !!options?.useInProcRunspace;\r\n\r\n const polling = !!this.context.requestOptions.automatic;\r\n if (polling) {\r\n commandPacket.invokeMode = 'Polling';\r\n }\r\n\r\n if (options && options.waitTimeMs) {\r\n commandPacket.waitTimeMs = options.waitTimeMs;\r\n }\r\n\r\n const data = Net.createPropertiesJSONString(commandPacket);\r\n const newOptions: NodeRequestOptions = <NodeRequestOptions>{\r\n ...this.context.requestOptions,\r\n ...{\r\n logAudit: options && options.logAudit,\r\n logTelemetry: options && options.logTelemetry\r\n }\r\n };\r\n\r\n const endpoint = options && options.powerShellEndpoint;\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n const token = options && options.authToken;\r\n if (token) {\r\n newOptions.authToken = token;\r\n }\r\n\r\n const authenticationMechanism = options && options.authenticationMechanism;\r\n if (authenticationMechanism) {\r\n newOptions.authenticationMechanism = authenticationMechanism;\r\n }\r\n\r\n let commandResponse: Observable<any>;\r\n if (polling) {\r\n this.sessionId = null;\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, Net.powerShellApiInvokeCommand, data, newOptions);\r\n } else if (this.sessionId == null || this._isExpired) {\r\n this.sessionId = null;\r\n const generatedName = this.context.key ? this.context.key + '-newSession' : 'instantSession';\r\n const sessionUri: string = Net.powerShellApiSessions.format(generatedName);\r\n commandResponse = this.nodeConnection.put(this.context.nodeName, sessionUri, data, newOptions);\r\n } else {\r\n const executeUri: string = Net.powerShellApiExecuteCommand.format(this.sessionId);\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, executeUri, data, newOptions);\r\n }\r\n return commandResponse.pipe(catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private checkCompleted(data: any): boolean {\r\n const properties: any = Net.getItemProperties(data);\r\n if (properties.sessionId) {\r\n // keep the PS session GUID\r\n this.sessionId = properties.sessionId;\r\n }\r\n\r\n if (properties.completed.toLowerCase() === 'true') {\r\n this.internalActive = false;\r\n if (this.markDelete) {\r\n this.close();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * The PowerShell class.\r\n *\r\n * - Single instance of PowerShell class manages single runspace.\r\n * - It queues coming requests and process one at a time sequentially.\r\n * - If a command is slow and causing with multiple responses, it aggregates response into single Q result.\r\n * - A PowerShell instance should be created through create() function, and it's statically stored/managed into _map collection.\r\n * - In QueryCache operation, it can find the PowerShell instance to run PowerShell command by using find() function.\r\n * - Once all lifetime references are gone, it deletes the runspace.\r\n * - To dispose the PowerShell instance, it can use lifetime.dispose().\r\n */\r\nexport class PowerShell {\r\n /**\r\n * Default PowerShell endpoint.\r\n */\r\n public static defaultPowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.powershell';\r\n\r\n /**\r\n * SME PowerShell endpoint.\r\n */\r\n public static smePowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.powershell';\r\n\r\n /**\r\n * SME CredSSP PowerShell endpoint to control client role of CredSSP on the gateway.\r\n */\r\n\r\n public static smeCredSSPEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.credssp';\r\n\r\n /**\r\n * Static collection of PowerShell objects.\r\n */\r\n private static map: MsftSme.StringMap<PowerShell> = {};\r\n\r\n /**\r\n * Regular expression to match all the occurrences of a single quote\r\n */\r\n private static escapeRegex = new RegExp('\\'', 'g');\r\n\r\n /**\r\n * The context of PowerShell object.\r\n */\r\n private context: PowerShellContext;\r\n\r\n /**\r\n * The queue of PowerShell command requests.\r\n */\r\n private queue: PowerShellCommandItem[] = [];\r\n\r\n /**\r\n * The reference to PowerShellRaw class object.\r\n */\r\n private raw: PowerShellRaw;\r\n\r\n /**\r\n * Current data to aggregate from multiple data responses.\r\n */\r\n private currentData: any;\r\n\r\n /**\r\n * Timestamp when last command started.\r\n */\r\n private timestamp: number;\r\n\r\n /**\r\n * Create script as string.\r\n * (Notes: Use createCommand() function which is based on PowerShell module,\r\n * Update gulpfile.js to generate a PowerShell module to support Show script, JEA and localization.)\r\n *\r\n * @param resource the script text from legacy ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n */\r\n public static createScript(\r\n script: string,\r\n parameters?: any,\r\n flags?: string[]): string {\r\n script = 'function cvt ($o) { return ConvertFrom-Json $o }\\n function SmeSubmit {\\n' + script + '}\\n SmeSubmit';\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n }\r\n }\r\n\r\n return script;\r\n }\r\n\r\n /**\r\n * Create PowerShell request command.\r\n * (It creates a command object of JEA PowerShell request under restricted user role environment.)\r\n *\r\n * @param resource the script resource object with command and script data from new ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n * @return PowerShellCommand the PowerShell request command object.\r\n */\r\n public static createCommand(\r\n resource: { command: string, script: string, module?: string },\r\n parameters?: any,\r\n flags?: string[],\r\n resourceName?: string): PowerShellCommand {\r\n // step1: Add Jea prefix dynamically\r\n const powerShellPrefix = MsftSme.self().Init.powerShellPrefix;\r\n let command = resource.command;\r\n if (powerShellPrefix && resource && resource.command) {\r\n command = PowerShell.addPowerShellPrefix(powerShellPrefix, resource.command);\r\n }\r\n\r\n // step2: Adding parameters converter from JSON to PowerShell.\r\n // step3: Surround full content into SmeSubmit function.\r\n let script = 'function cvt($o){return ConvertFrom-Json $o}\\n function SmeSubmit{\\n' + resource.script + '}\\nSmeSubmit';\r\n\r\n // step4: Adding localized resources strings overriding Import-LocalizedData as function.\r\n if (resourceName) {\r\n const strings = MsftSme.getStrings<any>()[resourceName];\r\n if (strings && strings['PowerShell']) {\r\n const items = strings['PowerShell'];\r\n const keys = Object.keys(items);\r\n const rightSingleQuotationMark = '\\u2019';\r\n const lines = keys.map(key =>\r\n (key + '=\\''\r\n + items[key]\r\n .split(rightSingleQuotationMark)\r\n .join('\\'\\'')\r\n .split('\\'')\r\n .join('\\'\\'')\r\n + '\\'\\n'));\r\n script = 'function Import-LocalizedData{$script:strings=@{\\n' + lines.join('') + '}}' + script;\r\n }\r\n }\r\n\r\n // step5: Adding each parameter with using converter.\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n // step6: Adding switch parameters.\r\n const flagParameters = {};\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n flagParameters[flags[i]] = true;\r\n }\r\n }\r\n\r\n return <PowerShellCommand>{\r\n module: resource.module,\r\n command,\r\n parameters: { ...flagParameters, ...parameters },\r\n script,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Find or create new PowerShell object.\r\n *\r\n * @param nodeName The node to connect to.\r\n * @param nodeConnection The node connection.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n * @param requestOptions the options to apply to every request in this session\r\n */\r\n public static create(nodeName: string, nodeConnection: NodeConnection): PowerShell;\r\n public static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n requestOptions: PowerShellSessionRequestOptions): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key?: string,\r\n lifetime?: DisposableLifetimeManager,\r\n requestOptions?: PowerShellSessionRequestOptions): PowerShell {\r\n let ps: PowerShell;\r\n if (key && lifetime) {\r\n ps = PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n if (ps) {\r\n ps.addLifetime(lifetime);\r\n return ps;\r\n }\r\n }\r\n\r\n ps = new PowerShell(nodeName, nodeConnection, key, lifetime, requestOptions);\r\n if (key && lifetime) {\r\n PowerShell.map[PowerShell.indexName(nodeName, key)] = ps;\r\n }\r\n\r\n return ps;\r\n }\r\n\r\n /**\r\n * Find existing PowerShell object. Create call must be called before to create the PowerShell instance.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n public static find(nodeName: string, key: string): PowerShell {\r\n return PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n }\r\n\r\n /**\r\n * Gets the command object from string or PowerShellCommand.\r\n *\r\n * @param scriptOrCommand the script string or PowerShellCommand object.\r\n */\r\n public static getPowerShellCommand(scriptOrCommand: string | PowerShellCommand): PowerShellCommand {\r\n return typeof scriptOrCommand === 'string' ?\r\n {\r\n script: <string>scriptOrCommand,\r\n command: null,\r\n module: null,\r\n state: 'ready'\r\n }\r\n : {\r\n script: scriptOrCommand.script,\r\n command: scriptOrCommand.command,\r\n module: scriptOrCommand.module || MsftSme.self().Init.powerShellModuleName,\r\n parameters: scriptOrCommand.parameters,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Create new options with debugging endpoint if requested.\r\n *\r\n * @param options the PowerShell session request options.\r\n */\r\n public static newEndpointOptions(options: NodeRequestOptions): NodeRequestOptions {\r\n // if there is no endpoint but configured with powerShellEndpoint, set debugging endpoint.\r\n const newOptions = { ...(options || {}) };\r\n if (!newOptions.powerShellEndpoint && MsftSme.self().Init.powerShellEndpoint) {\r\n newOptions.powerShellEndpoint = MsftSme.self().Init.powerShellEndpoint;\r\n }\r\n\r\n return newOptions;\r\n }\r\n\r\n /**\r\n * Create the index name in map collection.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n private static indexName(nodeName: string, key: string): string {\r\n return nodeName + ':' + key;\r\n }\r\n\r\n /**\r\n * Adds jea prefix to the command name\r\n *\r\n * @param jeaPrefix The jea prefix originating from main.ts.\r\n * @param command The powershell command to run.\r\n */\r\n private static addPowerShellPrefix(powerShellPrefix: string, command: string): string {\r\n const hyphenSeparatorIndex = command.indexOf('-');\r\n const verb = command.substring(0, hyphenSeparatorIndex);\r\n const target = command.substring(hyphenSeparatorIndex + 1);\r\n if (target.indexOf(powerShellPrefix) === 0) {\r\n throw new Error('Command already contains prefix');\r\n }\r\n\r\n return verb + '-' + powerShellPrefix + target;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShell class.\r\n * (private constructor which shouldn't be called directly.)\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n */\r\n constructor(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n options: PowerShellSessionRequestOptions) {\r\n this.context = {\r\n nodeName: nodeName,\r\n key: key,\r\n lifetimes: [],\r\n requestOptions: PowerShell.newEndpointOptions(options)\r\n };\r\n this.timestamp = 0;\r\n this.raw = new PowerShellRaw(nodeConnection, this.context);\r\n if (key && lifetime) {\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n this.context.lifetimes.push(lifetime);\r\n }\r\n }\r\n\r\n /**\r\n * Gets node name from current context.\r\n */\r\n public get nodeName(): string {\r\n return this.context.nodeName;\r\n }\r\n\r\n /**\r\n * Run PowerShell command.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n * @return PromiseV The result of PowerShell command.\r\n */\r\n public run(scriptOrCommand: string | PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n if (this.context.lifetimes.length === 0) {\r\n // no disposer is assigned, force to close the session after every query.\r\n const timeoutMs: number = options && options.timeoutMs;\r\n\r\n if (options) {\r\n options.timeoutMs = timeoutMs;\r\n options.close = true;\r\n } else {\r\n options = { timeoutMs: timeoutMs, close: true };\r\n }\r\n }\r\n\r\n // queue the request.\r\n const observable = this.enqueue(command, options);\r\n return observable;\r\n }\r\n\r\n /**\r\n * Cancel PowerShell command.\r\n */\r\n public cancel(): Observable<any> {\r\n return this.raw.cancelCommand();\r\n }\r\n\r\n /**\r\n * Enqueue a command request.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n */\r\n private enqueue(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n return Observable.create((observer: Observer<any>) => {\r\n this.queue.push(<PowerShellCommandItem>{ observer, command, options });\r\n this.dequeue();\r\n });\r\n }\r\n\r\n /**\r\n * Dequeue a command request.\r\n */\r\n private dequeue(): boolean {\r\n if (this.raw.active) {\r\n return false;\r\n }\r\n\r\n const item: PowerShellCommandItem = this.queue.shift();\r\n if (item) {\r\n this.currentData = null;\r\n this.timestamp = Date.now();\r\n this.raw.runCommand(item.command, item.options).subscribe(\r\n data => {\r\n const properties: any = Net.getItemProperties(data);\r\n this.collect(\r\n properties,\r\n item.options && item.options.timeoutMs,\r\n item.options && item.options.partial ? item.observer : null);\r\n },\r\n error => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n item.observer.error(error);\r\n this.timestamp = 0;\r\n this.dequeue();\r\n },\r\n () => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n if (!item.options || !item.options.partial) {\r\n item.observer.next(this.currentData);\r\n }\r\n\r\n item.observer.complete();\r\n this.timestamp = 0;\r\n this.dequeue();\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Collect response result and aggregate into single object.\r\n *\r\n * @param properties The properties of response object.\r\n * @param timeoutMs The timeout to cancel command.\r\n * @param observer The observer of powershell results.\r\n */\r\n private collect(properties: any, timeoutMs: number, observer: Observer<any>): void {\r\n if (timeoutMs && this.timestamp && (Date.now() - this.timestamp > timeoutMs)) {\r\n // force to cancel the command because of unexpected longer execution.\r\n this.raw.cancelCommand();\r\n this.timestamp = 0;\r\n return;\r\n }\r\n\r\n if (observer) {\r\n // return partial data if observer is not null.\r\n observer.next(properties);\r\n this.currentData = properties;\r\n return;\r\n }\r\n\r\n if (this.currentData != null && this.currentData.results && properties.results) {\r\n let array: any[];\r\n if (MsftSme.getTypeOf(this.currentData.results) === 'array') {\r\n array = this.currentData.results;\r\n } else {\r\n array = [this.currentData.results];\r\n }\r\n\r\n if (MsftSme.getTypeOf(properties.results) === 'array') {\r\n properties.results.forEach((x: any) => {\r\n array.push(x);\r\n });\r\n } else {\r\n array.push(properties.results);\r\n }\r\n\r\n this.currentData.results = array;\r\n return;\r\n }\r\n\r\n this.currentData = properties;\r\n }\r\n\r\n /**\r\n * Attach lifetime object to disposer when disposing.\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private addLifetime(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (!found) {\r\n this.context.lifetimes.push(lifetime);\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n }\r\n }\r\n\r\n /**\r\n * Callback when disposing the container of view model.\r\n * If none, reference the PowerShell object. Dispose it. (Delete runspace)\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private lifetimeDisposer(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (found) {\r\n MsftSme.remove(this.context.lifetimes, lifetime);\r\n if (this.context.lifetimes.length === 0) {\r\n // cancel queue command requests.\r\n this.queue.forEach((value: PowerShellCommandItem, index: number, array: PowerShellCommandItem[]) => {\r\n value.observer.next(null);\r\n value.observer.complete();\r\n });\r\n\r\n // delete from the map collection and delete the runspace/session.\r\n delete PowerShell.map[PowerShell.indexName(this.context.nodeName, this.context.key)];\r\n this.raw.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/data/powershell.ts"],"names":[],"mappings":"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","file":"powershell.js","sourcesContent":["\r\nimport { empty, Observable, Observer, throwError } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, expand, mergeMap, tap } from 'rxjs/operators';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { SmeWebTelemetry } from '../diagnostics/sme-web-telemetry';\r\nimport { TelemetryEventStates } from '../diagnostics/sme-web-telemetry-models';\r\nimport { Strings } from '../generated/strings';\r\nimport { Disposable, DisposableLifetimeManager, Disposer } from './disposable';\r\nimport { headerConstants, HttpStatusCode } from './http-constants';\r\nimport { Net } from './net';\r\nimport { NodeConnection, NodeRequestOptions } from './node-connection';\r\n\r\n/**\r\n * PowerShell run options.\r\n */\r\nexport interface PowerShellOptions extends NodeRequestOptions {\r\n /**\r\n * Close the runspace after the call.\r\n * (default is false)\r\n */\r\n close?: boolean;\r\n\r\n /**\r\n * Close the runspace on error.\r\n */\r\n closeOnError?: boolean;\r\n\r\n /**\r\n * Timeout milliseconds to shutdown the session.\r\n * (default is null and forever)\r\n */\r\n timeoutMs?: number;\r\n\r\n /**\r\n * Processing data progressively instead of waiting all result.\r\n */\r\n partial?: boolean;\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The node request options to control the underlying node connections in a powershell session\r\n */\r\nexport interface PowerShellSessionRequestOptions extends NodeRequestOptions {\r\n /**\r\n * Specify the session pool mode on the gateway.\r\n */\r\n automatic?: boolean;\r\n}\r\n\r\n/**\r\n * PowerShell context object interface.\r\n */\r\nexport interface PowerShellContext {\r\n /**\r\n * The node name.\r\n */\r\n nodeName: string;\r\n\r\n /**\r\n * The shared key name for runspace.\r\n */\r\n key: string;\r\n\r\n /**\r\n * The array of referenced containers.\r\n */\r\n lifetimes: DisposableLifetimeManager[];\r\n\r\n /**\r\n * The request options for the powershell session\r\n */\r\n requestOptions: PowerShellSessionRequestOptions;\r\n}\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\n export interface PowerShellCommandWithoutState {\r\n /**\r\n * The name of PowerShell module. (optional, it uses default module if not specified.)\r\n */\r\n module?: string;\r\n\r\n /**\r\n * The command name.\r\n */\r\n command: string;\r\n\r\n /**\r\n * The parameters (arguments).\r\n */\r\n parameters?: any;\r\n\r\n /**\r\n * The script string.\r\n */\r\n script: string;\r\n}\r\n\r\n\r\n/**\r\n * PowerShell command object.\r\n */\r\nexport interface PowerShellCommand extends PowerShellCommandWithoutState {\r\n /**\r\n * The state of command object.\r\n */\r\n state: string;\r\n}\r\n\r\n/**\r\n * PowerShell command queue item.\r\n */\r\nexport interface PowerShellCommandItem {\r\n /**\r\n * The command to execute.\r\n */\r\n command: PowerShellCommand;\r\n\r\n /**\r\n * Options for how to handle the command (reserved)\r\n */\r\n options?: PowerShellOptions;\r\n\r\n /**\r\n * Deferred object currently waiting for command run.\r\n */\r\n observer: Observer<any>;\r\n}\r\n\r\ninterface PowerShellCommandPacket extends PowerShellCommand {\r\n\r\n /**\r\n * The invocation mode with Net.powerShellApiInvokeCommand API.\r\n * Default is WorkItem which uses WebSocket communication.\r\n * Polling mode uses pooled runspaces on the gateway and the gateway will recycle and shutdown them automatically.\r\n */\r\n invokeMode?: 'WorkItem' | 'Polling';\r\n\r\n /**\r\n * Specify the initial waiting time before starting polling of result of invoke script.\r\n */\r\n waitTimeMs?: number;\r\n}\r\n\r\n/**\r\n * The PowerShellSession class.\r\n */\r\nexport class PowerShellSession implements Disposable {\r\n /**\r\n * Initializes a new instance of the PowerShellSession class.\r\n *\r\n * @param powerShell the PowerShell object.\r\n * @param lifetime the disposable lifetime manager object.\r\n */\r\n public constructor(powerShell: PowerShell);\r\n public constructor(powerShell: PowerShell, lifetime: DisposableLifetimeManager);\r\n public constructor(public powerShell: PowerShell, private lifetime?: DisposableLifetimeManager) {\r\n }\r\n\r\n /**\r\n * Gets the node name of session.\r\n */\r\n public get nodeName(): string {\r\n return this.powerShell.nodeName;\r\n }\r\n\r\n /**\r\n * Dispose the session object.\r\n */\r\n public dispose(): void {\r\n if (this.lifetime) {\r\n this.lifetime.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport interface FallbackError extends AjaxError {\r\n handlerError: {\r\n message: string;\r\n code: 'ManageAsDialogCancel';\r\n };\r\n}\r\n\r\n/**\r\n * Class containing methods related to PowerShell runspace creation/deletion/command using PowerShell Raw API plugin.\r\n * - It's auto holding the session as long as it's used within last 3 minutes.\r\n */\r\nexport class PowerShellRaw implements Disposable {\r\n // 3 minutes holding time.\r\n private static maxDeltaTimeInMs: number = 3 * 60 * 1000;\r\n private sessionId: string;\r\n private timestampInMs = 0;\r\n private markDelete = false;\r\n private internalActive = false;\r\n private cancelPending = false;\r\n\r\n /**\r\n * Initializes a new instance of the PowerShellRaw class.\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param context The context of PowerShell run.\r\n */\r\n constructor(private nodeConnection: NodeConnection, private context: PowerShellContext) {\r\n }\r\n\r\n /**\r\n * Gets active status of PowerShell execution.\r\n */\r\n public get active(): boolean {\r\n return this.internalActive;\r\n }\r\n\r\n /**\r\n * Dispose the runspace.\r\n */\r\n public dispose(): void {\r\n if (!this.active) {\r\n // only close sessions that have been created.\r\n // If a result was cached a component may not\r\n // execute a command and still dispose the session\r\n // when the component is destroyed.\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n } else {\r\n this.markDelete = true;\r\n }\r\n }\r\n\r\n /**\r\n * Runs the given command\r\n *\r\n * @param command The command to execute.\r\n * @param options the powershell options.\r\n */\r\n public runCommand(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n // take the timestamp only success/healthy case.\r\n // error session would be auto-deleted after expiration time.\r\n this.internalActive = true;\r\n return this.command(command, options)\r\n .pipe(\r\n catchError((error) => this.fallbackToJea(error, command, options)),\r\n expand((data: any, index: number) => {\r\n this.timestampInMs = Date.now();\r\n if (this.checkCompleted(data)) {\r\n return empty();\r\n }\r\n\r\n if (this.cancelPending) {\r\n // submit cancel request.\r\n // after set active state to false and complete the observable.\r\n this.cancelPending = false;\r\n return this.cancel()\r\n .pipe(\r\n catchError((error, caught) => {\r\n this.internalActive = false;\r\n return empty();\r\n }),\r\n mergeMap(x => {\r\n this.internalActive = false;\r\n return empty();\r\n }));\r\n }\r\n\r\n const url = Net.powerShellApiRetrieveOutput.format(this.sessionId);\r\n return this.nodeConnection.get(this.context.nodeName, url, this.context.requestOptions)\r\n .pipe(\r\n catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return this.fallbackToJea(error, command, options);\r\n }\r\n ));\r\n }));\r\n }\r\n\r\n /**\r\n * Close/Delete the session / runspace.\r\n */\r\n public close(): void {\r\n if (this.context.requestOptions.automatic) {\r\n return;\r\n }\r\n\r\n if (this.sessionId) {\r\n const sessionUri: string = Net.powerShellApiSessions.format(this.sessionId);\r\n this.sessionId = null;\r\n this.nodeConnection.deleteQuick(this.context.nodeName, sessionUri, <NodeRequestOptions>this.context.requestOptions);\r\n return;\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Verbose,\r\n source: 'PowerShell/close',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableSessionClose.message\r\n });\r\n }\r\n\r\n /**\r\n * Cancel the command.\r\n */\r\n public cancelCommand(): Observable<any> {\r\n if (this.internalActive) {\r\n this.cancelPending = true;\r\n }\r\n\r\n return empty();\r\n }\r\n\r\n /**\r\n * Perform the JEA fallback, if applicable.\r\n *\r\n * @param error The error to handle\r\n * @param command The command\r\n * @param options The request options\r\n */\r\n private fallbackToJea(error: FallbackError, command: PowerShellCommand, options: PowerShellOptions): Observable<any> {\r\n const authError = Net.isUnauthorized(error) || error.status === HttpStatusCode.BadRequest;\r\n const responseEndpoint = error && error.xhr && error.xhr.getResponseHeader(headerConstants.POWERSHELL_ENDPOINT);\r\n let requestEndpoint = (options && options.powerShellEndpoint);\r\n requestEndpoint = requestEndpoint || (this.context.requestOptions && this.context.requestOptions.powerShellEndpoint);\r\n const cancel = error.handlerError && error.handlerError.code && error.handlerError.code === 'ManageAsDialogCancel';\r\n const credSSP = (options && options.authenticationMechanism === 'Credssp');\r\n\r\n if (!cancel && authError && responseEndpoint && requestEndpoint !== responseEndpoint && !credSSP) {\r\n this.context.requestOptions.powerShellEndpoint = responseEndpoint;\r\n return this.command(command, options)\r\n .pipe(tap(() => {\r\n // The JEA request went through - persist this context in authorization manager.\r\n this.nodeConnection.saveJeaContext(this.context.nodeName, responseEndpoint);\r\n }));\r\n }\r\n\r\n // close on error if sessionId is available.\r\n if (options && options.closeOnError) {\r\n if (!this.sessionId) {\r\n this.sessionId = error && error.xhr && error.xhr.response && error.xhr.response.sessionId;\r\n }\r\n\r\n if (this.sessionId) {\r\n this.close();\r\n }\r\n }\r\n\r\n this.internalActive = false;\r\n return throwError(error);\r\n }\r\n\r\n private cancel(): Observable<any> {\r\n if (this.sessionId && this.internalActive) {\r\n const cancelUri: string = Net.powerShellApiCancelCommand.format(this.sessionId);\r\n return this.nodeConnection.post(this.context.nodeName, cancelUri, null, this.context.requestOptions);\r\n }\r\n\r\n Logging.log({\r\n level: LogLevel.Warning,\r\n source: 'PowerShell',\r\n message: MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.PowerShellUnableCancelCommand.message\r\n });\r\n return empty();\r\n }\r\n\r\n /**\r\n * Gets if timestamp was expired.\r\n */\r\n private get _isExpired(): boolean {\r\n const now = Date.now();\r\n return this.timestampInMs !== 0 && (now - this.timestampInMs) > PowerShellRaw.maxDeltaTimeInMs;\r\n }\r\n\r\n /**\r\n * Initiate command execution. It auto recycles old sessions.\r\n *\r\n * @param command the PowerShell command.\r\n */\r\n private command(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const commandPacket: PowerShellCommandPacket = { ...command };\r\n const polling = !!this.context.requestOptions.automatic;\r\n if (polling) {\r\n commandPacket.invokeMode = 'Polling';\r\n }\r\n\r\n if (options && options.waitTimeMs) {\r\n commandPacket.waitTimeMs = options.waitTimeMs;\r\n }\r\n\r\n const data = Net.createPropertiesJSONString(commandPacket);\r\n const newOptions: NodeRequestOptions = <NodeRequestOptions>{\r\n ...this.context.requestOptions,\r\n ...{\r\n logAudit: options && options.logAudit,\r\n logTelemetry: options && options.logTelemetry\r\n }\r\n };\r\n\r\n const endpoint = options && options.powerShellEndpoint;\r\n if (endpoint) {\r\n newOptions.powerShellEndpoint = endpoint;\r\n }\r\n\r\n const token = options && options.authToken;\r\n if (token) {\r\n newOptions.authToken = token;\r\n }\r\n\r\n const authenticationMechanism = options && options.authenticationMechanism;\r\n if (authenticationMechanism) {\r\n newOptions.authenticationMechanism = authenticationMechanism;\r\n }\r\n\r\n let commandResponse: Observable<any>;\r\n if (polling) {\r\n this.sessionId = null;\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, Net.powerShellApiInvokeCommand, data, newOptions);\r\n } else if (this.sessionId == null || this._isExpired) {\r\n this.sessionId = null;\r\n const generatedName = this.context.key ? this.context.key + '-newSession' : 'instantSession';\r\n const sessionUri: string = Net.powerShellApiSessions.format(generatedName);\r\n commandResponse = this.nodeConnection.put(this.context.nodeName, sessionUri, data, newOptions);\r\n } else {\r\n const executeUri: string = Net.powerShellApiExecuteCommand.format(this.sessionId);\r\n commandResponse = this.nodeConnection.post(this.context.nodeName, executeUri, data, newOptions);\r\n }\r\n return commandResponse.pipe(catchError((error) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error, { response: error.response });\r\n return throwError(error);\r\n }));\r\n }\r\n\r\n private checkCompleted(data: any): boolean {\r\n const properties: any = Net.getItemProperties(data);\r\n if (properties.sessionId) {\r\n // keep the PS session GUID\r\n this.sessionId = properties.sessionId;\r\n }\r\n\r\n if (properties.completed.toLowerCase() === 'true') {\r\n this.internalActive = false;\r\n if (this.markDelete) {\r\n this.close();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * The PowerShell class.\r\n *\r\n * - Single instance of PowerShell class manages single runspace.\r\n * - It queues coming requests and process one at a time sequentially.\r\n * - If a command is slow and causing with multiple responses, it aggregates response into single Q result.\r\n * - A PowerShell instance should be created through create() function, and it's statically stored/managed into _map collection.\r\n * - In QueryCache operation, it can find the PowerShell instance to run PowerShell command by using find() function.\r\n * - Once all lifetime references are gone, it deletes the runspace.\r\n * - To dispose the PowerShell instance, it can use lifetime.dispose().\r\n */\r\nexport class PowerShell {\r\n /**\r\n * Default PowerShell endpoint.\r\n */\r\n public static defaultPowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.powershell';\r\n\r\n /**\r\n * SME PowerShell endpoint.\r\n */\r\n public static smePowerShellEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.powershell';\r\n\r\n /**\r\n * SME CredSSP PowerShell endpoint to control client role of CredSSP on the gateway.\r\n */\r\n\r\n public static smeCredSSPEndpoint = 'http://schemas.microsoft.com/powershell/microsoft.sme.credssp';\r\n\r\n /**\r\n * Static collection of PowerShell objects.\r\n */\r\n private static map: MsftSme.StringMap<PowerShell> = {};\r\n\r\n /**\r\n * Regular expression to match all the occurrences of a single quote\r\n */\r\n private static escapeRegex = new RegExp('\\'', 'g');\r\n\r\n /**\r\n * The context of PowerShell object.\r\n */\r\n private context: PowerShellContext;\r\n\r\n /**\r\n * The queue of PowerShell command requests.\r\n */\r\n private queue: PowerShellCommandItem[] = [];\r\n\r\n /**\r\n * The reference to PowerShellRaw class object.\r\n */\r\n private raw: PowerShellRaw;\r\n\r\n /**\r\n * Current data to aggregate from multiple data responses.\r\n */\r\n private currentData: any;\r\n\r\n /**\r\n * Timestamp when last command started.\r\n */\r\n private timestamp: number;\r\n\r\n /**\r\n * Create script as string.\r\n * (Notes: Use createCommand() function which is based on PowerShell module,\r\n * Update gulpfile.js to generate a PowerShell module to support Show script, JEA and localization.)\r\n *\r\n * @param resource the script text from legacy ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n */\r\n public static createScript(\r\n script: string,\r\n parameters?: any,\r\n flags?: string[]): string {\r\n script = 'function cvt ($o) { return ConvertFrom-Json $o }\\n function SmeSubmit {\\n' + script + '}\\n SmeSubmit';\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n }\r\n }\r\n\r\n return script;\r\n }\r\n\r\n /**\r\n * Create PowerShell request command.\r\n * (It creates a command object of JEA PowerShell request under restricted user role environment.)\r\n *\r\n * @param resource the script resource object with command and script data from new ps-code converter.\r\n * @param parameters the arguments.\r\n * @param flags (optional) the switch flags.\r\n * @return PowerShellCommand the PowerShell request command object.\r\n */\r\n public static createCommand(\r\n resource: { command: string, script: string, module?: string },\r\n parameters?: any,\r\n flags?: string[],\r\n resourceName?: string): PowerShellCommand {\r\n // step1: Add Jea prefix dynamically\r\n const powerShellPrefix = MsftSme.self().Init.powerShellPrefix;\r\n let command = resource.command;\r\n if (powerShellPrefix && resource && resource.command) {\r\n command = PowerShell.addPowerShellPrefix(powerShellPrefix, resource.command);\r\n }\r\n\r\n // step2: Adding parameters converter from JSON to PowerShell.\r\n // step3: Surround full content into SmeSubmit function.\r\n let script = 'function cvt($o){return ConvertFrom-Json $o}\\n function SmeSubmit{\\n' + resource.script + '}\\nSmeSubmit';\r\n\r\n // step4: Adding localized resources strings overriding Import-LocalizedData as function.\r\n if (resourceName) {\r\n const strings = MsftSme.getStrings<any>()[resourceName];\r\n if (strings && strings['PowerShell']) {\r\n const items = strings['PowerShell'];\r\n const keys = Object.keys(items);\r\n const rightSingleQuotationMark = '\\u2019';\r\n const lines = keys.map(key =>\r\n (key + '=\\''\r\n + items[key]\r\n .split(rightSingleQuotationMark)\r\n .join('\\'\\'')\r\n .split('\\'')\r\n .join('\\'\\'')\r\n + '\\'\\n'));\r\n script = 'function Import-LocalizedData{$script:strings=@{\\n' + lines.join('') + '}}' + script;\r\n }\r\n }\r\n\r\n // step5: Adding each parameter with using converter.\r\n for (const parameter in parameters) {\r\n if (parameters.hasOwnProperty(parameter)) {\r\n const value = parameters[parameter];\r\n\r\n if (value == null) {\r\n script += ' -{0} $null'.format(parameter);\r\n } else {\r\n script += ' -{0} (cvt \\'{1}\\')'.format(\r\n parameter,\r\n JSON.stringify(value).replace(PowerShell.escapeRegex, '\\'\\''));\r\n }\r\n }\r\n }\r\n\r\n // step6: Adding switch parameters.\r\n const flagParameters = {};\r\n if (flags) {\r\n for (let i = 0; i < flags.length; i++) {\r\n script += ' -{0}'.format(flags[i]);\r\n flagParameters[flags[i]] = true;\r\n }\r\n }\r\n\r\n return <PowerShellCommand>{\r\n module: resource.module,\r\n command,\r\n parameters: { ...flagParameters, ...parameters },\r\n script,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Find or create new PowerShell object.\r\n *\r\n * @param nodeName The node to connect to.\r\n * @param nodeConnection The node connection.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n * @param requestOptions the options to apply to every request in this session\r\n */\r\n public static create(nodeName: string, nodeConnection: NodeConnection): PowerShell;\r\n public static create(nodeName: string, nodeConnection: NodeConnection, key: string, lifetime: DisposableLifetimeManager): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n requestOptions: PowerShellSessionRequestOptions): PowerShell;\r\n public static create(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key?: string,\r\n lifetime?: DisposableLifetimeManager,\r\n requestOptions?: PowerShellSessionRequestOptions): PowerShell {\r\n let ps: PowerShell;\r\n if (key && lifetime) {\r\n ps = PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n if (ps) {\r\n ps.addLifetime(lifetime);\r\n return ps;\r\n }\r\n }\r\n\r\n ps = new PowerShell(nodeName, nodeConnection, key, lifetime, requestOptions);\r\n if (key && lifetime) {\r\n PowerShell.map[PowerShell.indexName(nodeName, key)] = ps;\r\n }\r\n\r\n return ps;\r\n }\r\n\r\n /**\r\n * Find existing PowerShell object. Create call must be called before to create the PowerShell instance.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n public static find(nodeName: string, key: string): PowerShell {\r\n return PowerShell.map[PowerShell.indexName(nodeName, key)];\r\n }\r\n\r\n /**\r\n * Gets the command object from string or PowerShellCommand.\r\n *\r\n * @param scriptOrCommand the script string or PowerShellCommand object.\r\n */\r\n public static getPowerShellCommand(scriptOrCommand: string | PowerShellCommand): PowerShellCommand {\r\n return typeof scriptOrCommand === 'string' ?\r\n {\r\n script: <string>scriptOrCommand,\r\n command: null,\r\n module: null,\r\n state: 'ready'\r\n }\r\n : {\r\n script: scriptOrCommand.script,\r\n command: scriptOrCommand.command,\r\n module: scriptOrCommand.module || MsftSme.self().Init.powerShellModuleName,\r\n parameters: scriptOrCommand.parameters,\r\n state: 'ready'\r\n };\r\n }\r\n\r\n /**\r\n * Create new options with debugging endpoint if requested.\r\n *\r\n * @param options the PowerShell session request options.\r\n */\r\n public static newEndpointOptions(options: NodeRequestOptions): NodeRequestOptions {\r\n // if there is no endpoint but configured with powerShellEndpoint, set debugging endpoint.\r\n const newOptions = { ...(options || {}) };\r\n if (!newOptions.powerShellEndpoint && MsftSme.self().Init.powerShellEndpoint) {\r\n newOptions.powerShellEndpoint = MsftSme.self().Init.powerShellEndpoint;\r\n }\r\n\r\n return newOptions;\r\n }\r\n\r\n /**\r\n * Create the index name in map collection.\r\n *\r\n * @param nodeName The node name.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n */\r\n private static indexName(nodeName: string, key: string): string {\r\n return nodeName + ':' + key;\r\n }\r\n\r\n /**\r\n * Adds jea prefix to the command name\r\n *\r\n * @param jeaPrefix The jea prefix originating from main.ts.\r\n * @param command The powershell command to run.\r\n */\r\n private static addPowerShellPrefix(powerShellPrefix: string, command: string): string {\r\n const hyphenSeparatorIndex = command.indexOf('-');\r\n const verb = command.substring(0, hyphenSeparatorIndex);\r\n const target = command.substring(hyphenSeparatorIndex + 1);\r\n if (target.indexOf(powerShellPrefix) === 0) {\r\n throw new Error('Command already contains prefix');\r\n }\r\n\r\n return verb + '-' + powerShellPrefix + target;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the PowerShell class.\r\n * (private constructor which shouldn't be called directly.)\r\n *\r\n * @param nodeConnection The node connection service.\r\n * @param key The shared key to queue the requests to use the single runspace.\r\n * @param lifetime The lifetime container.\r\n */\r\n constructor(\r\n nodeName: string,\r\n nodeConnection: NodeConnection,\r\n key: string,\r\n lifetime: DisposableLifetimeManager,\r\n options: PowerShellSessionRequestOptions) {\r\n this.context = {\r\n nodeName: nodeName,\r\n key: key,\r\n lifetimes: [],\r\n requestOptions: PowerShell.newEndpointOptions(options)\r\n };\r\n this.timestamp = 0;\r\n this.raw = new PowerShellRaw(nodeConnection, this.context);\r\n if (key && lifetime) {\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n this.context.lifetimes.push(lifetime);\r\n }\r\n }\r\n\r\n /**\r\n * Gets node name from current context.\r\n */\r\n public get nodeName(): string {\r\n return this.context.nodeName;\r\n }\r\n\r\n /**\r\n * Run PowerShell command.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n * @return PromiseV The result of PowerShell command.\r\n */\r\n public run(scriptOrCommand: string | PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n if (this.context.lifetimes.length === 0) {\r\n // no disposer is assigned, force to close the session after every query.\r\n const timeoutMs: number = options && options.timeoutMs;\r\n\r\n if (options) {\r\n options.timeoutMs = timeoutMs;\r\n options.close = true;\r\n } else {\r\n options = { timeoutMs: timeoutMs, close: true };\r\n }\r\n }\r\n\r\n // queue the request.\r\n const observable = this.enqueue(command, options);\r\n return observable;\r\n }\r\n\r\n /**\r\n * Cancel PowerShell command.\r\n */\r\n public cancel(): Observable<any> {\r\n return this.raw.cancelCommand();\r\n }\r\n\r\n /**\r\n * Enqueue a command request.\r\n *\r\n * @param command The command.\r\n * @param options The options.\r\n */\r\n private enqueue(command: PowerShellCommand, options?: PowerShellOptions): Observable<any> {\r\n return Observable.create((observer: Observer<any>) => {\r\n this.queue.push(<PowerShellCommandItem>{ observer, command, options });\r\n this.dequeue();\r\n });\r\n }\r\n\r\n /**\r\n * Dequeue a command request.\r\n */\r\n private dequeue(): boolean {\r\n if (this.raw.active) {\r\n return false;\r\n }\r\n\r\n const item: PowerShellCommandItem = this.queue.shift();\r\n if (item) {\r\n this.currentData = null;\r\n this.timestamp = Date.now();\r\n this.raw.runCommand(item.command, item.options).subscribe(\r\n data => {\r\n const properties: any = Net.getItemProperties(data);\r\n this.collect(\r\n properties,\r\n item.options && item.options.timeoutMs,\r\n item.options && item.options.partial ? item.observer : null);\r\n },\r\n error => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n item.observer.error(error);\r\n this.timestamp = 0;\r\n this.dequeue();\r\n },\r\n () => {\r\n if (item.options && item.options.close) {\r\n this.raw.close();\r\n }\r\n\r\n if (!item.options || !item.options.partial) {\r\n item.observer.next(this.currentData);\r\n }\r\n\r\n item.observer.complete();\r\n this.timestamp = 0;\r\n this.dequeue();\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Collect response result and aggregate into single object.\r\n *\r\n * @param properties The properties of response object.\r\n * @param timeoutMs The timeout to cancel command.\r\n * @param observer The observer of powershell results.\r\n */\r\n private collect(properties: any, timeoutMs: number, observer: Observer<any>): void {\r\n if (timeoutMs && this.timestamp && (Date.now() - this.timestamp > timeoutMs)) {\r\n // force to cancel the command because of unexpected longer execution.\r\n this.raw.cancelCommand();\r\n this.timestamp = 0;\r\n return;\r\n }\r\n\r\n if (observer) {\r\n // return partial data if observer is not null.\r\n observer.next(properties);\r\n this.currentData = properties;\r\n return;\r\n }\r\n\r\n if (this.currentData != null && this.currentData.results && properties.results) {\r\n let array: any[];\r\n if (MsftSme.getTypeOf(this.currentData.results) === 'array') {\r\n array = this.currentData.results;\r\n } else {\r\n array = [this.currentData.results];\r\n }\r\n\r\n if (MsftSme.getTypeOf(properties.results) === 'array') {\r\n properties.results.forEach((x: any) => {\r\n array.push(x);\r\n });\r\n } else {\r\n array.push(properties.results);\r\n }\r\n\r\n this.currentData.results = array;\r\n return;\r\n }\r\n\r\n this.currentData = properties;\r\n }\r\n\r\n /**\r\n * Attach lifetime object to disposer when disposing.\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private addLifetime(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (!found) {\r\n this.context.lifetimes.push(lifetime);\r\n lifetime.registerForDispose(new Disposer(() => this.lifetimeDisposer(lifetime)));\r\n }\r\n }\r\n\r\n /**\r\n * Callback when disposing the container of view model.\r\n * If none, reference the PowerShell object. Dispose it. (Delete runspace)\r\n *\r\n * @param lifetime The lifetime object.\r\n */\r\n private lifetimeDisposer(lifetime: DisposableLifetimeManager): void {\r\n const found: DisposableLifetimeManager = MsftSme.find(\r\n this.context.lifetimes, (value: DisposableLifetimeManager) => value === lifetime);\r\n if (found) {\r\n MsftSme.remove(this.context.lifetimes, lifetime);\r\n if (this.context.lifetimes.length === 0) {\r\n // cancel queue command requests.\r\n this.queue.forEach((value: PowerShellCommandItem, index: number, array: PowerShellCommandItem[]) => {\r\n value.observer.next(null);\r\n value.observer.complete();\r\n });\r\n\r\n // delete from the map collection and delete the runspace/session.\r\n delete PowerShell.map[PowerShell.indexName(this.context.nodeName, this.context.key)];\r\n this.raw.dispose();\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -17,18 +17,6 @@ export interface SmePerformanceData {
|
|
|
17
17
|
navigation?: any;
|
|
18
18
|
totalLoadTime: number;
|
|
19
19
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Holds lighthouse metrics to send via telemetry. See more details at https://web.dev/vitals/
|
|
22
|
-
*/
|
|
23
|
-
export interface LighthousePerformanceMetrics {
|
|
24
|
-
CumulativeLayoutShift?: number;
|
|
25
|
-
LargestContentfulPaint?: number;
|
|
26
|
-
FirstContentfulPaint?: number;
|
|
27
|
-
FirstInputDelay?: number;
|
|
28
|
-
TimeToFirstByte?: number;
|
|
29
|
-
TotalBlockingTime?: number;
|
|
30
|
-
TimeToInteractive?: number;
|
|
31
|
-
}
|
|
32
20
|
/**
|
|
33
21
|
* Class w/ all SME performance data to be sent via telemetry. Internal to SmeWebTelemetry.
|
|
34
22
|
* Numbers are converted to strings because we use toFixed to truncate numbers to avoid triggering MSCOM scrubbed
|
|
@@ -52,7 +40,6 @@ export interface TelemetryEventBody {
|
|
|
52
40
|
overrideValues?: IOverrideValues;
|
|
53
41
|
element?: Element;
|
|
54
42
|
performance?: SmePerformanceData;
|
|
55
|
-
lighthouse?: LighthousePerformanceMetrics;
|
|
56
43
|
notification?: RpcNotification;
|
|
57
44
|
custom?: any;
|
|
58
45
|
customProperties?: {
|
|
@@ -67,9 +54,8 @@ export declare enum TelemetryEvents {
|
|
|
67
54
|
PageView = 1,
|
|
68
55
|
ContentUpdate = 2,
|
|
69
56
|
Performance = 3,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Notification = 6
|
|
57
|
+
ModuleOpenPerformance = 4,
|
|
58
|
+
Notification = 5
|
|
73
59
|
}
|
|
74
60
|
/**
|
|
75
61
|
* Telemetry action types supported - corresponds to awa jsll action type dictionary.
|
|
@@ -85,7 +71,6 @@ export declare enum TelemetryEventTypes {
|
|
|
85
71
|
Informational = "info",
|
|
86
72
|
Error = "error",
|
|
87
73
|
Performance = "performance",
|
|
88
|
-
Lighthouse = "lighthouse",
|
|
89
74
|
Notification = "notification",
|
|
90
75
|
Powershell = "powershell"
|
|
91
76
|
}
|
|
@@ -100,9 +85,7 @@ export declare enum SmeMetaLabels {
|
|
|
100
85
|
InstallationType = "wac-installation-type",
|
|
101
86
|
Build = "wac-build",
|
|
102
87
|
Market = "market",
|
|
103
|
-
Environment = "env"
|
|
104
|
-
GatewayMode = "wac-gateway-mode",
|
|
105
|
-
GatewayOperationalMode = "wac-gateway-operational-mode"
|
|
88
|
+
Environment = "env"
|
|
106
89
|
}
|
|
107
90
|
/**
|
|
108
91
|
* Standard telemetry tracking event states
|
|
@@ -9,9 +9,8 @@ export var TelemetryEvents;
|
|
|
9
9
|
TelemetryEvents[TelemetryEvents["PageView"] = 1] = "PageView";
|
|
10
10
|
TelemetryEvents[TelemetryEvents["ContentUpdate"] = 2] = "ContentUpdate";
|
|
11
11
|
TelemetryEvents[TelemetryEvents["Performance"] = 3] = "Performance";
|
|
12
|
-
TelemetryEvents[TelemetryEvents["
|
|
13
|
-
TelemetryEvents[TelemetryEvents["
|
|
14
|
-
TelemetryEvents[TelemetryEvents["Notification"] = 6] = "Notification";
|
|
12
|
+
TelemetryEvents[TelemetryEvents["ModuleOpenPerformance"] = 4] = "ModuleOpenPerformance";
|
|
13
|
+
TelemetryEvents[TelemetryEvents["Notification"] = 5] = "Notification";
|
|
15
14
|
})(TelemetryEvents || (TelemetryEvents = {}));
|
|
16
15
|
/**
|
|
17
16
|
* Telemetry action types supported - corresponds to awa jsll action type dictionary.
|
|
@@ -29,7 +28,6 @@ export var TelemetryEventTypes;
|
|
|
29
28
|
TelemetryEventTypes["Informational"] = "info";
|
|
30
29
|
TelemetryEventTypes["Error"] = "error";
|
|
31
30
|
TelemetryEventTypes["Performance"] = "performance";
|
|
32
|
-
TelemetryEventTypes["Lighthouse"] = "lighthouse";
|
|
33
31
|
TelemetryEventTypes["Notification"] = "notification";
|
|
34
32
|
TelemetryEventTypes["Powershell"] = "powershell";
|
|
35
33
|
})(TelemetryEventTypes || (TelemetryEventTypes = {}));
|
|
@@ -46,8 +44,6 @@ export var SmeMetaLabels;
|
|
|
46
44
|
SmeMetaLabels["Build"] = "wac-build";
|
|
47
45
|
SmeMetaLabels["Market"] = "market";
|
|
48
46
|
SmeMetaLabels["Environment"] = "env";
|
|
49
|
-
SmeMetaLabels["GatewayMode"] = "wac-gateway-mode";
|
|
50
|
-
SmeMetaLabels["GatewayOperationalMode"] = "wac-gateway-operational-mode";
|
|
51
47
|
})(SmeMetaLabels || (SmeMetaLabels = {}));
|
|
52
48
|
/**
|
|
53
49
|
* Standard telemetry tracking event states
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry-models.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,oFAAoF;
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry-models.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,oFAAoF;AAuDpF;;GAEG;AACH,MAAM,CAAN,IAAY,eAOX;AAPD,WAAY,eAAe;IACvB,yDAAM,CAAA;IACN,6DAAQ,CAAA;IACR,uEAAa,CAAA;IACb,mEAAW,CAAA;IACX,uFAAqB,CAAA;IACrB,qEAAY,CAAA;AAChB,CAAC,EAPW,eAAe,KAAf,eAAe,QAO1B;AAED;;GAEG;AACF,MAAM,CAAN,IAAY,oBAGZ;AAHA,WAAY,oBAAoB;IAC7B,uCAAe,CAAA;IACf,oCAAY,CAAA;AAChB,CAAC,EAHY,oBAAoB,KAApB,oBAAoB,QAGhC;AAED;;GAEG;AACF,MAAM,CAAN,IAAY,mBAMZ;AANA,WAAY,mBAAmB;IAC5B,6CAAsB,CAAA;IACtB,sCAAe,CAAA;IACf,kDAA2B,CAAA;IAC3B,oDAA6B,CAAA;IAC7B,gDAAyB,CAAA;AAC7B,CAAC,EANY,mBAAmB,KAAnB,mBAAmB,QAM/B;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACrB,sCAAqB,CAAA;IACrB,0CAAyB,CAAA;IACzB,2DAA0C,CAAA;IAC1C,6CAA4B,CAAA;IAC5B,2DAA0C,CAAA;IAC1C,oCAAmB,CAAA;IACnB,kCAAiB,CAAA;IACjB,oCAAmB,CAAA;AACvB,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,oBAKX;AALD,WAAY,oBAAoB;IAC5B,2CAAmB,CAAA;IACnB,+CAAuB,CAAA;IACvB,uCAAe,CAAA;IACf,yCAAiB,CAAA;AACrB,CAAC,EALW,oBAAoB,KAApB,oBAAoB,QAK/B","file":"sme-web-telemetry-models.js","sourcesContent":["// 1DS documentation found at\r\n// https://1dsdocs.azurewebsites.net/getting-started/javascript-getting_started.html\r\n\r\n/**\r\n * This file contains override value interfaces from 1DS - we redefine these locally because we cannot take the npm package due to\r\n * it being from a private feed. Instead, we load the CDN and use our redefined interfaces to help everything mesh together.\r\n * Disable tslint interface prefix rule b/c these are 1DS libraries, avoid renaming to keep consistent.\r\n */\r\n\r\nimport { RpcNotification } from '../rpc/notification/rpc-notification-model';\r\n\r\n// tslint:disable:interface-name\r\n/************************************\r\n * WAC models\r\n ************************************/\r\n\r\n/**\r\n * Exposed class to hold sme performance data.\r\n */\r\nexport interface SmePerformanceData {\r\n label?: string;\r\n sme?: any;\r\n resources?: any;\r\n navigation?: any;\r\n totalLoadTime: number;\r\n}\r\n\r\n/**\r\n * Class w/ all SME performance data to be sent via telemetry. Internal to SmeWebTelemetry.\r\n * Numbers are converted to strings because we use toFixed to truncate numbers to avoid triggering MSCOM scrubbed\r\n * stream personal data removal (eg with phone numbers)\r\n */\r\nexport interface CompleteSmePerformanceData {\r\n extension: string;\r\n entryPointName: string;\r\n url: string;\r\n moduleOpened: boolean;\r\n label?: string;\r\n sme?: any;\r\n resources?: any;\r\n navigation?: any;\r\n totalLoadTime: string;\r\n}\r\n\r\n/**\r\n * Class to hold any kind of telemetry event parameters needed to fire an event.\r\n */\r\nexport interface TelemetryEventBody {\r\n overrideValues?: IOverrideValues;\r\n element?: Element;\r\n performance?: SmePerformanceData;\r\n notification?: RpcNotification;\r\n custom?: any;\r\n customProperties?: { [name: string]: any };\r\n}\r\n\r\n/**\r\n * Telemetry events supported.\r\n */\r\nexport enum TelemetryEvents {\r\n Action,\r\n PageView,\r\n ContentUpdate,\r\n Performance,\r\n ModuleOpenPerformance,\r\n Notification\r\n}\r\n\r\n/**\r\n * Telemetry action types supported - corresponds to awa jsll action type dictionary.\r\n */\r\n export enum TelemetryActionTypes {\r\n Automatic = 'A',\r\n Click = 'CL'\r\n}\r\n\r\n/**\r\n * Telemetry event types supported - labels type field in data dictionary within events.\r\n */\r\n export enum TelemetryEventTypes {\r\n Informational = 'info',\r\n Error = 'error',\r\n Performance = 'performance',\r\n Notification = 'notification',\r\n Powershell = 'powershell'\r\n}\r\n\r\n/**\r\n * Labels for WAC metadata tags\r\n */\r\nexport enum SmeMetaLabels {\r\n Language = 'wac-lang',\r\n IsProduction = 'wac-prod',\r\n ExtensionVersion = 'wac-extension-version',\r\n SessionId = 'wac-session-id',\r\n InstallationType = 'wac-installation-type',\r\n Build = 'wac-build',\r\n Market = 'market',\r\n Environment = 'env'\r\n}\r\n\r\n/**\r\n * Standard telemetry tracking event states\r\n */\r\nexport enum TelemetryEventStates {\r\n Started = 'started',\r\n Completed = 'completed',\r\n Error = 'error',\r\n Exited = 'exited'\r\n}\r\n\r\n/**\r\n * Include powershell details that may be helpful in telemetry, including response and psSessionId.\r\n * Data is kept as an optional any-helpful field kind of thing.\r\n */\r\nexport interface PowershellDetails {\r\n /**\r\n * Response object - this should be the response within the error if result is an AjaxError\r\n */\r\n response?: any;\r\n\r\n /**\r\n * Powershell session ID - used to map to PS command in telemetry\r\n */\r\n id?: string;\r\n\r\n /**\r\n * Any other miscellaneous data that would like to be sent.\r\n */\r\n otherData?: any;\r\n}\r\n\r\n/************************************\r\n * Override values interfaces\r\n ************************************/\r\n export interface IOverrideValues {\r\n /**\r\n * One of the awa.behavior values.\r\n */\r\n behavior?: number;\r\n /**\r\n * Page name\r\n */\r\n pageName?: string;\r\n /**\r\n * Page type\r\n */\r\n pageType?: string;\r\n /**\r\n * KVP to be added to the page tags collected\r\n */\r\n pageTags?: any;\r\n /**\r\n * Indicates if the event was fired automatically\r\n */\r\n isAuto?: boolean;\r\n}\r\n\r\n/**\r\n * Overrides for Page View event\r\n */\r\n export interface IPageViewOverrideValues extends IOverrideValues {\r\n /**\r\n * Uri of the referrer page\r\n */\r\n referrerUri?: string;\r\n}\r\n\r\n/**\r\n * Overrides for Page Action event\r\n */\r\nexport interface IPageActionOverrideValues extends IOverrideValues {\r\n /**\r\n * Uri of the referrer page\r\n */\r\n refUri?: string;\r\n /**\r\n * One of the awa.actionType values\r\n */\r\n actionType?: string;\r\n /**\r\n * Target uri for PageAction events\r\n */\r\n targetUri?: string;\r\n /**\r\n * Click coordinates relative to the top left of the fully rendered content area in the browser\r\n */\r\n clickCoordinateX?: number;\r\n /**\r\n * Click coordinates relative to the top left of the fully rendered content area in the browser\r\n */\r\n clickCoordinateY?: number;\r\n /**\r\n * KVP of the content\r\n */\r\n content?: any;\r\n /**\r\n * KVPs to be added to the content tags collected on a Page Action event; extends the items in the Content blob in Page Action events\r\n */\r\n contentTags?: any;\r\n}\r\n\r\n/**\r\n * Overrides for Content Update event\r\n */\r\nexport interface IContentUpdateOverrideValues extends IOverrideValues {\r\n /**\r\n * KVP of the content\r\n */\r\n content?: any;\r\n /**\r\n * Indicates if the Contentupdate event is the first ContentUpdate event\r\n */\r\n isDomComplete?: boolean;\r\n /**\r\n * One of the awa.actionType values\r\n */\r\n actionType?: string;\r\n}\r\n\r\n/**\r\n * Overrides for Page Unload event\r\n */\r\nexport interface IPageUnloadOverrideValues extends IOverrideValues {\r\n /**\r\n * Scroll depth override\r\n */\r\n scrollDepth?: string;\r\n /**\r\n * Vertical scroll position/offset when event was fired in pixels.\r\n */\r\n vScrollOffset?: number;\r\n}\r\n\r\n/**\r\n * Overrides for Page View Performance event\r\n */\r\nexport interface IPageViewPerformanceOverrideValues extends IOverrideValues {\r\n /**\r\n * Viewport height\r\n */\r\n vpHeight?: number;\r\n /**\r\n * Viewport width\r\n */\r\n vpWidth?: number;\r\n /**\r\n * Represents UX Framework name and version used.\r\n */\r\n framework?: string;\r\n /**\r\n * These are timings pulled from the browser/container.\r\n * They are standards which are captured by the browser, like the navigationStart/End, LoadEventStart/End\r\n */\r\n systemTiming?: string;\r\n /**\r\n * These are user set timings\r\n */\r\n customTiming?: string;\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@ import { Observable } from 'rxjs';
|
|
|
2
2
|
import { AppContext } from '../data/app-context';
|
|
3
3
|
import { PowerShellCommand } from '../data/powershell';
|
|
4
4
|
import { RpcNotification } from '../rpc/notification/rpc-notification-model';
|
|
5
|
-
import { IContentUpdateOverrideValues, IPageActionOverrideValues, IPageViewOverrideValues,
|
|
5
|
+
import { IContentUpdateOverrideValues, IPageActionOverrideValues, IPageViewOverrideValues, PowershellDetails, SmePerformanceData, TelemetryEventStates } from './sme-web-telemetry-models';
|
|
6
6
|
export declare class SmeWebTelemetry {
|
|
7
7
|
/**
|
|
8
8
|
* The source name to use when logging about this service.
|
|
@@ -20,8 +20,6 @@ export declare class SmeWebTelemetry {
|
|
|
20
20
|
private static rpcInitAlready;
|
|
21
21
|
private static metaTags;
|
|
22
22
|
private static powershellIdMap;
|
|
23
|
-
private static isProd;
|
|
24
|
-
static get isProduction(): boolean;
|
|
25
23
|
private static windowsAdminCenterTenantToken;
|
|
26
24
|
/**
|
|
27
25
|
* Map of module versions used in this instance of web telemetry - memoize values here.
|
|
@@ -120,16 +118,6 @@ export declare class SmeWebTelemetry {
|
|
|
120
118
|
* @param contentOverrides any content overriding behavior wanted in the performance event
|
|
121
119
|
*/
|
|
122
120
|
static tracePerformanceData(dataPayload: SmePerformanceData, contentOverrides?: any): void;
|
|
123
|
-
/**
|
|
124
|
-
* Send a content update event - this event will contain timings for lighthouse calculation in the backend
|
|
125
|
-
* This can potentially be sent a couple times with overlapping data for one page load event, depending
|
|
126
|
-
* on when the TTI is calculated. In this scenario, it will be handled on the backend.
|
|
127
|
-
* @param dataPayload Lighthouse data
|
|
128
|
-
* @param contentOverrides any content overriding behavior wanted in the performance event
|
|
129
|
-
*/
|
|
130
|
-
static traceLighthouseData(dataPayload: LighthousePerformanceMetrics, contentOverrides?: any, properties?: {
|
|
131
|
-
[name: string]: any;
|
|
132
|
-
}): void;
|
|
133
121
|
/**
|
|
134
122
|
* See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides
|
|
135
123
|
* @param dataPayload performance data to be sent through telemetry.
|
|
@@ -4,7 +4,7 @@ import { Meta } from '@angular/platform-browser';
|
|
|
4
4
|
import { EMPTY, Observable } from 'rxjs';
|
|
5
5
|
import { delay, retryWhen, shareReplay, take, tap } from 'rxjs/operators';
|
|
6
6
|
import { NotificationState } from '../notification/notification-state';
|
|
7
|
-
import {
|
|
7
|
+
import { GatewayInventoryCache } from '../shared/gateway-inventory/gateway-inventory-cache';
|
|
8
8
|
import { Logging } from './logging';
|
|
9
9
|
import { SmeMetaLabels, TelemetryActionTypes, TelemetryEvents, TelemetryEventStates, TelemetryEventTypes } from './sme-web-telemetry-models';
|
|
10
10
|
export class SmeWebTelemetry {
|
|
@@ -23,9 +23,6 @@ export class SmeWebTelemetry {
|
|
|
23
23
|
static get backlogHasSpace() {
|
|
24
24
|
return this.eventBacklog.length < 50;
|
|
25
25
|
}
|
|
26
|
-
static get isProduction() {
|
|
27
|
-
return this.isProd;
|
|
28
|
-
}
|
|
29
26
|
/**
|
|
30
27
|
* Get the list of module versions for use in telemetry where the event is sent via RPC to shell
|
|
31
28
|
* from the actual module the event is called in.
|
|
@@ -54,10 +51,6 @@ export class SmeWebTelemetry {
|
|
|
54
51
|
this.tracePerformanceData(body.performance, overrideVals ? overrideVals.content : null);
|
|
55
52
|
break;
|
|
56
53
|
}
|
|
57
|
-
case TelemetryEvents.Lighthouse: {
|
|
58
|
-
this.traceLighthouseData(body.lighthouse, body.overrideValues);
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
54
|
case TelemetryEvents.ModuleOpenPerformance:
|
|
62
55
|
this.traceModuleOpenPerformance(body.performance);
|
|
63
56
|
break;
|
|
@@ -137,10 +130,8 @@ export class SmeWebTelemetry {
|
|
|
137
130
|
// Instantiate these initially so they aren't empty values
|
|
138
131
|
this.metaTags[SmeMetaLabels.InstallationType] = 'N/A';
|
|
139
132
|
this.metaTags[SmeMetaLabels.Build] = 'N/A';
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
this.isProd = MsftSme.self().Init.isProduction;
|
|
143
|
-
return appContext.gateway.getStatus()
|
|
133
|
+
const gatewayInventoryCache = new GatewayInventoryCache(appContext);
|
|
134
|
+
return gatewayInventoryCache.query({})
|
|
144
135
|
.pipe(retryWhen(errors => {
|
|
145
136
|
let gatewayRetries = 2;
|
|
146
137
|
return errors.pipe(delay(1000), tap((error) => {
|
|
@@ -150,15 +141,10 @@ export class SmeWebTelemetry {
|
|
|
150
141
|
Logging.logDebug(this.logSourceName, 'Attempting to query gateway again...');
|
|
151
142
|
gatewayRetries--;
|
|
152
143
|
}));
|
|
153
|
-
}), take(1), tap((
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
this.metaTags[SmeMetaLabels.
|
|
157
|
-
this.metaTags[SmeMetaLabels.Build] = status.gatewayVersion;
|
|
158
|
-
this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[status.gatewayMode];
|
|
159
|
-
this.metaTags[SmeMetaLabels.GatewayOperationalMode] = GatewayOperationalMode[status.gatewayOperationalMode];
|
|
160
|
-
this.metaTags[SmeMetaLabels.IsProduction] = this.isProd.toString();
|
|
161
|
-
this.metaTags[SmeMetaLabels.Environment] = this.isProd.toString();
|
|
144
|
+
}), take(1), tap((inventory) => {
|
|
145
|
+
const gatewayInventory = inventory.instance;
|
|
146
|
+
this.metaTags[SmeMetaLabels.InstallationType] = gatewayInventory.installationType;
|
|
147
|
+
this.metaTags[SmeMetaLabels.Build] = gatewayInventory.gatewayVersion;
|
|
162
148
|
// If not shell, handle in RPC handler, because some fields will init after 1DS inits
|
|
163
149
|
// If rpc handler has happened already, go ahead with this
|
|
164
150
|
if (MsftSme.isShell() || this.rpcInitAlready) {
|
|
@@ -200,7 +186,7 @@ export class SmeWebTelemetry {
|
|
|
200
186
|
onLoad: false,
|
|
201
187
|
onUnload: true,
|
|
202
188
|
click: true,
|
|
203
|
-
resize:
|
|
189
|
+
resize: false,
|
|
204
190
|
jsError: true,
|
|
205
191
|
lineage: true
|
|
206
192
|
},
|
|
@@ -225,9 +211,6 @@ export class SmeWebTelemetry {
|
|
|
225
211
|
event.baseData.properties.pageTags.metaTags[SmeMetaLabels.ExtensionVersion] =
|
|
226
212
|
this.getModuleVersion(event.baseData.name);
|
|
227
213
|
}
|
|
228
|
-
event.baseData.properties.pageTags.screenResolution = { availableHeight: window.screen.availHeight,
|
|
229
|
-
availableWidth: window.screen.availWidth };
|
|
230
|
-
event.baseData.properties.pageTags.frameDetails = { height: window.innerHeight, width: window.innerWidth };
|
|
231
214
|
});
|
|
232
215
|
observer.next();
|
|
233
216
|
observer.complete();
|
|
@@ -362,32 +345,11 @@ export class SmeWebTelemetry {
|
|
|
362
345
|
// A for automatic, performance tracking is done automatically.
|
|
363
346
|
const overrideValues = {
|
|
364
347
|
actionType: TelemetryActionTypes.Automatic,
|
|
365
|
-
content: contentOverrides ||
|
|
348
|
+
content: contentOverrides || {}
|
|
366
349
|
};
|
|
367
350
|
const customProps = { timings: data, type: TelemetryEventTypes.Performance };
|
|
368
351
|
this.telemetryHandler.captureContentUpdate(overrideValues, customProps);
|
|
369
352
|
}
|
|
370
|
-
/**
|
|
371
|
-
* Send a content update event - this event will contain timings for lighthouse calculation in the backend
|
|
372
|
-
* This can potentially be sent a couple times with overlapping data for one page load event, depending
|
|
373
|
-
* on when the TTI is calculated. In this scenario, it will be handled on the backend.
|
|
374
|
-
* @param dataPayload Lighthouse data
|
|
375
|
-
* @param contentOverrides any content overriding behavior wanted in the performance event
|
|
376
|
-
*/
|
|
377
|
-
static traceLighthouseData(dataPayload, contentOverrides, properties) {
|
|
378
|
-
if (!this.telemetryHandler && this.backlogHasSpace) {
|
|
379
|
-
this.eventBacklog.push([TelemetryEvents.Lighthouse, { lighthouse: dataPayload, overrideValues: { content: contentOverrides }
|
|
380
|
-
}]);
|
|
381
|
-
return;
|
|
382
|
-
}
|
|
383
|
-
const overrideValues = {
|
|
384
|
-
actionType: TelemetryActionTypes.Automatic,
|
|
385
|
-
content: contentOverrides || dataPayload
|
|
386
|
-
};
|
|
387
|
-
const customProps = { timings: dataPayload, type: TelemetryEventTypes.Lighthouse };
|
|
388
|
-
MsftSme.deepAssign(customProps, properties);
|
|
389
|
-
this.telemetryHandler.captureContentUpdate(overrideValues, customProps);
|
|
390
|
-
}
|
|
391
353
|
/**
|
|
392
354
|
* See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides
|
|
393
355
|
* @param dataPayload performance data to be sent through telemetry.
|
|
@@ -462,9 +424,8 @@ export class SmeWebTelemetry {
|
|
|
462
424
|
if (state !== TelemetryEventStates.Started && id) {
|
|
463
425
|
this.removePowershellId(id);
|
|
464
426
|
}
|
|
465
|
-
const psContent = { psCommand: psCommand.command, state: state,
|
|
466
|
-
|
|
467
|
-
const sourceName = this.nameOfModule;
|
|
427
|
+
const psContent = { psCommand: psCommand.command, state: state, otherData: details && details.otherData ? details.otherData : {} };
|
|
428
|
+
const sourceName = psCommand.module ? psCommand.module.toLowerCase() : this.nameOfModule;
|
|
468
429
|
if (response && response.error) {
|
|
469
430
|
psContent['errorCodes'] = [response.error.code];
|
|
470
431
|
}
|
|
@@ -516,7 +477,6 @@ SmeWebTelemetry.testMode = 'test';
|
|
|
516
477
|
SmeWebTelemetry.rpcInitAlready = false;
|
|
517
478
|
SmeWebTelemetry.metaTags = {};
|
|
518
479
|
SmeWebTelemetry.powershellIdMap = {};
|
|
519
|
-
SmeWebTelemetry.isProd = true;
|
|
520
480
|
// AppId/Tenant Token provided by MarTech support
|
|
521
481
|
// AppId is not used, but it will be mapped to later in the pipeline
|
|
522
482
|
// Full keys are JS:WindowsAdminCenter and o:f78e2b7c9ae4461399c360160d82dcfc for
|