@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.
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +88 -41
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/data-table/data-table.component.js +6 -2
- package/angular/esm2015/src/controls/dialog/dialog.component.js +11 -11
- package/angular/esm2015/src/controls/dialog/extension-dialog/extension-dialog.component.js +7 -7
- package/angular/esm2015/src/controls/header/header.component.js +52 -14
- package/angular/esm2015/src/controls/layout/layout-config.js +1 -2
- package/angular/esm2015/src/controls/query-editor/query-editor.component.js +4 -4
- package/angular/esm2015/src/controls/snap-in-extension/snap-in-extension.component.js +1 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +75 -34
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/src/controls/header/header.component.d.ts +14 -1
- package/angular/src/controls/query-editor/query-editor.component.d.ts +1 -1
- package/core/data/active-directory/active-directory.js +2 -2
- package/core/data/active-directory/active-directory.js.map +1 -1
- package/core/data/powershell.d.ts +2 -2
- package/core/data/powershell.js +2 -2
- package/core/data/powershell.js.map +1 -1
- package/core/notification/notification-manager.d.ts +18 -0
- package/core/notification/notification-manager.js +55 -10
- package/core/notification/notification-manager.js.map +1 -1
- package/core/notification/notification-message.d.ts +41 -0
- package/core/notification/notification-message.js +3 -0
- package/core/notification/notification-message.js.map +1 -0
- package/core/notification/notification.d.ts +10 -1
- package/core/notification/notification.js +30 -33
- package/core/notification/notification.js.map +1 -1
- package/core/notification/powershell-notification.d.ts +15 -15
- package/core/notification/powershell-notification.js +19 -8
- package/core/notification/powershell-notification.js.map +1 -1
- package/core/notification/socket-signalr.d.ts +8 -14
- package/core/notification/socket-signalr.js +18 -19
- package/core/notification/socket-signalr.js.map +1 -1
- package/core/notification/work-item-manager.d.ts +4 -0
- package/core/notification/work-item-manager.js +76 -20
- package/core/notification/work-item-manager.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/id-ID/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +3 -6
- package/styles/css/main-v2.css +1 -1
- package/tools/test-runner/index.js +12 -2
- package/tools/test-runner/index.js.map +1 -1
- package/tools/wac-cli/templates/internal/package.json +0 -4
- package/tools/wac-cli/templates/library/angular.json +0 -3
- package/tools/wac-cli/templates/library/tsconfig.lib.json +1 -1
- package/tools/wac-cli/templates/wac-template/angular.json +0 -3
- package/tools/wac-cli/templates/wac-template/package.json +0 -4
- package/tools/wac-cli/templates/wac-template/tsconfig.base.json +23 -24
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types='jquery' />
|
|
2
1
|
import { of, Subject } from 'rxjs';
|
|
3
2
|
import { catchError, map } from 'rxjs/operators';
|
|
4
3
|
import { Net } from '../data/net';
|
|
@@ -17,7 +16,7 @@ export class PowerShellNotification extends SocketSignalR {
|
|
|
17
16
|
* Initializes a new instance of the GatewaySocket class.
|
|
18
17
|
*/
|
|
19
18
|
constructor(gatewayUrl) {
|
|
20
|
-
super(gatewayUrl, PowerShellNotification.connectionUrl
|
|
19
|
+
super(gatewayUrl, PowerShellNotification.connectionUrl);
|
|
21
20
|
}
|
|
22
21
|
/* tslint:disable:no-bitwise */
|
|
23
22
|
static hasConnectionError(item) {
|
|
@@ -42,7 +41,7 @@ export class PowerShellNotification extends SocketSignalR {
|
|
|
42
41
|
* Gets the subject observable to get notifications.
|
|
43
42
|
*/
|
|
44
43
|
get subject() {
|
|
45
|
-
return this.subjectInternal;
|
|
44
|
+
return this.subjectInternal.asObservable();
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
48
47
|
* Submit PowerShell command as a work item.
|
|
@@ -117,7 +116,7 @@ export class PowerShellNotification extends SocketSignalR {
|
|
|
117
116
|
const powershellCommandId = response.id ? response.id : response.sessionId;
|
|
118
117
|
SmeWebTelemetry.addPowershellId(powershellCommandId, command);
|
|
119
118
|
}
|
|
120
|
-
this.
|
|
119
|
+
this.processPowerShellData(response);
|
|
121
120
|
// sending back the client.
|
|
122
121
|
const workItemResult = { id: result.id, state: result.state, error: error };
|
|
123
122
|
// passing in the results as object of the workItemResult
|
|
@@ -178,9 +177,18 @@ export class PowerShellNotification extends SocketSignalR {
|
|
|
178
177
|
return;
|
|
179
178
|
}
|
|
180
179
|
const data = JSON.parse(message);
|
|
181
|
-
|
|
180
|
+
if (data.sessionId) {
|
|
181
|
+
// PowerShell work item.
|
|
182
|
+
this.processPowerShellData(data);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (data.id) {
|
|
186
|
+
// Notification message.
|
|
187
|
+
this.processMessageData(data);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
182
190
|
}
|
|
183
|
-
|
|
191
|
+
processPowerShellData(data) {
|
|
184
192
|
/* tslint:disable:no-bitwise */
|
|
185
193
|
let type = SocketMessageFlags.None;
|
|
186
194
|
if (data.results && data.results.length > 0) {
|
|
@@ -201,10 +209,13 @@ export class PowerShellNotification extends SocketSignalR {
|
|
|
201
209
|
/* tslint:enable:no-bitwise */
|
|
202
210
|
this.clientHandler({ type: type, message: data });
|
|
203
211
|
}
|
|
212
|
+
processMessageData(message) {
|
|
213
|
+
const type = SocketMessageFlags.Data;
|
|
214
|
+
this.clientHandler({ type, message });
|
|
215
|
+
}
|
|
204
216
|
}
|
|
205
217
|
PowerShellNotification.connectionUrl = '/api/notifications';
|
|
206
|
-
PowerShellNotification.
|
|
207
|
-
PowerShellNotification.notify = 'notify';
|
|
218
|
+
PowerShellNotification.notify = 'Notify';
|
|
208
219
|
PowerShellNotification.subscribe = 'Subscribe';
|
|
209
220
|
|
|
210
221
|
//# sourceMappingURL=powershell-notification.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/notification/powershell-notification.ts"],"names":[],"mappings":"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","file":"powershell-notification.js","sourcesContent":["/// <reference types='jquery' />\r\n\r\nimport { Observable, of, Subject } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { Net } from '../data/net';\r\nimport { NodeConnection, NodeRequestOptions } from '../data/node-connection';\r\nimport { 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 { NotificationState } from './notification-state';\r\nimport { SocketMessage, SocketMessageFlags, SocketSignalR } from './socket-signalr';\r\nimport { WorkItemResult } from './work-item-request';\r\n\r\n/**\r\n * PowerShell Submit result object.\r\n */\r\nexport interface PowerShellSubmitResult {\r\n id: string;\r\n completed: boolean;\r\n error: any;\r\n state: NotificationState;\r\n}\r\n\r\n/**\r\n * Powershell work item message.\r\n */\r\nexport interface PowerShellWorkItemMessage {\r\n sessionId?: string;\r\n completed?: string; // True, False\r\n results?: any[];\r\n progress?: any[];\r\n errors?: any[];\r\n exception?: string;\r\n}\r\n\r\n/**\r\n * The PowerShell script based notification class.\r\n */\r\nexport class PowerShellNotification extends SocketSignalR<PowerShellWorkItemMessage> {\r\n private static connectionUrl = '/api/notifications';\r\n private static proxyName = 'notificationHub';\r\n private static notify = 'notify';\r\n private static subscribe = 'Subscribe';\r\n private subjectInternal: Subject<SocketMessage<PowerShellWorkItemMessage>>;\r\n\r\n /* tslint:disable:no-bitwise */\r\n public static hasConnectionError(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.ConnectionError) === SocketMessageFlags.ConnectionError;\r\n }\r\n\r\n public static hasError(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Error) === SocketMessageFlags.Error;\r\n }\r\n\r\n public static hasException(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Exception) === SocketMessageFlags.Exception;\r\n }\r\n\r\n public static hasCompleted(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Completed) === SocketMessageFlags.Completed;\r\n }\r\n\r\n public static hasData(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Data) === SocketMessageFlags.Data;\r\n }\r\n\r\n public static hasProgress(item: SocketMessage<PowerShellWorkItemMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Progress) === SocketMessageFlags.Progress;\r\n }\r\n\r\n /* tslint:enable:no-bitwise */\r\n\r\n /**\r\n * Initializes a new instance of the GatewaySocket class.\r\n */\r\n constructor(gatewayUrl: string) {\r\n super(gatewayUrl, PowerShellNotification.connectionUrl, PowerShellNotification.proxyName);\r\n }\r\n\r\n /**\r\n * Gets the subject observable to get notifications.\r\n */\r\n public get subject(): Subject<SocketMessage<PowerShellWorkItemMessage>> {\r\n return this.subjectInternal;\r\n }\r\n\r\n /**\r\n * Submit PowerShell command as a work item.\r\n *\r\n * @param nodeConnection The node connection.\r\n * @param command The PowerShell command.\r\n * @param metadata The meta data.\r\n * @param nodeRequestOptions The node request options.\r\n * @param create The callback to create new notification.\r\n * @return Observable the observable of initial powershell query result.\r\n */\r\n public submit(\r\n nodeConnection: NodeConnection,\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n metadata: any,\r\n nodeRequestOptions?: NodeRequestOptions,\r\n create?: (result: PowerShellSubmitResult) => void): Observable<WorkItemResult> {\r\n // For a non-powershell long running task (eg: azure site recovery setup):\r\n // The 'command' parameter is null.\r\n // The metadata.id is the workitem id generated by a gateway api.\r\n if (!command && metadata.id) {\r\n const result = <PowerShellSubmitResult>{\r\n id: metadata.id,\r\n completed: false,\r\n error: null,\r\n state: NotificationState.Started\r\n };\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n this.subscribeSession(metadata.id);\r\n return of(<WorkItemResult>{ id: metadata.id, state: NotificationState.Started, error: null });\r\n }\r\n\r\n const data: any = Net.createPropertiesJSONString({\r\n ...command,\r\n useInProcRunspace: nodeRequestOptions.useInProcRunspace,\r\n ...{ metadata: metadata } });\r\n return nodeConnection.post(nodeName, Net.powerShellApiInvokeCommand, data, nodeRequestOptions)\r\n .pipe(\r\n catchError((error: AjaxError, obj) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error,\r\n {response: error.response});\r\n\r\n const result = <PowerShellSubmitResult>{\r\n id: MsftSme.newGuid(),\r\n completed: true,\r\n error: { message: Net.getErrorMessage(error) },\r\n state: NotificationState.Error\r\n };\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n return of(<WorkItemResult>{ id: result.id, state: result.state, error: result.error });\r\n }),\r\n map((response: any) => {\r\n const completed = response.completed === 'True';\r\n\r\n if (response.id) {\r\n // sending back the client for the error.\r\n return <WorkItemResult>response;\r\n }\r\n\r\n let error: any = null;\r\n if (response.errors && response.errors.length > 0) {\r\n const errorObj: any = MsftSme.first(response.errors);\r\n error = { message: errorObj.message };\r\n\r\n SmeWebTelemetry.tracePowershellEvent(command,\r\n TelemetryEventStates.Error,\r\n {response: response});\r\n }\r\n\r\n const result = <PowerShellSubmitResult>{\r\n id: response.sessionId,\r\n completed: completed,\r\n error: error,\r\n state: completed ?\r\n (response.errors ? NotificationState.Error : NotificationState.Success)\r\n : NotificationState.Started\r\n };\r\n\r\n if (result.state === NotificationState.Success) {\r\n result.error = response.results[0];\r\n }\r\n\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n if (!result.completed) {\r\n this.subscribeSession(response.sessionId);\r\n\r\n // store ID here to correlate command with the gateway notification later\r\n const powershellCommandId = response.id ? response.id : response.sessionId;\r\n SmeWebTelemetry.addPowershellId(powershellCommandId, command);\r\n }\r\n\r\n this.processData(response);\r\n\r\n // sending back the client.\r\n const workItemResult = <WorkItemResult>{ id: result.id, state: result.state, error: error };\r\n\r\n // passing in the results as object of the workItemResult\r\n if (response.results) {\r\n workItemResult.object = response.results;\r\n }\r\n\r\n return workItemResult;\r\n }));\r\n }\r\n\r\n /**\r\n * Initialize to subscribe the web socket connection.\r\n */\r\n public initialize(): JQueryPromise<any> {\r\n if (this.subjectInternal) {\r\n this.subjectInternal.complete();\r\n }\r\n\r\n this.subjectInternal = new Subject<SocketMessage<PowerShellWorkItemMessage>>();\r\n this.subscribe(PowerShellNotification.notify);\r\n return this.start();\r\n }\r\n\r\n /**\r\n * Uninitialize to subscribe the web socket connection.\r\n */\r\n public uninitialize(): void {\r\n if (this.subjectInternal) {\r\n this.subjectInternal.complete();\r\n this.subjectInternal = null;\r\n }\r\n\r\n this.unsubscribe(PowerShellNotification.notify);\r\n this.stop();\r\n }\r\n\r\n /**\r\n * Invoke subscribe method to a session.\r\n *\r\n * @param id the session ID of work item.\r\n * @return Promise the promise object.\r\n */\r\n public subscribeSession(id: string): JQueryPromise<any> {\r\n return this.invoke(PowerShellNotification.subscribe, id);\r\n }\r\n\r\n /**\r\n * The client handler to process message.\r\n *\r\n * @param notification the message notification.\r\n */\r\n protected clientHandler(notification: SocketMessage<PowerShellWorkItemMessage>): void {\r\n this.subjectInternal.next(notification);\r\n }\r\n\r\n /**\r\n * Process the message.\r\n *\r\n * @param messages the messages.\r\n */\r\n protected processMessage(message: string): void {\r\n if (!message) {\r\n const message2 = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationEmptyMessage.message;\r\n Logging.log({ source: 'socket', level: LogLevel.Warning, message: message2 });\r\n return;\r\n }\r\n\r\n const data: any = JSON.parse(message);\r\n this.processData(data);\r\n }\r\n\r\n private processData(data: any): void {\r\n /* tslint:disable:no-bitwise */\r\n let type: SocketMessageFlags = SocketMessageFlags.None;\r\n if (data.results && data.results.length > 0) {\r\n type |= SocketMessageFlags.Data;\r\n }\r\n\r\n if (data.progress && data.progress.length > 0) {\r\n type |= SocketMessageFlags.Progress;\r\n }\r\n\r\n if (data.errors && data.errors.length > 0) {\r\n type |= SocketMessageFlags.Error;\r\n }\r\n\r\n if (data.exception) {\r\n type |= SocketMessageFlags.Exception;\r\n }\r\n\r\n if (data.completed === 'True') {\r\n type |= SocketMessageFlags.Completed;\r\n }\r\n\r\n /* tslint:enable:no-bitwise */\r\n\r\n this.clientHandler({ type: type, message: data });\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/notification/powershell-notification.ts"],"names":[],"mappings":"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","file":"powershell-notification.js","sourcesContent":["import { Observable, of, Subject } from 'rxjs';\r\nimport { AjaxError } from 'rxjs/ajax';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { Net } from '../data/net';\r\nimport { NodeConnection, NodeRequestOptions } from '../data/node-connection';\r\nimport { 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 { NotificationMessage } from './notification-message';\r\nimport { NotificationState } from './notification-state';\r\nimport { SocketMessage, SocketMessageFlags, SocketSignalR } from './socket-signalr';\r\nimport { WorkItemResult } from './work-item-request';\r\n\r\n/**\r\n * PowerShell Submit result object.\r\n */\r\nexport interface PowerShellSubmitResult {\r\n id: string;\r\n completed: boolean;\r\n error: any;\r\n state: NotificationState;\r\n}\r\n\r\n/**\r\n * Powershell work item message.\r\n */\r\nexport interface PowerShellWorkItemMessage {\r\n sessionId?: string;\r\n completed?: string; // True, False\r\n results?: any[];\r\n progress?: any[];\r\n errors?: any[];\r\n exception?: string;\r\n}\r\n\r\n/**\r\n * The PowerShell script based notification class.\r\n */\r\nexport class PowerShellNotification extends SocketSignalR<PowerShellWorkItemMessage | NotificationMessage> {\r\n private static connectionUrl = '/api/notifications';\r\n private static notify = 'Notify';\r\n private static subscribe = 'Subscribe';\r\n private subjectInternal: Subject<SocketMessage<PowerShellWorkItemMessage | NotificationMessage>>;\r\n\r\n /* tslint:disable:no-bitwise */\r\n public static hasConnectionError(item: SocketMessage<PowerShellWorkItemMessage | NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.ConnectionError) === SocketMessageFlags.ConnectionError;\r\n }\r\n\r\n public static hasError(item: SocketMessage<PowerShellWorkItemMessage | NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Error) === SocketMessageFlags.Error;\r\n }\r\n\r\n public static hasException(item: SocketMessage<PowerShellWorkItemMessage | NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Exception) === SocketMessageFlags.Exception;\r\n }\r\n\r\n public static hasCompleted(item: SocketMessage<PowerShellWorkItemMessage| NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Completed) === SocketMessageFlags.Completed;\r\n }\r\n\r\n public static hasData(item: SocketMessage<PowerShellWorkItemMessage| NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Data) === SocketMessageFlags.Data;\r\n }\r\n\r\n public static hasProgress(item: SocketMessage<PowerShellWorkItemMessage | NotificationMessage>): boolean {\r\n return (item.type & SocketMessageFlags.Progress) === SocketMessageFlags.Progress;\r\n }\r\n\r\n /* tslint:enable:no-bitwise */\r\n\r\n /**\r\n * Initializes a new instance of the GatewaySocket class.\r\n */\r\n constructor(gatewayUrl: string) {\r\n super(gatewayUrl, PowerShellNotification.connectionUrl);\r\n }\r\n\r\n /**\r\n * Gets the subject observable to get notifications.\r\n */\r\n public get subject(): Observable<SocketMessage<PowerShellWorkItemMessage | NotificationMessage>> {\r\n return this.subjectInternal.asObservable();\r\n }\r\n\r\n /**\r\n * Submit PowerShell command as a work item.\r\n *\r\n * @param nodeConnection The node connection.\r\n * @param command The PowerShell command.\r\n * @param metadata The meta data.\r\n * @param nodeRequestOptions The node request options.\r\n * @param create The callback to create new notification.\r\n * @return Observable the observable of initial powershell query result.\r\n */\r\n public submit(\r\n nodeConnection: NodeConnection,\r\n nodeName: string,\r\n command: PowerShellCommand,\r\n metadata: any,\r\n nodeRequestOptions?: NodeRequestOptions,\r\n create?: (result: PowerShellSubmitResult) => void): Observable<WorkItemResult> {\r\n // For a non-powershell long running task (eg: azure site recovery setup):\r\n // The 'command' parameter is null.\r\n // The metadata.id is the workitem id generated by a gateway api.\r\n if (!command && metadata.id) {\r\n const result = <PowerShellSubmitResult>{\r\n id: metadata.id,\r\n completed: false,\r\n error: null,\r\n state: NotificationState.Started\r\n };\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n this.subscribeSession(metadata.id);\r\n return of(<WorkItemResult>{ id: metadata.id, state: NotificationState.Started, error: null });\r\n }\r\n\r\n const data: any = Net.createPropertiesJSONString({\r\n ...command,\r\n useInProcRunspace: nodeRequestOptions.useInProcRunspace,\r\n ...{ metadata: metadata } });\r\n return nodeConnection.post(nodeName, Net.powerShellApiInvokeCommand, data, nodeRequestOptions)\r\n .pipe(\r\n catchError((error: AjaxError, obj) => {\r\n SmeWebTelemetry.tracePowershellEvent(command, TelemetryEventStates.Error,\r\n {response: error.response});\r\n\r\n const result = <PowerShellSubmitResult>{\r\n id: MsftSme.newGuid(),\r\n completed: true,\r\n error: { message: Net.getErrorMessage(error) },\r\n state: NotificationState.Error\r\n };\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n return of(<WorkItemResult>{ id: result.id, state: result.state, error: result.error });\r\n }),\r\n map((response: any) => {\r\n const completed = response.completed === 'True';\r\n\r\n if (response.id) {\r\n // sending back the client for the error.\r\n return <WorkItemResult>response;\r\n }\r\n\r\n let error: any = null;\r\n if (response.errors && response.errors.length > 0) {\r\n const errorObj: any = MsftSme.first(response.errors);\r\n error = { message: errorObj.message };\r\n\r\n SmeWebTelemetry.tracePowershellEvent(command,\r\n TelemetryEventStates.Error,\r\n {response: response});\r\n }\r\n\r\n const result = <PowerShellSubmitResult>{\r\n id: response.sessionId,\r\n completed: completed,\r\n error: error,\r\n state: completed ?\r\n (response.errors ? NotificationState.Error : NotificationState.Success)\r\n : NotificationState.Started\r\n };\r\n\r\n if (result.state === NotificationState.Success) {\r\n result.error = response.results[0];\r\n }\r\n\r\n if (create) {\r\n create(result);\r\n }\r\n\r\n if (!result.completed) {\r\n this.subscribeSession(response.sessionId);\r\n\r\n // store ID here to correlate command with the gateway notification later\r\n const powershellCommandId = response.id ? response.id : response.sessionId;\r\n SmeWebTelemetry.addPowershellId(powershellCommandId, command);\r\n }\r\n\r\n this.processPowerShellData(response);\r\n\r\n // sending back the client.\r\n const workItemResult = <WorkItemResult>{ id: result.id, state: result.state, error: error };\r\n\r\n // passing in the results as object of the workItemResult\r\n if (response.results) {\r\n workItemResult.object = response.results;\r\n }\r\n\r\n return workItemResult;\r\n }));\r\n }\r\n\r\n /**\r\n * Initialize to subscribe the web socket connection.\r\n */\r\n public initialize(): Promise<any> {\r\n if (this.subjectInternal) {\r\n this.subjectInternal.complete();\r\n }\r\n\r\n this.subjectInternal = new Subject<SocketMessage<PowerShellWorkItemMessage | NotificationMessage>>();\r\n this.subscribe(PowerShellNotification.notify);\r\n return this.start();\r\n }\r\n\r\n /**\r\n * Uninitialize to subscribe the web socket connection.\r\n */\r\n public uninitialize(): void {\r\n if (this.subjectInternal) {\r\n this.subjectInternal.complete();\r\n this.subjectInternal = null;\r\n }\r\n\r\n this.unsubscribe(PowerShellNotification.notify);\r\n this.stop();\r\n }\r\n\r\n /**\r\n * Invoke subscribe method to a session.\r\n *\r\n * @param id the session ID of work item.\r\n * @return Promise the promise object.\r\n */\r\n public subscribeSession(id: string): Promise<PowerShellWorkItemMessage | NotificationMessage> {\r\n return this.invoke(PowerShellNotification.subscribe, id);\r\n }\r\n\r\n /**\r\n * The client handler to process message.\r\n *\r\n * @param notification the message notification.\r\n */\r\n protected clientHandler(notification: SocketMessage<PowerShellWorkItemMessage | NotificationMessage>): void {\r\n this.subjectInternal.next(notification);\r\n }\r\n\r\n /**\r\n * Process the message.\r\n *\r\n * @param messages the messages.\r\n */\r\n protected processMessage(message: string): void {\r\n if (!message) {\r\n const message2 = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error.NotificationEmptyMessage.message;\r\n Logging.log({ source: 'socket', level: LogLevel.Warning, message: message2 });\r\n return;\r\n }\r\n\r\n const data: any = JSON.parse(message);\r\n if (data.sessionId) {\r\n // PowerShell work item.\r\n this.processPowerShellData(data);\r\n return;\r\n }\r\n\r\n if (data.id) {\r\n // Notification message.\r\n this.processMessageData(data);\r\n return;\r\n }\r\n }\r\n\r\n private processPowerShellData(data: PowerShellWorkItemMessage): void {\r\n /* tslint:disable:no-bitwise */\r\n let type: SocketMessageFlags = SocketMessageFlags.None;\r\n if (data.results && data.results.length > 0) {\r\n type |= SocketMessageFlags.Data;\r\n }\r\n\r\n if (data.progress && data.progress.length > 0) {\r\n type |= SocketMessageFlags.Progress;\r\n }\r\n\r\n if (data.errors && data.errors.length > 0) {\r\n type |= SocketMessageFlags.Error;\r\n }\r\n\r\n if (data.exception) {\r\n type |= SocketMessageFlags.Exception;\r\n }\r\n\r\n if (data.completed === 'True') {\r\n type |= SocketMessageFlags.Completed;\r\n }\r\n\r\n /* tslint:enable:no-bitwise */\r\n\r\n this.clientHandler({ type: type, message: data });\r\n }\r\n\r\n private processMessageData(message: NotificationMessage): void {\r\n const type: SocketMessageFlags = SocketMessageFlags.Data;\r\n this.clientHandler({ type, message });\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/// <reference types="jquery" />
|
|
1
|
+
import { HttpError } from '@microsoft/signalr';
|
|
3
2
|
/**
|
|
4
3
|
* Socket message flags. These can be combined.
|
|
5
4
|
*/
|
|
@@ -17,7 +16,7 @@ export declare enum SocketMessageFlags {
|
|
|
17
16
|
*/
|
|
18
17
|
export interface SocketMessage<T> {
|
|
19
18
|
type: SocketMessageFlags;
|
|
20
|
-
connectionError?:
|
|
19
|
+
connectionError?: HttpError;
|
|
21
20
|
message: T;
|
|
22
21
|
}
|
|
23
22
|
/**
|
|
@@ -26,9 +25,7 @@ export interface SocketMessage<T> {
|
|
|
26
25
|
export declare abstract class SocketSignalR<T> {
|
|
27
26
|
private gatewayUrl;
|
|
28
27
|
private connectionUrl;
|
|
29
|
-
private proxyName;
|
|
30
28
|
private connection;
|
|
31
|
-
private proxy;
|
|
32
29
|
private started;
|
|
33
30
|
private lastError;
|
|
34
31
|
private processHandler;
|
|
@@ -39,14 +36,13 @@ export declare abstract class SocketSignalR<T> {
|
|
|
39
36
|
/**
|
|
40
37
|
* Instantiates a new instance of the SocketSignalR class.
|
|
41
38
|
*/
|
|
42
|
-
constructor(gatewayUrl: string, connectionUrl: string
|
|
39
|
+
constructor(gatewayUrl: string, connectionUrl: string);
|
|
43
40
|
/**
|
|
44
41
|
* Subscribe to the proxy with method name and handler.
|
|
45
42
|
*
|
|
46
43
|
* @param name the name of subscription for a method.
|
|
47
|
-
* @return SignalR.Hub.Proxy the proxy.
|
|
48
44
|
*/
|
|
49
|
-
subscribe(name: string):
|
|
45
|
+
subscribe(name: string): void;
|
|
50
46
|
/**
|
|
51
47
|
* Unsubscribe to the subscribed method call.
|
|
52
48
|
*
|
|
@@ -56,11 +52,11 @@ export declare abstract class SocketSignalR<T> {
|
|
|
56
52
|
/**
|
|
57
53
|
* Start request connection.
|
|
58
54
|
*/
|
|
59
|
-
start():
|
|
55
|
+
start(): Promise<any>;
|
|
60
56
|
/**
|
|
61
57
|
* Stop request connection.
|
|
62
58
|
*/
|
|
63
|
-
stop():
|
|
59
|
+
stop(): void;
|
|
64
60
|
/**
|
|
65
61
|
* Invoke a method with parameters.
|
|
66
62
|
*
|
|
@@ -68,7 +64,7 @@ export declare abstract class SocketSignalR<T> {
|
|
|
68
64
|
* @param args the parameters to pass.
|
|
69
65
|
* @return Promise the promise object.
|
|
70
66
|
*/
|
|
71
|
-
invoke(name: string, ...args: any[]):
|
|
67
|
+
invoke(name: string, ...args: any[]): Promise<T>;
|
|
72
68
|
/**
|
|
73
69
|
* The client handler.
|
|
74
70
|
*/
|
|
@@ -80,9 +76,7 @@ export declare abstract class SocketSignalR<T> {
|
|
|
80
76
|
*/
|
|
81
77
|
protected abstract processMessage(message: string): void;
|
|
82
78
|
/**
|
|
83
|
-
* Initiate the connection to gateway
|
|
84
|
-
*
|
|
85
|
-
* @param proxyName the proxy name.
|
|
79
|
+
* Initiate the connection to gateway.
|
|
86
80
|
*/
|
|
87
81
|
private init;
|
|
88
82
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';
|
|
2
2
|
/**
|
|
3
3
|
* Socket message flags. These can be combined.
|
|
4
4
|
*/
|
|
@@ -19,10 +19,9 @@ export class SocketSignalR {
|
|
|
19
19
|
/**
|
|
20
20
|
* Instantiates a new instance of the SocketSignalR class.
|
|
21
21
|
*/
|
|
22
|
-
constructor(gatewayUrl, connectionUrl
|
|
22
|
+
constructor(gatewayUrl, connectionUrl) {
|
|
23
23
|
this.gatewayUrl = gatewayUrl;
|
|
24
24
|
this.connectionUrl = connectionUrl;
|
|
25
|
-
this.proxyName = proxyName;
|
|
26
25
|
this.started = false;
|
|
27
26
|
this.processHandler = (message) => this.processMessage(message);
|
|
28
27
|
gatewayUrl = gatewayUrl ? gatewayUrl : '';
|
|
@@ -37,15 +36,14 @@ export class SocketSignalR {
|
|
|
37
36
|
* Subscribe to the proxy with method name and handler.
|
|
38
37
|
*
|
|
39
38
|
* @param name the name of subscription for a method.
|
|
40
|
-
* @return SignalR.Hub.Proxy the proxy.
|
|
41
39
|
*/
|
|
42
40
|
subscribe(name) {
|
|
43
|
-
this.init(
|
|
41
|
+
this.init();
|
|
44
42
|
if (this.lastError) {
|
|
45
43
|
// send last error;
|
|
46
44
|
this.clientHandler({ type: SocketMessageFlags.Error, connectionError: this.lastError, message: null });
|
|
47
45
|
}
|
|
48
|
-
|
|
46
|
+
this.connection.on(name, this.processHandler);
|
|
49
47
|
}
|
|
50
48
|
/**
|
|
51
49
|
* Unsubscribe to the subscribed method call.
|
|
@@ -53,7 +51,7 @@ export class SocketSignalR {
|
|
|
53
51
|
* @param name the name of subscription for a method.
|
|
54
52
|
*/
|
|
55
53
|
unsubscribe(name) {
|
|
56
|
-
this.
|
|
54
|
+
this.connection.off(name, this.processHandler);
|
|
57
55
|
}
|
|
58
56
|
/**
|
|
59
57
|
* Start request connection.
|
|
@@ -66,7 +64,7 @@ export class SocketSignalR {
|
|
|
66
64
|
*/
|
|
67
65
|
stop() {
|
|
68
66
|
this.started = false;
|
|
69
|
-
|
|
67
|
+
this.connection.stop();
|
|
70
68
|
}
|
|
71
69
|
/**
|
|
72
70
|
* Invoke a method with parameters.
|
|
@@ -79,21 +77,22 @@ export class SocketSignalR {
|
|
|
79
77
|
if (!this.started) {
|
|
80
78
|
throw new Error('request socket has not been started.');
|
|
81
79
|
}
|
|
82
|
-
if (this.connection.state ===
|
|
83
|
-
return this.start().then(() => this.
|
|
80
|
+
if (this.connection.state === HubConnectionState.Disconnected) {
|
|
81
|
+
return this.start().then(() => this.connection.invoke(name, ...args));
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
return this.connection.invoke(name, ...args);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
this.errorMessage(error);
|
|
88
|
+
return Promise.reject(error);
|
|
84
89
|
}
|
|
85
|
-
return this.proxy.invoke(name, ...args);
|
|
86
90
|
}
|
|
87
91
|
/**
|
|
88
|
-
* Initiate the connection to gateway
|
|
89
|
-
*
|
|
90
|
-
* @param proxyName the proxy name.
|
|
92
|
+
* Initiate the connection to gateway.
|
|
91
93
|
*/
|
|
92
|
-
init(
|
|
93
|
-
this.connection =
|
|
94
|
-
this.connection.error((error) => this.errorMessage(error));
|
|
95
|
-
this.proxy = this.connection.createHubProxy(proxyName);
|
|
96
|
-
this.proxy.connection.error((error) => this.errorMessage(error));
|
|
94
|
+
init() {
|
|
95
|
+
this.connection = new HubConnectionBuilder().withUrl(this.url).build();
|
|
97
96
|
}
|
|
98
97
|
/**
|
|
99
98
|
* Error message from signalr connection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/notification/socket-signalr.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/notification/socket-signalr.ts"],"names":[],"mappings":"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","file":"socket-signalr.js","sourcesContent":["import { HttpError, HubConnection, HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';\r\n\r\n/**\r\n * Socket message flags. These can be combined.\r\n */\r\nexport enum SocketMessageFlags {\r\n None = 0,\r\n Data = 1,\r\n Progress = 2,\r\n Completed = 4,\r\n Error = 8,\r\n ConnectionError = 16,\r\n Exception = 32\r\n}\r\n\r\n/**\r\n * Socket message.\r\n */\r\nexport interface SocketMessage<T> {\r\n type: SocketMessageFlags;\r\n connectionError?: HttpError;\r\n message: T;\r\n}\r\n\r\n/**\r\n * SignalR based socket class.\r\n */\r\nexport abstract class SocketSignalR<T> {\r\n private connection: HubConnection;\r\n private started = false;\r\n private lastError: HttpError;\r\n private processHandler = (message: string) => this.processMessage(message);\r\n\r\n /**\r\n * Gets signalR connection URL.\r\n */\r\n private get url(): string {\r\n return `${this.gatewayUrl}${this.connectionUrl}`;\r\n }\r\n\r\n /**\r\n * Instantiates a new instance of the SocketSignalR class.\r\n */\r\n constructor(private gatewayUrl: string, private connectionUrl: string) {\r\n gatewayUrl = gatewayUrl ? gatewayUrl : '';\r\n }\r\n\r\n /**\r\n * Subscribe to the proxy with method name and handler.\r\n *\r\n * @param name the name of subscription for a method.\r\n */\r\n public subscribe(name: string): void {\r\n this.init();\r\n if (this.lastError) {\r\n // send last error;\r\n this.clientHandler({ type: SocketMessageFlags.Error, connectionError: this.lastError, message: null });\r\n }\r\n\r\n this.connection.on(name, this.processHandler);\r\n }\r\n\r\n /**\r\n * Unsubscribe to the subscribed method call.\r\n *\r\n * @param name the name of subscription for a method.\r\n */\r\n public unsubscribe(name: string): void {\r\n this.connection.off(name, this.processHandler);\r\n }\r\n\r\n /**\r\n * Start request connection.\r\n */\r\n public start(): Promise<any> {\r\n return this.connection.start().then(() => this.started = true);\r\n }\r\n\r\n /**\r\n * Stop request connection.\r\n */\r\n public stop(): void {\r\n this.started = false;\r\n this.connection.stop();\r\n }\r\n\r\n /**\r\n * Invoke a method with parameters.\r\n *\r\n * @param name the method name to execute.\r\n * @param args the parameters to pass.\r\n * @return Promise the promise object.\r\n */\r\n public invoke(name: string, ...args: any[]): Promise<T> {\r\n if (!this.started) {\r\n throw new Error('request socket has not been started.');\r\n }\r\n\r\n if (this.connection.state === HubConnectionState.Disconnected) {\r\n return this.start().then(() => this.connection.invoke<T>(name, ...args));\r\n }\r\n\r\n try {\r\n return this.connection.invoke<T>(name, ...args);\r\n } catch (error) {\r\n this.errorMessage(error);\r\n return Promise.reject(error);\r\n }\r\n }\r\n\r\n /**\r\n * The client handler.\r\n */\r\n protected abstract clientHandler(messages: SocketMessage<T>): void;\r\n\r\n /**\r\n * Process the message.\r\n *\r\n * @param messages the messages.\r\n */\r\n protected abstract processMessage(message: string): void;\r\n\r\n /**\r\n * Initiate the connection to gateway.\r\n */\r\n private init(): void {\r\n this.connection = new HubConnectionBuilder().withUrl(this.url).build();\r\n }\r\n\r\n /**\r\n * Error message from signalr connection.\r\n *\r\n * @param error the error produced on the connection.\r\n */\r\n private errorMessage(error: HttpError): void {\r\n if (this.clientHandler) {\r\n this.clientHandler({ type: SocketMessageFlags.ConnectionError, connectionError: error, message: null });\r\n } else {\r\n this.lastError = error;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -14,6 +14,8 @@ export declare class WorkItemManager {
|
|
|
14
14
|
private nodeConnection;
|
|
15
15
|
notificationConnection: NotificationConnection;
|
|
16
16
|
private static apiWorkItems24hours;
|
|
17
|
+
private static apiNotificationMessageStored;
|
|
18
|
+
private static apiNotificationMessageSubscriptionId;
|
|
17
19
|
active: boolean;
|
|
18
20
|
private startSubscription;
|
|
19
21
|
private powerShellNotification;
|
|
@@ -23,6 +25,7 @@ export declare class WorkItemManager {
|
|
|
23
25
|
private sequenceCounter;
|
|
24
26
|
private sequencePackets;
|
|
25
27
|
private rpcWorkItemSubjectServer;
|
|
28
|
+
private rootSubscriptionId;
|
|
26
29
|
/**
|
|
27
30
|
* Initializes a new instance of the WorkItemManager class.
|
|
28
31
|
*
|
|
@@ -54,4 +57,5 @@ export declare class WorkItemManager {
|
|
|
54
57
|
* @return Observable the WorkItemResult observable.
|
|
55
58
|
*/
|
|
56
59
|
queryWorkItem(request: RpcWorkItem): Observable<WorkItemResult>;
|
|
60
|
+
private getErrorLevel;
|
|
57
61
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { from, of, throwError } from 'rxjs';
|
|
1
|
+
import { forkJoin, from, of, throwError } from 'rxjs';
|
|
2
2
|
import { catchError, switchMap } from 'rxjs/operators';
|
|
3
3
|
import { Net } from '../data/net';
|
|
4
4
|
import { PowerShell } from '../data/powershell';
|
|
@@ -44,48 +44,71 @@ export class WorkItemManager {
|
|
|
44
44
|
this.startSubscription = this.gatewayConnection.get(WorkItemManager.apiWorkItems24hours)
|
|
45
45
|
.pipe(catchError((error, obj) => {
|
|
46
46
|
const message = MsftSme.getStrings().MsftSmeShell.Core.Error.NotificationNoWorkItemFound.message;
|
|
47
|
-
Logging.
|
|
48
|
-
source: 'Notification',
|
|
49
|
-
level: LogLevel.Error,
|
|
50
|
-
message: message.format(Net.getErrorMessage(error))
|
|
51
|
-
});
|
|
47
|
+
Logging.logError('Notification', message.format(Net.getErrorMessage(error)));
|
|
52
48
|
return of({ response: { value: null } });
|
|
53
49
|
}), switchMap(response => {
|
|
54
50
|
if (response.value) {
|
|
55
|
-
response.value.forEach(element =>
|
|
56
|
-
this.notificationManager.addFromRecover(element);
|
|
57
|
-
});
|
|
51
|
+
response.value.forEach(element => this.notificationManager.addFromRecover(element));
|
|
58
52
|
}
|
|
59
53
|
// start websocket status query.
|
|
60
54
|
this.powerShellNotification = new PowerShellNotification(this.gatewayConnection.gatewayUrl);
|
|
61
|
-
return from(
|
|
62
|
-
// converting jQueryPromise to native Promise.
|
|
63
|
-
new Promise((resolve, reject) => this.powerShellNotification.initialize().then(resolve, reject)));
|
|
55
|
+
return from(this.powerShellNotification.initialize());
|
|
64
56
|
}))
|
|
65
57
|
.subscribe(() => {
|
|
66
58
|
// notification from the gateway...
|
|
67
59
|
this.notificationSubscription = this.powerShellNotification.subject
|
|
68
60
|
.subscribe(item => {
|
|
69
|
-
|
|
70
|
-
|
|
61
|
+
const message = item.message;
|
|
62
|
+
if (message && message.sessionId) {
|
|
63
|
+
// PowerShell Work Item message.
|
|
64
|
+
const workItem = message;
|
|
65
|
+
const psSessionId = workItem.sessionId;
|
|
71
66
|
// Pass in psSessionId so telemetry can search up the PSCommand for this
|
|
72
67
|
if (PowerShellNotification.hasError(item)) {
|
|
73
|
-
SmeWebTelemetry.tracePowershellEvent(null, TelemetryEventStates.Error, { response:
|
|
68
|
+
SmeWebTelemetry.tracePowershellEvent(null, TelemetryEventStates.Error, { response: workItem, id: psSessionId });
|
|
74
69
|
}
|
|
75
70
|
else if (PowerShellNotification.hasCompleted(item)) {
|
|
76
71
|
SmeWebTelemetry.removePowershellId(psSessionId);
|
|
77
72
|
}
|
|
78
73
|
if (!this.notificationManager.updateFromMessage(psSessionId, item)) {
|
|
79
|
-
const
|
|
80
|
-
.MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;
|
|
74
|
+
const unexpectedMessage = MsftSme.getStrings().MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;
|
|
81
75
|
Logging.log({
|
|
82
|
-
source: 'Notification',
|
|
83
|
-
level: LogLevel.Warning,
|
|
84
|
-
message: message.format(psSessionId)
|
|
76
|
+
source: 'Notification', level: LogLevel.Warning, message: unexpectedMessage.format(psSessionId),
|
|
85
77
|
});
|
|
86
78
|
}
|
|
87
79
|
}
|
|
80
|
+
else if (message && message.id) {
|
|
81
|
+
// PowerShell Work Item message.
|
|
82
|
+
const notification = message;
|
|
83
|
+
const state = this.getErrorLevel(notification);
|
|
84
|
+
// Pass in psSessionId so telemetry can search up the PSCommand for this
|
|
85
|
+
if (state === NotificationState.Error) {
|
|
86
|
+
SmeWebTelemetry.tracePowershellEvent(null, TelemetryEventStates.Error, { response: message, id: message.id });
|
|
87
|
+
}
|
|
88
|
+
else if (state === NotificationState.Success) {
|
|
89
|
+
SmeWebTelemetry.removePowershellId(message.id);
|
|
90
|
+
}
|
|
91
|
+
if (this.notificationManager.addForNotificationMessage(state, notification)) {
|
|
92
|
+
this.powerShellNotification.subscribeSession(notification.id);
|
|
93
|
+
}
|
|
94
|
+
if (!this.notificationManager.updateFromNotificationMessage(state, message)) {
|
|
95
|
+
const unexpectedMessage = MsftSme.getStrings().MsftSmeShell.Core.Error.NotificationUnexpectedReceived.message;
|
|
96
|
+
Logging.logWarning('Notification', unexpectedMessage.format(message.id));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
88
99
|
});
|
|
100
|
+
this.notificationSubscription.add(forkJoin([
|
|
101
|
+
this.gatewayConnection.get(WorkItemManager.apiNotificationMessageSubscriptionId),
|
|
102
|
+
this.gatewayConnection.get(WorkItemManager.apiNotificationMessageStored),
|
|
103
|
+
]).subscribe(([idData, storedData]) => {
|
|
104
|
+
this.rootSubscriptionId = idData.id;
|
|
105
|
+
this.powerShellNotification.subscribeSession(this.rootSubscriptionId);
|
|
106
|
+
storedData.value.forEach(element => {
|
|
107
|
+
const state = this.getErrorLevel(element);
|
|
108
|
+
this.notificationManager.addForNotificationMessage(state, element);
|
|
109
|
+
this.powerShellNotification.subscribeSession(element.id);
|
|
110
|
+
});
|
|
111
|
+
}));
|
|
89
112
|
// workItem request from rpc...
|
|
90
113
|
this.rpcWorkItemSubscription = this.rpcWorkItemSubjectServer.subject
|
|
91
114
|
.subscribe(item => {
|
|
@@ -237,7 +260,40 @@ export class WorkItemManager {
|
|
|
237
260
|
const message = MsftSme.getStrings().MsftSmeShell.Core.Error.NotificationNoIdFound.message;
|
|
238
261
|
return throwError(message.format(request.id));
|
|
239
262
|
}
|
|
263
|
+
getErrorLevel(notification) {
|
|
264
|
+
switch (notification.errorLevel) {
|
|
265
|
+
// Notification is unknown.
|
|
266
|
+
case 0:
|
|
267
|
+
case 'None':
|
|
268
|
+
return NotificationState.Informational;
|
|
269
|
+
// Notification is in progress. (non-terminated message.)
|
|
270
|
+
case 1:
|
|
271
|
+
case 'InProgress':
|
|
272
|
+
return NotificationState.InProgress;
|
|
273
|
+
// Notification is success. (terminated message.)
|
|
274
|
+
case 2:
|
|
275
|
+
case 'Success':
|
|
276
|
+
return NotificationState.Success;
|
|
277
|
+
// Notification is informational. (terminated message.)
|
|
278
|
+
case 3:
|
|
279
|
+
case 'Informational':
|
|
280
|
+
return NotificationState.Informational;
|
|
281
|
+
// Notification is warning. (terminated message.)
|
|
282
|
+
case 4:
|
|
283
|
+
case 'Warning':
|
|
284
|
+
return NotificationState.Warning;
|
|
285
|
+
// Notification is error. (terminated message.)
|
|
286
|
+
case 5:
|
|
287
|
+
case 'Error':
|
|
288
|
+
return NotificationState.Error;
|
|
289
|
+
// Notification is unknown.
|
|
290
|
+
default:
|
|
291
|
+
throw new Error('Couldn\'t get expected error level from a message notification.');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
240
294
|
}
|
|
241
295
|
WorkItemManager.apiWorkItems24hours = '/workitems?lastMinutes=1440';
|
|
296
|
+
WorkItemManager.apiNotificationMessageStored = '/NotificationMessage/stored';
|
|
297
|
+
WorkItemManager.apiNotificationMessageSubscriptionId = '/NotificationMessage/id';
|
|
242
298
|
|
|
243
299
|
//# sourceMappingURL=work-item-manager.js.map
|