@microsoft/windows-admin-center-sdk 2.295.0 → 2.298.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.
Files changed (147) hide show
  1. package/angular/assets/strings/cs-CZ/strings.json +1 -1
  2. package/angular/assets/strings/de-DE/strings.json +1 -1
  3. package/angular/assets/strings/es-ES/strings.json +1 -1
  4. package/angular/assets/strings/fr-FR/strings.json +1 -1
  5. package/angular/assets/strings/hu-HU/strings.json +1 -1
  6. package/angular/assets/strings/it-IT/strings.json +1 -1
  7. package/angular/assets/strings/ja-JP/strings.json +1 -1
  8. package/angular/assets/strings/ko-KR/strings.json +1 -1
  9. package/angular/assets/strings/nl-NL/strings.json +1 -1
  10. package/angular/assets/strings/pl-PL/strings.json +1 -1
  11. package/angular/assets/strings/pt-BR/strings.json +1 -1
  12. package/angular/assets/strings/pt-PT/strings.json +1 -1
  13. package/angular/assets/strings/ru-RU/strings.json +1 -1
  14. package/angular/assets/strings/strings.json +1 -1
  15. package/angular/assets/strings/sv-SE/strings.json +1 -1
  16. package/angular/assets/strings/tr-TR/strings.json +1 -1
  17. package/angular/assets/strings/zh-CN/strings.json +1 -1
  18. package/angular/assets/strings/zh-TW/strings.json +1 -1
  19. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +558 -240
  20. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
  21. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +2 -2
  22. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
  23. package/angular/esm2015/src/controls/actions/containers/action-bar/action-bar.component.js +7 -2
  24. package/angular/esm2015/src/controls/alert-bar/alert-bar.component.js +5 -5
  25. package/angular/esm2015/src/controls/common/base.component.js +8 -1
  26. package/angular/esm2015/src/controls/data-table/data-table.component.js +39 -9
  27. package/angular/esm2015/src/controls/form/form-field/checklist/checklist-form-field.component.js +11 -8
  28. package/angular/esm2015/src/controls/form/form-field/combobox/combobox-form-field.component.js +8 -9
  29. package/angular/esm2015/src/controls/form/form-field/file/file-form-field.component.js +14 -2
  30. package/angular/esm2015/src/controls/form/form-field/form-field.component.js +9 -2
  31. package/angular/esm2015/src/controls/layout/layout-definition.component.js +9 -2
  32. package/angular/esm2015/src/controls/layout/layout.component.js +11 -2
  33. package/angular/esm2015/src/controls/master-view/master-view.component.js +32 -5
  34. package/angular/esm2015/src/controls/page-alert-bar/models/index.js +1 -1
  35. package/angular/esm2015/src/controls/pivot/pivot.component.js +11 -5
  36. package/angular/esm2015/src/controls/property-grid/property-grid-item.component.js +50 -2
  37. package/angular/esm2015/src/controls/property-grid/property-grid.component.js +73 -60
  38. package/angular/esm2015/src/controls/property-grid/property-grid.module.js +5 -1
  39. package/angular/esm2015/src/controls/settings/common-settings/common-settings.component.js +151 -70
  40. package/angular/esm2015/src/controls/settings/settings.component.js +48 -8
  41. package/angular/esm2015/src/controls/settings/settings.module.js +21 -9
  42. package/angular/esm2015/src/controls/wizard/wizard.component.js +55 -65
  43. package/angular/esm2015/src/generated/strings.js +1 -1
  44. package/angular/esm2015/src/service/app-context.service.js +3 -1
  45. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +535 -240
  46. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
  47. package/angular/package.json +2 -0
  48. package/angular/src/controls/common/base.component.d.ts +5 -0
  49. package/angular/src/controls/data-table/data-table.component.d.ts +15 -0
  50. package/angular/src/controls/form/form-field/checklist/checklist-form-field.component.d.ts +1 -0
  51. package/angular/src/controls/form/form-field/file/file-form-field.component.d.ts +4 -0
  52. package/angular/src/controls/layout/layout-definition.component.d.ts +6 -1
  53. package/angular/src/controls/master-view/master-view.component.d.ts +118 -2
  54. package/angular/src/controls/page-alert-bar/models/index.d.ts +1 -1
  55. package/angular/src/controls/pivot/pivot.component.d.ts +4 -1
  56. package/angular/src/controls/property-grid/property-grid-item.component.d.ts +53 -3
  57. package/angular/src/controls/property-grid/property-grid.component.d.ts +1 -2
  58. package/angular/src/controls/property-grid/property-grid.module.d.ts +4 -3
  59. package/angular/src/controls/settings/common-settings/common-settings.component.d.ts +32 -1
  60. package/angular/src/controls/settings/settings.component.d.ts +18 -1
  61. package/angular/src/controls/settings/settings.module.d.ts +3 -1
  62. package/angular/src/generated/strings.d.ts +3 -0
  63. package/core/base/environment.d.ts +10 -0
  64. package/core/base/environment.js.map +1 -1
  65. package/core/data/gateway-connection.d.ts +34 -0
  66. package/core/data/gateway-connection.js +59 -2
  67. package/core/data/gateway-connection.js.map +1 -1
  68. package/core/data/gateway-status.d.ts +24 -0
  69. package/core/data/gateway-status.js +3 -0
  70. package/core/data/gateway-status.js.map +1 -0
  71. package/core/data/node-connection.d.ts +4 -0
  72. package/core/data/node-connection.js.map +1 -1
  73. package/core/data/powershell.d.ts +4 -0
  74. package/core/data/powershell.js +1 -0
  75. package/core/data/powershell.js.map +1 -1
  76. package/core/data/wdac-operations.d.ts +123 -0
  77. package/core/data/wdac-operations.js +144 -0
  78. package/core/data/wdac-operations.js.map +1 -0
  79. package/core/diagnostics/sme-web-telemetry-models.d.ts +20 -3
  80. package/core/diagnostics/sme-web-telemetry-models.js +6 -2
  81. package/core/diagnostics/sme-web-telemetry-models.js.map +1 -1
  82. package/core/diagnostics/sme-web-telemetry.d.ts +13 -1
  83. package/core/diagnostics/sme-web-telemetry.js +51 -11
  84. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  85. package/core/generated/powershell-scripts.d.ts +8 -4
  86. package/core/generated/powershell-scripts.js +8 -4
  87. package/core/generated/powershell-scripts.js.map +1 -1
  88. package/core/index.d.ts +2 -0
  89. package/core/index.js +1 -0
  90. package/core/index.js.map +1 -1
  91. package/core/manifest/environment-modules.js +10 -0
  92. package/core/manifest/environment-modules.js.map +1 -1
  93. package/core/notification/powershell-notification.js +1 -1
  94. package/core/notification/powershell-notification.js.map +1 -1
  95. package/core/performance/performance-tracker.d.ts +67 -0
  96. package/core/performance/performance-tracker.js +211 -4
  97. package/core/performance/performance-tracker.js.map +1 -1
  98. package/core/rpc/credssp/rpc-credssp-model.d.ts +27 -2
  99. package/core/rpc/credssp/rpc-credssp-model.js +10 -0
  100. package/core/rpc/credssp/rpc-credssp-model.js.map +1 -1
  101. package/core/security/credssp-manager.d.ts +15 -1
  102. package/core/security/credssp-manager.js +28 -0
  103. package/core/security/credssp-manager.js.map +1 -1
  104. package/core/shared/gateway-inventory/gateway-inventory.d.ts +10 -0
  105. package/core/shared/gateway-inventory/gateway-inventory.js +11 -0
  106. package/core/shared/gateway-inventory/gateway-inventory.js.map +1 -1
  107. package/e2e/assets/strings/cs-CZ/strings.json +1 -1
  108. package/e2e/assets/strings/de-DE/strings.json +1 -1
  109. package/e2e/assets/strings/es-ES/strings.json +1 -1
  110. package/e2e/assets/strings/fr-FR/strings.json +1 -1
  111. package/e2e/assets/strings/hu-HU/strings.json +1 -1
  112. package/e2e/assets/strings/it-IT/strings.json +1 -1
  113. package/e2e/assets/strings/ja-JP/strings.json +1 -1
  114. package/e2e/assets/strings/ko-KR/strings.json +1 -1
  115. package/e2e/assets/strings/nl-NL/strings.json +1 -1
  116. package/e2e/assets/strings/pl-PL/strings.json +1 -1
  117. package/e2e/assets/strings/pt-BR/strings.json +1 -1
  118. package/e2e/assets/strings/pt-PT/strings.json +1 -1
  119. package/e2e/assets/strings/ru-RU/strings.json +1 -1
  120. package/e2e/assets/strings/strings.json +1 -1
  121. package/e2e/assets/strings/sv-SE/strings.json +1 -1
  122. package/e2e/assets/strings/tr-TR/strings.json +1 -1
  123. package/e2e/assets/strings/zh-CN/strings.json +1 -1
  124. package/e2e/assets/strings/zh-TW/strings.json +1 -1
  125. package/package.json +5 -3
  126. package/styles/css/main.css +1 -1
  127. package/tools/module-template/gulpfile.ts/index.ts +1 -1
  128. package/tools/package-lock.json +18081 -4110
  129. package/tools/wac-cli/src/create/main.d.ts +6 -3
  130. package/tools/wac-cli/src/create/main.js +87 -35
  131. package/tools/wac-cli/src/create/main.js.map +1 -1
  132. package/tools/wac-cli/src/index.js +2 -2
  133. package/tools/wac-cli/src/index.js.map +1 -1
  134. package/tools/wac-cli/templates/internal/npmrc.txt +6 -0
  135. package/tools/wac-cli/templates/internal/package.json +101 -0
  136. package/tools/wac-cli/templates/{manifest/solution-manifest.json → solution/manifest.json} +19 -0
  137. package/tools/wac-cli/templates/solution/strings.resjson +16 -0
  138. package/tools/wac-cli/templates/wac-template/angular.json +2 -2
  139. package/tools/wac-cli/templates/wac-template/gulpfile.ts/config-data.ts +1 -1
  140. package/tools/wac-cli/templates/wac-template/package.json +0 -8
  141. package/tools/wac-cli/templates/wac-template/src/app/app-routing.module.ts +1 -1
  142. package/tools/wac-cli/templates/wac-template/src/main.ts +2 -0
  143. package/tools/wac-cli/templates/{manifest/tool-manifest.json → wac-template/src/manifest.json} +0 -0
  144. package/tools/wac-cli/templates/wac-template/src/polyfills.ts +1 -1
  145. package/tools/wac-cli/templates/wac-template/src/test.ts +2 -2
  146. package/tools/wac-cli/templates/wac-template/src/version.ts +3 -0
  147. package/tools/wac-cli/templates/wac-template/version.json +5 -0
