@microsoft/windows-admin-center-sdk 2.523.1 → 2.538.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +88 -41
  2. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
  3. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
  4. package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
  5. package/angular/esm2015/src/controls/data-table/data-table.component.js +6 -2
  6. package/angular/esm2015/src/controls/dialog/dialog.component.js +11 -11
  7. package/angular/esm2015/src/controls/dialog/extension-dialog/extension-dialog.component.js +7 -7
  8. package/angular/esm2015/src/controls/header/header.component.js +52 -14
  9. package/angular/esm2015/src/controls/layout/layout-config.js +1 -2
  10. package/angular/esm2015/src/controls/query-editor/query-editor.component.js +4 -4
  11. package/angular/esm2015/src/controls/snap-in-extension/snap-in-extension.component.js +1 -1
  12. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +75 -34
  13. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
  14. package/angular/src/controls/header/header.component.d.ts +14 -1
  15. package/angular/src/controls/query-editor/query-editor.component.d.ts +1 -1
  16. package/core/data/active-directory/active-directory.js +2 -2
  17. package/core/data/active-directory/active-directory.js.map +1 -1
  18. package/core/data/powershell.d.ts +2 -2
  19. package/core/data/powershell.js +2 -2
  20. package/core/data/powershell.js.map +1 -1
  21. package/core/notification/notification-manager.d.ts +18 -0
  22. package/core/notification/notification-manager.js +55 -10
  23. package/core/notification/notification-manager.js.map +1 -1
  24. package/core/notification/notification-message.d.ts +41 -0
  25. package/core/notification/notification-message.js +3 -0
  26. package/core/notification/notification-message.js.map +1 -0
  27. package/core/notification/notification.d.ts +10 -1
  28. package/core/notification/notification.js +30 -33
  29. package/core/notification/notification.js.map +1 -1
  30. package/core/notification/powershell-notification.d.ts +15 -15
  31. package/core/notification/powershell-notification.js +19 -8
  32. package/core/notification/powershell-notification.js.map +1 -1
  33. package/core/notification/socket-signalr.d.ts +8 -14
  34. package/core/notification/socket-signalr.js +18 -19
  35. package/core/notification/socket-signalr.js.map +1 -1
  36. package/core/notification/work-item-manager.d.ts +4 -0
  37. package/core/notification/work-item-manager.js +76 -20
  38. package/core/notification/work-item-manager.js.map +1 -1
  39. package/e2e/assets/strings/cs-CZ/strings.json +1 -1
  40. package/e2e/assets/strings/de-DE/strings.json +1 -1
  41. package/e2e/assets/strings/es-ES/strings.json +1 -1
  42. package/e2e/assets/strings/fr-FR/strings.json +1 -1
  43. package/e2e/assets/strings/hu-HU/strings.json +1 -1
  44. package/e2e/assets/strings/id-ID/strings.json +1 -1
  45. package/e2e/assets/strings/it-IT/strings.json +1 -1
  46. package/e2e/assets/strings/ja-JP/strings.json +1 -1
  47. package/e2e/assets/strings/ko-KR/strings.json +1 -1
  48. package/e2e/assets/strings/nl-NL/strings.json +1 -1
  49. package/e2e/assets/strings/pl-PL/strings.json +1 -1
  50. package/e2e/assets/strings/pt-BR/strings.json +1 -1
  51. package/e2e/assets/strings/pt-PT/strings.json +1 -1
  52. package/e2e/assets/strings/ru-RU/strings.json +1 -1
  53. package/e2e/assets/strings/strings.json +1 -1
  54. package/e2e/assets/strings/sv-SE/strings.json +1 -1
  55. package/e2e/assets/strings/tr-TR/strings.json +1 -1
  56. package/e2e/assets/strings/zh-CN/strings.json +1 -1
  57. package/e2e/assets/strings/zh-TW/strings.json +1 -1
  58. package/package.json +3 -6
  59. package/styles/css/main-v2.css +1 -1
  60. package/tools/test-runner/index.js +12 -2
  61. package/tools/test-runner/index.js.map +1 -1
  62. package/tools/wac-cli/templates/internal/package.json +0 -4
  63. package/tools/wac-cli/templates/library/angular.json +0 -3
  64. package/tools/wac-cli/templates/library/tsconfig.lib.json +1 -1
  65. package/tools/wac-cli/templates/wac-template/angular.json +0 -3
  66. package/tools/wac-cli/templates/wac-template/package.json +0 -4
  67. package/tools/wac-cli/templates/wac-template/tsconfig.base.json +23 -24
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../packages/core/notification/work-item-manager.ts"],"names":[],"mappings":"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","file":"work-item-manager.js","sourcesContent":["\r\nimport { from, Observable, of, Subscription, throwError } from 'rxjs';\r\nimport { catchError, switchMap } from 'rxjs/operators';\r\nimport { GatewayConnection } from '../data/gateway-connection';\r\nimport { Net } from '../data/net';\r\nimport { NodeConnection } from '../data/node-connection';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\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 { Rpc } from '../rpc/rpc';\r\nimport { RpcWorkItem } from '../rpc/work-item/rpc-work-item-model';\r\nimport { RpcWorkItemSubjectServer } from '../rpc/work-item/rpc-work-item-subject-server';\r\nimport { NotificationConnection } from './notification-connection';\r\nimport { NotificationManager } from './notification-manager';\r\nimport { NotificationState } from './notification-state';\r\nimport { PowerShellNotification } from './powershell-notification';\r\nimport { WorkItemRequestType, WorkItemResult } from './work-item-request';\r\n\r\n/**\r\n * Work item manager class.\r\n */\r\nexport class WorkItemManager {\r\n private static apiWorkItems24hours = '/workitems?lastMinutes=1440';\r\n\r\n public active = false;\r\n\r\n private startSubscription: Subscription;\r\n private powerShellNotification: PowerShellNotification;\r\n private notificationSubscription: Subscription;\r\n private rpcWorkItemSubscription: Subscription;\r\n private notificationManager: NotificationManager;\r\n private sequenceCounter = 1;\r\n private sequencePackets: { [index: number]: { success: boolean, data: WorkItemResult | any } } = {};\r\n private rpcWorkItemSubjectServer: RpcWorkItemSubjectServer;\r\n\r\n /**\r\n * Initializes a new instance of the WorkItemManager class.\r\n *\r\n * @param rpc the RPC object.\r\n * @param gatewayConnection the gateway connection service.\r\n * @param nodeConnection the node connection service.\r\n * @param notificationManager the notification manager.\r\n */\r\n constructor(\r\n private rpc: Rpc,\r\n private gatewayConnection: GatewayConnection,\r\n private nodeConnection: NodeConnection,\r\n public notificationConnection: NotificationConnection) {\r\n this.notificationManager = this.notificationConnection.notificationManager;\r\n this.start();\r\n }\r\n\r\n /**\r\n * Start the work item management.\r\n */\r\n public start(): void {\r\n this.stop();\r\n this.rpcWorkItemSubjectServer = new RpcWorkItemSubjectServer(this.rpc);\r\n this.active = true;\r\n\r\n // pickup active work items for last 24hours\r\n this.startSubscription = this.gatewayConnection.get(WorkItemManager.apiWorkItems24hours)\r\n .pipe(\r\n catchError((error, obj) => {\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationNoWorkItemFound.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Error,\r\n message: message.format(Net.getErrorMessage(error))\r\n });\r\n return of({ response: { value: null } });\r\n }),\r\n switchMap(response => {\r\n if (response.value) {\r\n response.value.forEach(element => {\r\n this.notificationManager.addFromRecover(element);\r\n });\r\n }\r\n\r\n // start websocket status query.\r\n this.powerShellNotification = new PowerShellNotification(this.gatewayConnection.gatewayUrl);\r\n return from(\r\n // converting jQueryPromise to native Promise.\r\n new Promise((resolve, reject) => this.powerShellNotification.initialize().then(resolve, reject))\r\n );\r\n }))\r\n .subscribe(\r\n () => {\r\n // notification from the gateway...\r\n this.notificationSubscription = this.powerShellNotification.subject\r\n .subscribe(item => {\r\n if (item && item.message && item.message.sessionId) {\r\n const psSessionId = item.message.sessionId;\r\n\r\n // Pass in psSessionId so telemetry can search up the PSCommand for this\r\n if (PowerShellNotification.hasError(item)) {\r\n SmeWebTelemetry.tracePowershellEvent(null,\r\n TelemetryEventStates.Error,\r\n { response: item.message, id: psSessionId});\r\n } else if (PowerShellNotification.hasCompleted(item)) {\r\n SmeWebTelemetry.removePowershellId(psSessionId);\r\n }\r\n\r\n if (!this.notificationManager.updateFromMessage(psSessionId, item)) {\r\n const message = MsftSme.getStrings<Strings>()\r\n .MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Warning,\r\n message: message.format(psSessionId)\r\n });\r\n }\r\n }\r\n });\r\n\r\n // workItem request from rpc...\r\n this.rpcWorkItemSubscription = this.rpcWorkItemSubjectServer.subject\r\n .subscribe(item => {\r\n switch (item.data.type) {\r\n // legacy support for quick submission. it was expected 3 seconds response.\r\n case WorkItemRequestType.PowerShellSubmit:\r\n this.submitWorkItem(item.data).toPromise().then(item.deferred.resolve, item.deferred.reject);\r\n break;\r\n\r\n // new support for longer submission case like manage-as dialog displays.\r\n case WorkItemRequestType.WorkItemSubmit:\r\n const submitSequenceId = this.sequenceCounter++;\r\n item.data.sequenceId = submitSequenceId;\r\n this.submitWorkItem(item.data)\r\n .subscribe(\r\n data => this.sequencePackets[submitSequenceId] = { success: true, data: data },\r\n error => this.sequencePackets[submitSequenceId] = { success: false, data: error });\r\n\r\n // using sequence id, submission return immediately.\r\n item.deferred.resolve(<WorkItemResult>{ sequenceId: submitSequenceId, id: null });\r\n break;\r\n\r\n // query to notification by 'id' or query to submission result by 'sequenceId'.\r\n case WorkItemRequestType.StateQuery:\r\n default:\r\n if (item.data.id) {\r\n // query to 'id'\r\n this.queryWorkItem(item.data).toPromise().then(item.deferred.resolve, item.deferred.reject);\r\n } else {\r\n // query to 'sequenceId'\r\n const querySequenceId = item.data.sequenceId;\r\n const result = this.sequencePackets[querySequenceId];\r\n if (result) {\r\n // have a result, delete it and pass back as response.\r\n delete this.sequencePackets[querySequenceId];\r\n if (result.success) {\r\n item.deferred.resolve(result.data);\r\n } else {\r\n item.deferred.reject(result.data);\r\n }\r\n } else {\r\n // no result yet.\r\n item.deferred.resolve(<WorkItemResult>{ sequenceId: querySequenceId, id: null });\r\n }\r\n }\r\n\r\n break;\r\n\r\n }\r\n });\r\n\r\n // subscribe the session notification to the gateway...\r\n this.notificationManager.items.forEach((value) => {\r\n // only if it's not finalized.\r\n if (value.state === NotificationState.Started || value.state === NotificationState.InProgress) {\r\n this.powerShellNotification.subscribeSession(value.id);\r\n }\r\n });\r\n },\r\n error => {\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationWebsocketInitialize.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Error,\r\n message: message.format(Net.getErrorMessage(error))\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Stop the work item management.\r\n */\r\n public stop(): void {\r\n this.active = false;\r\n if (this.startSubscription) {\r\n this.startSubscription.unsubscribe();\r\n this.startSubscription = null;\r\n }\r\n\r\n if (this.notificationSubscription) {\r\n this.notificationSubscription.unsubscribe();\r\n this.notificationSubscription = null;\r\n }\r\n\r\n if (this.powerShellNotification) {\r\n this.powerShellNotification.uninitialize();\r\n this.powerShellNotification = null;\r\n }\r\n\r\n if (this.rpcWorkItemSubscription) {\r\n this.rpcWorkItemSubscription.unsubscribe();\r\n this.rpcWorkItemSubscription = null;\r\n }\r\n }\r\n\r\n /**\r\n * Create and submit a workItem.\r\n *\r\n * @param request the work item request.\r\n * @return Observable the WorkItemResult observable.\r\n */\r\n public submitWorkItem(request: RpcWorkItem): Observable<WorkItemResult> {\r\n let command: PowerShellCommand = null;\r\n const notificationId = request.id || MsftSme.newGuid();\r\n\r\n if (request.powerShellCommand || request.powerShellScript) {\r\n // For a non-powershell long running task (eg: azure site recovery setup), command is null.\r\n command = PowerShell.getPowerShellCommand(request.powerShellCommand || request.powerShellScript);\r\n }\r\n\r\n if (request.powerShellScript) {\r\n delete request['powerShellScript'];\r\n }\r\n\r\n if (request.powerShellCommand) {\r\n delete request['powerShellCommand'];\r\n }\r\n\r\n const nodeRequestOptions = PowerShell.newEndpointOptions(request.nodeRequestOptions);\r\n if (request.nodeRequestOptions) {\r\n delete request['nodeRequestOptions'];\r\n }\r\n\r\n // remember current URL where original request generated.\r\n request.locationPathname = window.location.pathname;\r\n request.locationSearch = window.location.search;\r\n\r\n // send submit notification\r\n this.notificationManager.addFromWorkItem(\r\n notificationId,\r\n request,\r\n request.submittedMessage ? NotificationState.Submitted : NotificationState.Started\r\n );\r\n\r\n return this.powerShellNotification.submit(\r\n this.nodeConnection,\r\n request.nodeName,\r\n command,\r\n request,\r\n nodeRequestOptions,\r\n result => {\r\n if (!this.notificationManager.updateWorkItemWithPsSession(\r\n notificationId, result.id, request, result.state, result.error)) {\r\n const message = MsftSme.getStrings<Strings>()\r\n .MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Warning,\r\n message: message.format(notificationId)\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Query a workItem.\r\n *\r\n * @param request the work item request.\r\n * @return Observable the WorkItemResult observable.\r\n */\r\n public queryWorkItem(request: RpcWorkItem): Observable<WorkItemResult> {\r\n const notification = this.notificationManager.find(request.id);\r\n if (notification) {\r\n if (notification.state === NotificationState.Error) {\r\n return of(<WorkItemResult>{\r\n id: notification.id,\r\n state: notification.state,\r\n percent: notification.progressPercent,\r\n error: notification.object\r\n });\r\n }\r\n\r\n return of(<WorkItemResult>{\r\n id: notification.id,\r\n state: notification.state,\r\n percent: notification.progressPercent,\r\n object: notification.object\r\n });\r\n }\r\n\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationNoIdFound.message;\r\n return throwError(message.format(request.id));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../packages/core/notification/work-item-manager.ts"],"names":[],"mappings":"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","file":"work-item-manager.js","sourcesContent":["\r\nimport { forkJoin, from, Observable, of, Subscription, throwError } from 'rxjs';\r\nimport { catchError, switchMap } from 'rxjs/operators';\r\nimport { GatewayConnection } from '../data/gateway-connection';\r\nimport { Net } from '../data/net';\r\nimport { NodeConnection } from '../data/node-connection';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\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 { Rpc } from '../rpc/rpc';\r\nimport { RpcWorkItem } from '../rpc/work-item/rpc-work-item-model';\r\nimport { RpcWorkItemSubjectServer } from '../rpc/work-item/rpc-work-item-subject-server';\r\nimport { NotificationConnection } from './notification-connection';\r\nimport { NotificationManager } from './notification-manager';\r\nimport { NotificationMessage } from './notification-message';\r\nimport { NotificationState } from './notification-state';\r\nimport { PowerShellNotification, PowerShellWorkItemMessage } from './powershell-notification';\r\nimport { SocketMessage } from './socket-signalr';\r\nimport { WorkItemRequestType, WorkItemResult } from './work-item-request';\r\n\r\n/**\r\n * Work item manager class.\r\n */\r\nexport class WorkItemManager {\r\n private static apiWorkItems24hours = '/workitems?lastMinutes=1440';\r\n private static apiNotificationMessageStored = '/NotificationMessage/stored';\r\n private static apiNotificationMessageSubscriptionId = '/NotificationMessage/id';\r\n\r\n public active = false;\r\n\r\n private startSubscription: Subscription;\r\n private powerShellNotification: PowerShellNotification;\r\n private notificationSubscription: Subscription;\r\n private rpcWorkItemSubscription: Subscription;\r\n private notificationManager: NotificationManager;\r\n private sequenceCounter = 1;\r\n private sequencePackets: { [index: number]: { success: boolean, data: WorkItemResult | any } } = {};\r\n private rpcWorkItemSubjectServer: RpcWorkItemSubjectServer;\r\n private rootSubscriptionId: string;\r\n\r\n /**\r\n * Initializes a new instance of the WorkItemManager class.\r\n *\r\n * @param rpc the RPC object.\r\n * @param gatewayConnection the gateway connection service.\r\n * @param nodeConnection the node connection service.\r\n * @param notificationManager the notification manager.\r\n */\r\n constructor(\r\n private rpc: Rpc,\r\n private gatewayConnection: GatewayConnection,\r\n private nodeConnection: NodeConnection,\r\n public notificationConnection: NotificationConnection) {\r\n this.notificationManager = this.notificationConnection.notificationManager;\r\n this.start();\r\n }\r\n\r\n /**\r\n * Start the work item management.\r\n */\r\n public start(): void {\r\n this.stop();\r\n this.rpcWorkItemSubjectServer = new RpcWorkItemSubjectServer(this.rpc);\r\n this.active = true;\r\n\r\n // pickup active work items for last 24hours\r\n this.startSubscription = this.gatewayConnection.get(WorkItemManager.apiWorkItems24hours)\r\n .pipe(\r\n catchError((error, obj) => {\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationNoWorkItemFound.message;\r\n Logging.logError('Notification', message.format(Net.getErrorMessage(error)));\r\n return of({ response: { value: null } });\r\n }),\r\n switchMap(response => {\r\n if (response.value) {\r\n response.value.forEach(element => this.notificationManager.addFromRecover(element));\r\n }\r\n\r\n // start websocket status query.\r\n this.powerShellNotification = new PowerShellNotification(this.gatewayConnection.gatewayUrl);\r\n return from(this.powerShellNotification.initialize());\r\n }))\r\n .subscribe(\r\n () => {\r\n // notification from the gateway...\r\n this.notificationSubscription = this.powerShellNotification.subject\r\n .subscribe(item => {\r\n const message: any = item.message;\r\n if (message && message.sessionId) {\r\n // PowerShell Work Item message.\r\n const workItem: PowerShellWorkItemMessage = message;\r\n const psSessionId = workItem.sessionId;\r\n\r\n // Pass in psSessionId so telemetry can search up the PSCommand for this\r\n if (PowerShellNotification.hasError(item)) {\r\n SmeWebTelemetry.tracePowershellEvent(\r\n null, TelemetryEventStates.Error, { response: workItem, id: psSessionId});\r\n } else if (PowerShellNotification.hasCompleted(item)) {\r\n SmeWebTelemetry.removePowershellId(psSessionId);\r\n }\r\n\r\n if (!this.notificationManager.updateFromMessage(\r\n psSessionId, <SocketMessage<PowerShellWorkItemMessage>>item)) {\r\n const unexpectedMessage =\r\n MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;\r\n Logging.log({\r\n source: 'Notification', level: LogLevel.Warning, message: unexpectedMessage.format(psSessionId),\r\n });\r\n }\r\n } else if (message && message.id) {\r\n // PowerShell Work Item message.\r\n const notification: NotificationMessage = message;\r\n const state = this.getErrorLevel(notification);\r\n\r\n // Pass in psSessionId so telemetry can search up the PSCommand for this\r\n if (state === NotificationState.Error) {\r\n SmeWebTelemetry.tracePowershellEvent(\r\n null, TelemetryEventStates.Error, { response: message, id: message.id});\r\n } else if (state === NotificationState.Success) {\r\n SmeWebTelemetry.removePowershellId(message.id);\r\n }\r\n\r\n if (this.notificationManager.addForNotificationMessage(state, notification)) {\r\n this.powerShellNotification.subscribeSession(notification.id);\r\n }\r\n\r\n if (!this.notificationManager.updateFromNotificationMessage(state, message)) {\r\n const unexpectedMessage =\r\n MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;\r\n Logging.logWarning('Notification', unexpectedMessage.format(message.id));\r\n }\r\n }\r\n });\r\n\r\n this.notificationSubscription.add(\r\n forkJoin([\r\n this.gatewayConnection.get(WorkItemManager.apiNotificationMessageSubscriptionId),\r\n this.gatewayConnection.get(WorkItemManager.apiNotificationMessageStored),\r\n ]).subscribe(([idData, storedData]) => {\r\n this.rootSubscriptionId = idData.id;\r\n this.powerShellNotification.subscribeSession(this.rootSubscriptionId);\r\n storedData.value.forEach(element => {\r\n const state = this.getErrorLevel(element);\r\n this.notificationManager.addForNotificationMessage(state, element);\r\n this.powerShellNotification.subscribeSession(element.id);\r\n });\r\n }));\r\n\r\n // workItem request from rpc...\r\n this.rpcWorkItemSubscription = this.rpcWorkItemSubjectServer.subject\r\n .subscribe(item => {\r\n switch (item.data.type) {\r\n // legacy support for quick submission. it was expected 3 seconds response.\r\n case WorkItemRequestType.PowerShellSubmit:\r\n this.submitWorkItem(item.data).toPromise().then(item.deferred.resolve, item.deferred.reject);\r\n break;\r\n\r\n // new support for longer submission case like manage-as dialog displays.\r\n case WorkItemRequestType.WorkItemSubmit:\r\n const submitSequenceId = this.sequenceCounter++;\r\n item.data.sequenceId = submitSequenceId;\r\n this.submitWorkItem(item.data)\r\n .subscribe(\r\n data => this.sequencePackets[submitSequenceId] = { success: true, data: data },\r\n error => this.sequencePackets[submitSequenceId] = { success: false, data: error });\r\n\r\n // using sequence id, submission return immediately.\r\n item.deferred.resolve(<WorkItemResult>{ sequenceId: submitSequenceId, id: null });\r\n break;\r\n\r\n // query to notification by 'id' or query to submission result by 'sequenceId'.\r\n case WorkItemRequestType.StateQuery:\r\n default:\r\n if (item.data.id) {\r\n // query to 'id'\r\n this.queryWorkItem(item.data).toPromise().then(item.deferred.resolve, item.deferred.reject);\r\n } else {\r\n // query to 'sequenceId'\r\n const querySequenceId = item.data.sequenceId;\r\n const result = this.sequencePackets[querySequenceId];\r\n if (result) {\r\n // have a result, delete it and pass back as response.\r\n delete this.sequencePackets[querySequenceId];\r\n if (result.success) {\r\n item.deferred.resolve(result.data);\r\n } else {\r\n item.deferred.reject(result.data);\r\n }\r\n } else {\r\n // no result yet.\r\n item.deferred.resolve(<WorkItemResult>{ sequenceId: querySequenceId, id: null });\r\n }\r\n }\r\n\r\n break;\r\n\r\n }\r\n });\r\n\r\n // subscribe the session notification to the gateway...\r\n this.notificationManager.items.forEach((value) => {\r\n // only if it's not finalized.\r\n if (value.state === NotificationState.Started || value.state === NotificationState.InProgress) {\r\n this.powerShellNotification.subscribeSession(value.id);\r\n }\r\n });\r\n },\r\n error => {\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationWebsocketInitialize.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Error,\r\n message: message.format(Net.getErrorMessage(error))\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Stop the work item management.\r\n */\r\n public stop(): void {\r\n this.active = false;\r\n if (this.startSubscription) {\r\n this.startSubscription.unsubscribe();\r\n this.startSubscription = null;\r\n }\r\n\r\n if (this.notificationSubscription) {\r\n this.notificationSubscription.unsubscribe();\r\n this.notificationSubscription = null;\r\n }\r\n\r\n if (this.powerShellNotification) {\r\n this.powerShellNotification.uninitialize();\r\n this.powerShellNotification = null;\r\n }\r\n\r\n if (this.rpcWorkItemSubscription) {\r\n this.rpcWorkItemSubscription.unsubscribe();\r\n this.rpcWorkItemSubscription = null;\r\n }\r\n }\r\n\r\n /**\r\n * Create and submit a workItem.\r\n *\r\n * @param request the work item request.\r\n * @return Observable the WorkItemResult observable.\r\n */\r\n public submitWorkItem(request: RpcWorkItem): Observable<WorkItemResult> {\r\n let command: PowerShellCommand = null;\r\n const notificationId = request.id || MsftSme.newGuid();\r\n\r\n if (request.powerShellCommand || request.powerShellScript) {\r\n // For a non-powershell long running task (eg: azure site recovery setup), command is null.\r\n command = PowerShell.getPowerShellCommand(request.powerShellCommand || request.powerShellScript);\r\n }\r\n\r\n if (request.powerShellScript) {\r\n delete request['powerShellScript'];\r\n }\r\n\r\n if (request.powerShellCommand) {\r\n delete request['powerShellCommand'];\r\n }\r\n\r\n const nodeRequestOptions = PowerShell.newEndpointOptions(request.nodeRequestOptions);\r\n if (request.nodeRequestOptions) {\r\n delete request['nodeRequestOptions'];\r\n }\r\n\r\n // remember current URL where original request generated.\r\n request.locationPathname = window.location.pathname;\r\n request.locationSearch = window.location.search;\r\n\r\n // send submit notification\r\n this.notificationManager.addFromWorkItem(\r\n notificationId,\r\n request,\r\n request.submittedMessage ? NotificationState.Submitted : NotificationState.Started);\r\n\r\n return this.powerShellNotification.submit(\r\n this.nodeConnection,\r\n request.nodeName,\r\n command,\r\n request,\r\n nodeRequestOptions,\r\n result => {\r\n if (!this.notificationManager.updateWorkItemWithPsSession(\r\n notificationId, result.id, request, result.state, result.error)) {\r\n const message = MsftSme.getStrings<Strings>()\r\n .MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;\r\n Logging.log({\r\n source: 'Notification',\r\n level: LogLevel.Warning,\r\n message: message.format(notificationId)\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Query a workItem.\r\n *\r\n * @param request the work item request.\r\n * @return Observable the WorkItemResult observable.\r\n */\r\n public queryWorkItem(request: RpcWorkItem): Observable<WorkItemResult> {\r\n const notification = this.notificationManager.find(request.id);\r\n if (notification) {\r\n if (notification.state === NotificationState.Error) {\r\n return of(<WorkItemResult>{\r\n id: notification.id,\r\n state: notification.state,\r\n percent: notification.progressPercent,\r\n error: notification.object\r\n });\r\n }\r\n\r\n return of(<WorkItemResult>{\r\n id: notification.id,\r\n state: notification.state,\r\n percent: notification.progressPercent,\r\n object: notification.object\r\n });\r\n }\r\n\r\n const message = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationNoIdFound.message;\r\n return throwError(message.format(request.id));\r\n }\r\n\r\n private getErrorLevel(notification: NotificationMessage): NotificationState {\r\n switch (notification.errorLevel) {\r\n // Notification is unknown.\r\n case 0:\r\n case 'None':\r\n return NotificationState.Informational;\r\n\r\n // Notification is in progress. (non-terminated message.)\r\n case 1:\r\n case 'InProgress':\r\n return NotificationState.InProgress;\r\n\r\n // Notification is success. (terminated message.)\r\n case 2:\r\n case 'Success':\r\n return NotificationState.Success;\r\n\r\n // Notification is informational. (terminated message.)\r\n case 3:\r\n case 'Informational':\r\n return NotificationState.Informational;\r\n\r\n // Notification is warning. (terminated message.)\r\n case 4:\r\n case 'Warning':\r\n return NotificationState.Warning;\r\n\r\n // Notification is error. (terminated message.)\r\n case 5:\r\n case 'Error':\r\n return NotificationState.Error;\r\n\r\n // Notification is unknown.\r\n default:\r\n throw new Error('Couldn\\'t get expected error level from a message notification.');\r\n }\r\n }\r\n}\r\n"]}