@@ -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 * 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"]}
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"]}
@@ -0,0 +1,123 @@
1
+ import { Observable } from 'rxjs';
2
+ import { AppContext } from './app-context';
3
+ import { HttpStatusCode } from './http-constants';
4
+ /**
5
+ * Windows Defender Application Control (WDAC) status values based on DeviceGuardConfigCodeIntegrityStatus.
6
+ */
7
+ export declare enum WdacMode {
8
+ /**
9
+ * WDAC is off.
10
+ */
11
+ Off = 0,
12
+ /**
13
+ * WDAC is in Audit mode
14
+ */
15
+ AuditMode = 1,
16
+ /**
17
+ * WDAC is in Enforcement mode.
18
+ */
19
+ EnforcementMode = 2,
20
+ /**
21
+ * PS session language is ConstrainedLanguage.
22
+ * This is a custom enum value we added (not based off the official DeviceGuardConfigCodeIntegrityStatus).
23
+ * It was introduced to handle any edge-cases where DeviceGuard properties are not set but PS is in Constrained Language mode.
24
+ * If DeviceGuard properties are set in addition to this language mode, the result of Wdac mode should be "EnforcementMode".
25
+ */
26
+ PowershellConstrainedLanguageMode = 3
27
+ }
28
+ /**
29
+ * PowerShell Language modes
30
+ * https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pslanguagemode
31
+ */
32
+ export declare enum PSLanguageMode {
33
+ FullLanguage = 0,
34
+ RestrictedLanguage = 1,
35
+ NoLanguage = 2,
36
+ ConstrainedLanguage = 3
37
+ }
38
+ /**
39
+ * Represents the data returned from the GetWdacMode endpoint - /api/wdac/{targetNodename}/{psLanguageMode}
40
+ */
41
+ export interface WdacModeResult {
42
+ /**
43
+ * Status of the request/response.
44
+ */
45
+ name: HttpStatusCode;
46
+ /**
47
+ * WdacMode of the target node.
48
+ */
49
+ wdacMode: WdacMode;
50
+ }
51
+ /**
52
+ * Represents the data returned from the TransferModules endpoint - /api/wdac/{targetNodename}/transfer/async
53
+ */
54
+ export interface TransferModulesResult {
55
+ /**
56
+ * (msft.sme.x) name of the transferred module.
57
+ */
58
+ moduleName: string;
59
+ /**
60
+ * Version of the transferred module.
61
+ */
62
+ moduleVersion: string;
63
+ /**
64
+ * (Microsoft.SME.X) name of the transferred module.
65
+ */
66
+ powerShellModuleName: string;
67
+ /**
68
+ * Indicates if the transferred module is localized.
69
+ */
70
+ isLocalized: boolean;
71
+ /**
72
+ * Indicates if all subdirectories & files within the module folder were successfully copied.
73
+ */
74
+ isFullyCopied: boolean;
75
+ /**
76
+ * Error message (if any).
77
+ */
78
+ errorMessage: string;
79
+ /**
80
+ * Time taken (in seconds) to transfer the module.
81
+ */
82
+ totalTime: string;
83
+ }
84
+ /**
85
+ * Windows Defender Application Control (WDAC) operations class.
86
+ */
87
+ export declare class WdacOperations {
88
+ private appContext;
89
+ /**
90
+ * {0} corresponds to the target node name.
91
+ * {1} corresponds to the PSLanguageMode enum value.
92
+ */
93
+ private static wdacModeUrl;
94
+ /**
95
+ * {0} corresponds to the target node name.
96
+ */
97
+ private static wdacTransferToTargetUrl;
98
+ /**
99
+ * Initializes a new instance of the WdacOperations class.
100
+ *
101
+ * @param appContext the application context.
102
+ */
103
+ constructor(appContext: AppContext);
104
+ /**
105
+ * Retrieve the LanguageMode property for PowerShell session(s) / runspace(s).
106
+ *
107
+ * @param targetNodeName the machine name to get the WdacMode for.
108
+ */
109
+ getPsLanguageMode(targetNodeName: string): Observable<PSLanguageMode>;
110
+ /**
111
+ * Gets the WdacMode of a specified targetNodeName.
112
+ *
113
+ * @param targetNodeName the machine name to get the WdacMode for.
114
+ */
115
+ getWdacMode(targetNodeName: string): Observable<WdacModeResult>;
116
+ /**
117
+ * Transfer WAC module(s) to the target node specified. (Elevate the desktop gateway if required.)
118
+ *
119
+ * @param targetNodeName the node modules are being transferred to.
120
+ * @param moduleNames the array containing information about the module(s) being transferred.
121
+ */
122
+ transferModulesToTargetNode(targetNodeName: string, moduleNames?: string[]): Observable<TransferModulesResult>;
123
+ }
@@ -0,0 +1,144 @@
1
+ import { throwError } from 'rxjs';
2
+ import { catchError, map, mergeMap, switchMap } from 'rxjs/operators';
3
+ import { PowerShellScripts } from '../generated/powershell-scripts';
4
+ import { PowerShell } from './powershell';
5
+ /**
6
+ * Windows Defender Application Control (WDAC) status values based on DeviceGuardConfigCodeIntegrityStatus.
7
+ */
8
+ export var WdacMode;
9
+ (function (WdacMode) {
10
+ /**
11
+ * WDAC is off.
12
+ */
13
+ WdacMode[WdacMode["Off"] = 0] = "Off";
14
+ /**
15
+ * WDAC is in Audit mode
16
+ */
17
+ WdacMode[WdacMode["AuditMode"] = 1] = "AuditMode";
18
+ /**
19
+ * WDAC is in Enforcement mode.
20
+ */
21
+ WdacMode[WdacMode["EnforcementMode"] = 2] = "EnforcementMode";
22
+ /**
23
+ * PS session language is ConstrainedLanguage.
24
+ * This is a custom enum value we added (not based off the official DeviceGuardConfigCodeIntegrityStatus).
25
+ * It was introduced to handle any edge-cases where DeviceGuard properties are not set but PS is in Constrained Language mode.
26
+ * If DeviceGuard properties are set in addition to this language mode, the result of Wdac mode should be "EnforcementMode".
27
+ */
28
+ WdacMode[WdacMode["PowershellConstrainedLanguageMode"] = 3] = "PowershellConstrainedLanguageMode";
29
+ })(WdacMode || (WdacMode = {}));
30
+ /**
31
+ * PowerShell Language modes
32
+ * https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pslanguagemode
33
+ */
34
+ export var PSLanguageMode;
35
+ (function (PSLanguageMode) {
36
+ PSLanguageMode[PSLanguageMode["FullLanguage"] = 0] = "FullLanguage";
37
+ PSLanguageMode[PSLanguageMode["RestrictedLanguage"] = 1] = "RestrictedLanguage";
38
+ PSLanguageMode[PSLanguageMode["NoLanguage"] = 2] = "NoLanguage";
39
+ PSLanguageMode[PSLanguageMode["ConstrainedLanguage"] = 3] = "ConstrainedLanguage";
40
+ })(PSLanguageMode || (PSLanguageMode = {}));
41
+ /**
42
+ * Windows Defender Application Control (WDAC) operations class.
43
+ */
44
+ export class WdacOperations {
45
+ /**
46
+ * Initializes a new instance of the WdacOperations class.
47
+ *
48
+ * @param appContext the application context.
49
+ */
50
+ constructor(appContext) {
51
+ this.appContext = appContext;
52
+ }
53
+ /**
54
+ * Retrieve the LanguageMode property for PowerShell session(s) / runspace(s).
55
+ *
56
+ * @param targetNodeName the machine name to get the WdacMode for.
57
+ */
58
+ getPsLanguageMode(targetNodeName) {
59
+ const command = PowerShell.createCommand(PowerShellScripts.Get_LanguageMode);
60
+ return this.appContext.powerShell.run(targetNodeName, command, {})
61
+ .pipe(map(response => {
62
+ switch (parseInt(response.results[0], 10)) {
63
+ case 0:
64
+ return PSLanguageMode.FullLanguage;
65
+ case 1:
66
+ return PSLanguageMode.RestrictedLanguage;
67
+ case 2:
68
+ return PSLanguageMode.NoLanguage;
69
+ case 3:
70
+ return PSLanguageMode.ConstrainedLanguage;
71
+ }
72
+ }), catchError(error => {
73
+ return throwError(error);
74
+ }));
75
+ }
76
+ /**
77
+ * Gets the WdacMode of a specified targetNodeName.
78
+ *
79
+ * @param targetNodeName the machine name to get the WdacMode for.
80
+ */
81
+ getWdacMode(targetNodeName) {
82
+ return this.getPsLanguageMode(targetNodeName)
83
+ .pipe(mergeMap(psLanguageMode => {
84
+ const url = WdacOperations.wdacModeUrl.format(targetNodeName, PSLanguageMode[psLanguageMode]);
85
+ return this.appContext.gateway.get(url)
86
+ .pipe(catchError((error, caught) => {
87
+ // catch elevation error and retry after elevated.
88
+ if (this.appContext.gateway.isElevationRequired(error)) {
89
+ return this.appContext.gateway.pollingGatewayElevated()
90
+ .pipe(switchMap(elevated => elevated ? caught : throwError(error)));
91
+ }
92
+ return throwError(error);
93
+ }), map((response) => {
94
+ if (!response) {
95
+ throw new Error('WdacOperations getWdacMode() call failed with a null response result.');
96
+ }
97
+ return response;
98
+ }));
99
+ }));
100
+ }
101
+ /**
102
+ * Transfer WAC module(s) to the target node specified. (Elevate the desktop gateway if required.)
103
+ *
104
+ * @param targetNodeName the node modules are being transferred to.
105
+ * @param moduleNames the array containing information about the module(s) being transferred.
106
+ */
107
+ transferModulesToTargetNode(targetNodeName, moduleNames) {
108
+ let url = '';
109
+ if (moduleNames) {
110
+ // Convert array of moduleNames to a string separated by '&' to be used in the API URL.
111
+ // Example API endpoint: wdac/{targetNodeName}/transfer/async/Microsoft.SME.AppsAndFeatures&Microsoft.SME.LocalUsersGroups
112
+ const modulesToTransfer = moduleNames.join('&');
113
+ url = WdacOperations.wdacTransferToTargetUrl.format(targetNodeName, modulesToTransfer);
114
+ }
115
+ else {
116
+ url = WdacOperations.wdacTransferToTargetUrl.format(targetNodeName);
117
+ }
118
+ return this.appContext.gateway.put(url)
119
+ .pipe(catchError((error, caught) => {
120
+ // catch elevation error and retry after elevated.
121
+ if (this.appContext.gateway.isElevationRequired(error)) {
122
+ return this.appContext.gateway.pollingGatewayElevated()
123
+ .pipe(switchMap(elevated => elevated ? caught : throwError(error)));
124
+ }
125
+ return throwError(error);
126
+ }), map((response) => {
127
+ if (!response) {
128
+ throw new Error('WdacOperations transferModulesToTargetNode() call failed with a null response result.');
129
+ }
130
+ return response;
131
+ }));
132
+ }
133
+ }
134
+ /**
135
+ * {0} corresponds to the target node name.
136
+ * {1} corresponds to the PSLanguageMode enum value.
137
+ */
138
+ WdacOperations.wdacModeUrl = 'wdac/{0}/{1}';
139
+ /**
140
+ * {0} corresponds to the target node name.
141
+ */
142
+ WdacOperations.wdacTransferToTargetUrl = 'wdac/{0}/transfer/async';
143
+
144
+ //# sourceMappingURL=wdac-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/core/data/wdac-operations.ts"],"names":[],"mappings":"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","file":"wdac-operations.js","sourcesContent":["import { Observable, throwError } from 'rxjs';\r\nimport { catchError, map, mergeMap, switchMap } from 'rxjs/operators';\r\nimport { PowerShellScripts } from '../generated/powershell-scripts';\r\nimport { AppContext } from './app-context';\r\nimport { HttpStatusCode } from './http-constants';\r\nimport { PowerShell } from './powershell';\r\n\r\n/**\r\n * Windows Defender Application Control (WDAC) status values based on DeviceGuardConfigCodeIntegrityStatus.\r\n */\r\nexport enum WdacMode {\r\n /**\r\n * WDAC is off.\r\n */\r\n Off = 0,\r\n /**\r\n * WDAC is in Audit mode\r\n */\r\n AuditMode = 1,\r\n /**\r\n * WDAC is in Enforcement mode.\r\n */\r\n EnforcementMode = 2,\r\n /**\r\n * PS session language is ConstrainedLanguage.\r\n * This is a custom enum value we added (not based off the official DeviceGuardConfigCodeIntegrityStatus).\r\n * It was introduced to handle any edge-cases where DeviceGuard properties are not set but PS is in Constrained Language mode.\r\n * If DeviceGuard properties are set in addition to this language mode, the result of Wdac mode should be \"EnforcementMode\".\r\n */\r\n PowershellConstrainedLanguageMode = 3\r\n}\r\n\r\n/**\r\n * PowerShell Language modes\r\n * https://docs.microsoft.com/en-us/dotnet/api/system.management.automation.pslanguagemode\r\n */\r\nexport enum PSLanguageMode {\r\n FullLanguage = 0,\r\n RestrictedLanguage = 1,\r\n NoLanguage = 2,\r\n ConstrainedLanguage = 3\r\n}\r\n\r\n/**\r\n * Represents the data returned from the GetWdacMode endpoint - /api/wdac/{targetNodename}/{psLanguageMode}\r\n */\r\nexport interface WdacModeResult {\r\n /**\r\n * Status of the request/response.\r\n */\r\n name: HttpStatusCode;\r\n\r\n /**\r\n * WdacMode of the target node.\r\n */\r\n wdacMode: WdacMode;\r\n}\r\n\r\n/**\r\n * Represents the data returned from the TransferModules endpoint - /api/wdac/{targetNodename}/transfer/async\r\n */\r\nexport interface TransferModulesResult {\r\n /**\r\n * (msft.sme.x) name of the transferred module.\r\n */\r\n moduleName: string;\r\n\r\n /**\r\n * Version of the transferred module.\r\n */\r\n moduleVersion: string;\r\n\r\n /**\r\n * (Microsoft.SME.X) name of the transferred module.\r\n */\r\n powerShellModuleName: string;\r\n\r\n /**\r\n * Indicates if the transferred module is localized.\r\n */\r\n isLocalized: boolean;\r\n\r\n /**\r\n * Indicates if all subdirectories & files within the module folder were successfully copied.\r\n */\r\n isFullyCopied: boolean;\r\n\r\n /**\r\n * Error message (if any).\r\n */\r\n errorMessage: string;\r\n\r\n /**\r\n * Time taken (in seconds) to transfer the module.\r\n */\r\n totalTime: string;\r\n}\r\n\r\n/**\r\n * Windows Defender Application Control (WDAC) operations class.\r\n */\r\nexport class WdacOperations {\r\n /**\r\n * {0} corresponds to the target node name.\r\n * {1} corresponds to the PSLanguageMode enum value.\r\n */\r\n private static wdacModeUrl = 'wdac/{0}/{1}';\r\n\r\n /**\r\n * {0} corresponds to the target node name.\r\n */\r\n private static wdacTransferToTargetUrl = 'wdac/{0}/transfer/async';\r\n\r\n /**\r\n * Initializes a new instance of the WdacOperations class.\r\n *\r\n * @param appContext the application context.\r\n */\r\n constructor(private appContext: AppContext) { }\r\n\r\n /**\r\n * Retrieve the LanguageMode property for PowerShell session(s) / runspace(s).\r\n *\r\n * @param targetNodeName the machine name to get the WdacMode for.\r\n */\r\n public getPsLanguageMode(targetNodeName: string): Observable<PSLanguageMode> {\r\n const command = PowerShell.createCommand(PowerShellScripts.Get_LanguageMode);\r\n return this.appContext.powerShell.run(targetNodeName, command, {})\r\n .pipe(\r\n map(response => {\r\n switch (parseInt(response.results[0], 10)) {\r\n case 0:\r\n return PSLanguageMode.FullLanguage;\r\n case 1:\r\n return PSLanguageMode.RestrictedLanguage;\r\n case 2:\r\n return PSLanguageMode.NoLanguage;\r\n case 3:\r\n return PSLanguageMode.ConstrainedLanguage;\r\n }\r\n }),\r\n catchError(error => {\r\n return throwError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Gets the WdacMode of a specified targetNodeName.\r\n *\r\n * @param targetNodeName the machine name to get the WdacMode for.\r\n */\r\n public getWdacMode(targetNodeName: string): Observable<WdacModeResult> {\r\n return this.getPsLanguageMode(targetNodeName)\r\n .pipe(\r\n mergeMap(psLanguageMode => {\r\n const url = WdacOperations.wdacModeUrl.format(targetNodeName, PSLanguageMode[psLanguageMode]);\r\n return this.appContext.gateway.get(url)\r\n .pipe(\r\n catchError((error, caught) => {\r\n // catch elevation error and retry after elevated.\r\n if (this.appContext.gateway.isElevationRequired(error)) {\r\n return this.appContext.gateway.pollingGatewayElevated()\r\n .pipe(switchMap(elevated => elevated ? caught : throwError(error)));\r\n }\r\n return throwError(error);\r\n }),\r\n map((response: WdacModeResult) => {\r\n if (!response) {\r\n throw new Error('WdacOperations getWdacMode() call failed with a null response result.');\r\n }\r\n return response;\r\n })\r\n );\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Transfer WAC module(s) to the target node specified. (Elevate the desktop gateway if required.)\r\n *\r\n * @param targetNodeName the node modules are being transferred to.\r\n * @param moduleNames the array containing information about the module(s) being transferred.\r\n */\r\n public transferModulesToTargetNode(targetNodeName: string, moduleNames?: string[]): Observable<TransferModulesResult> {\r\n let url = '';\r\n\r\n if (moduleNames) {\r\n // Convert array of moduleNames to a string separated by '&' to be used in the API URL.\r\n // Example API endpoint: wdac/{targetNodeName}/transfer/async/Microsoft.SME.AppsAndFeatures&Microsoft.SME.LocalUsersGroups\r\n const modulesToTransfer = moduleNames.join('&');\r\n url = WdacOperations.wdacTransferToTargetUrl.format(targetNodeName, modulesToTransfer);\r\n } else {\r\n url = WdacOperations.wdacTransferToTargetUrl.format(targetNodeName);\r\n }\r\n\r\n return this.appContext.gateway.put(url)\r\n .pipe(\r\n catchError((error, caught) => {\r\n // catch elevation error and retry after elevated.\r\n if (this.appContext.gateway.isElevationRequired(error)) {\r\n return this.appContext.gateway.pollingGatewayElevated()\r\n .pipe(switchMap(elevated => elevated ? caught : throwError(error)));\r\n }\r\n return throwError(error);\r\n }),\r\n map((response: TransferModulesResult) => {\r\n if (!response) {\r\n throw new Error('WdacOperations transferModulesToTargetNode() call failed with a null response result.');\r\n }\r\n\r\n return response;\r\n })\r\n );\r\n }\r\n}\r\n"]}
@@ -17,6 +17,18 @@ 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
+ }
20
32
  /**
21
33
  * Class w/ all SME performance data to be sent via telemetry. Internal to SmeWebTelemetry.
22
34
  * Numbers are converted to strings because we use toFixed to truncate numbers to avoid triggering MSCOM scrubbed
@@ -40,6 +52,7 @@ export interface TelemetryEventBody {
40
52
  overrideValues?: IOverrideValues;
41
53
  element?: Element;
42
54
  performance?: SmePerformanceData;
55
+ lighthouse?: LighthousePerformanceMetrics;
43
56
  notification?: RpcNotification;
44
57
  custom?: any;
45
58
  customProperties?: {
@@ -54,8 +67,9 @@ export declare enum TelemetryEvents {
54
67
  PageView = 1,
55
68
  ContentUpdate = 2,
56
69
  Performance = 3,
57
- ModuleOpenPerformance = 4,
58
- Notification = 5
70
+ Lighthouse = 4,
71
+ ModuleOpenPerformance = 5,
72
+ Notification = 6
59
73
  }
60
74
  /**
61
75
  * Telemetry action types supported - corresponds to awa jsll action type dictionary.
@@ -71,6 +85,7 @@ export declare enum TelemetryEventTypes {
71
85
  Informational = "info",
72
86
  Error = "error",
73
87
  Performance = "performance",
88
+ Lighthouse = "lighthouse",
74
89
  Notification = "notification",
75
90
  Powershell = "powershell"
76
91
  }
@@ -85,7 +100,9 @@ export declare enum SmeMetaLabels {
85
100
  InstallationType = "wac-installation-type",
86
101
  Build = "wac-build",
87
102
  Market = "market",
88
- Environment = "env"
103
+ Environment = "env",
104
+ GatewayMode = "wac-gateway-mode",
105
+ GatewayOperationalMode = "wac-gateway-operational-mode"
89
106
  }
90
107
  /**
91
108
  * Standard telemetry tracking event states
@@ -9,8 +9,9 @@ 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["ModuleOpenPerformance"] = 4] = "ModuleOpenPerformance";
13
- TelemetryEvents[TelemetryEvents["Notification"] = 5] = "Notification";
12
+ TelemetryEvents[TelemetryEvents["Lighthouse"] = 4] = "Lighthouse";
13
+ TelemetryEvents[TelemetryEvents["ModuleOpenPerformance"] = 5] = "ModuleOpenPerformance";
14
+ TelemetryEvents[TelemetryEvents["Notification"] = 6] = "Notification";
14
15
  })(TelemetryEvents || (TelemetryEvents = {}));
15
16
  /**
16
17
  * Telemetry action types supported - corresponds to awa jsll action type dictionary.
@@ -28,6 +29,7 @@ export var TelemetryEventTypes;
28
29
  TelemetryEventTypes["Informational"] = "info";
29
30
  TelemetryEventTypes["Error"] = "error";
30
31
  TelemetryEventTypes["Performance"] = "performance";
32
+ TelemetryEventTypes["Lighthouse"] = "lighthouse";
31
33
  TelemetryEventTypes["Notification"] = "notification";
32
34
  TelemetryEventTypes["Powershell"] = "powershell";
33
35
  })(TelemetryEventTypes || (TelemetryEventTypes = {}));
@@ -44,6 +46,8 @@ export var SmeMetaLabels;
44
46
  SmeMetaLabels["Build"] = "wac-build";
45
47
  SmeMetaLabels["Market"] = "market";
46
48
  SmeMetaLabels["Environment"] = "env";
49
+ SmeMetaLabels["GatewayMode"] = "wac-gateway-mode";
50
+ SmeMetaLabels["GatewayOperationalMode"] = "wac-gateway-operational-mode";
47
51
  })(SmeMetaLabels || (SmeMetaLabels = {}));
48
52
  /**
49
53
  * Standard telemetry tracking event states