| 
					
				 | 
			
			
				@@ -36,9 +36,19 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <transition> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <div class="card"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <h3>SUBSCRIPTION</h3> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div v-if="subscription.subId">SubscriptionId: {{ subscription.subId }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <div class="buttons"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <button :disabled="session.ucpId == null" >Property Change</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <button>Unsubscribe</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <button  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :disabled="session.ucpId == null || subscription.subId != null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @click="startSubscribePropertyChange" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >Property Change</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <!-- <button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :disabled="session.ucpId == null || subscription.subId == null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @click="endSubscribePropertyChange" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >Unsubscribe</button> --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div v-for="message in subscription.messages" :key="message.id">{{ message.text }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </transition> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -46,17 +56,34 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <transition> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <div class="card"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <h3>FORM</h3> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div v-if="form.type=='productrequisition'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <h3>Product Requisition</h3> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <label >Doc Date<input v-model="form.docDt"></label> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div v-if="form.type=='userprofile'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <h3>User Profile</h3> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <label >User Name<input v-model="form.userName"></label> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <div class="buttons"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <button>New Product Requisition</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <button>New User Profile</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <button>Cancel Changes</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :disabled="session.ucpId == null || form.type != null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @click="startRequisition" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >New Product Requisition</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :disabled="session.ucpId == null || form.type != null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @click="startUserProfile" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >New User Profile</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :disabled="form.type == null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @click="cancelForm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        >Cancel Changes</button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </transition> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <button @click="startConnection">connection</button><input type="text" v-model="url"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <!-- Websocket connection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       - button disconnect (when connection is up) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     --> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -87,14 +114,14 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import Trottle from 'lodash/throttle' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   getLoginMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // getLogoutMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // getMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   getSubPropertyChangeMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getNewUserProfileMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  getNewUserProfile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   getLogoutMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   getNewPurchaseRequisition, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // getSetPurchaseRequisitionDocDt, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // getCancelPurchaseRequisition 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  getCancelPurchaseRequisition, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  getCancelUserProfile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } from '../assets/js/__message-util'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { TestSocketIoClient } from "../assets/js/__transport.socketio" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { Component, Prop, Vue } from 'vue-property-decorator' 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -106,15 +133,21 @@ type Session = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type Form = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   type: string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  docDt?: string, // "2021-01-10Z" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  docDt: string, // "2021-01-10Z" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  userName: string, //abcxyz 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cancelRequest: any, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type WsConnection = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   socketId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-type Messages = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type Message = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   id: symbol, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   text: string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+type Subscription = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  subId: string, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  messages: Message[], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Component 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 export default class UiClient extends Vue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   @Prop() private msg!: string; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,18 +155,37 @@ export default class UiClient extends Vue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   client: TestSocketIoClient = new TestSocketIoClient(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connection: WsConnection = { socketId: null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   session: Session = { ucpId: null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  form: Form = { type: null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  form: Form = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    type: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    docDt: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    userName: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cancelRequest: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   url = 'http://swopt.com:3011'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  messages: Messages[] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  messages: Message[] = []; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   loading: boolean = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  subscription: Subscription = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    subId: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    messages: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   dosomething = Trottle(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const zz = 'ssss'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       console.log('done ' + zz) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   },1000, { trailing: false }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  startLoading() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.loading = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  endLoading() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.loading = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async getResponses(request){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return await this.client.getAllResponsesFromRequest(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   addMessage(text:string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.messages.unshift({ id: Symbol(),text }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // this.messages.unshift({ id: Symbol(),text }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.messages.push({ id: Symbol(), text }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   async stopConnection() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,7 +196,7 @@ export default class UiClient extends Vue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   async startConnection() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this.addMessage('connecting websocket..') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.loading = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.startLoading() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.connection.socketId = await this.client.connect(this.url, { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -157,28 +209,137 @@ export default class UiClient extends Vue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this.addMessage('websocket connection fail ' + error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.loading = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.endLoading() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  async startSession(): Promise<void> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  getResponse = Trottle(async (request, operation: string, getReturnData: (response) => any ) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.startLoading() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.addMessage(operation + ' ...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let returnData = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const results = await this.getResponses(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // look for error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const responseException = results.find( (r: any) => r?.header?.messageType == 'ResponseException' ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if( responseException != null ){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw Error(responseException?.data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // look for response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const response = results.find( (r: any) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        const messageType = r?.header?.messageType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ['FisResponse','Response'].indexOf(messageType) > -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(response == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        throw Error('fail to get success response') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // try extract data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      returnData = getReturnData(response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.addMessage(operation + ' success.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.addMessage(operation + ' fail :' + error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.endLoading() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log('results', returnData) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return returnData; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async startSession() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.session.ucpId = await this.getResponse( getLoginMessage(10000), 'signin', (response) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.log('response2', response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const ucpId = response?.data?.ucpId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if( ucpId == null) throw Error('missing ucpId') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      console.log('ucpId', ucpId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return ucpId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async endSession() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.session.ucpId = await this.getResponse( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      getLogoutMessage(this.session.ucpId), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      'signout', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      _ => null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async startRequisition() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.type = await this.getResponse( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      getNewPurchaseRequisition(this.session.ucpId), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      'new product requisition', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      _ => 'productrequisition', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.docDt = "2021-01-10Z" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.cancelRequest = getCancelPurchaseRequisition(this.session.ucpId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async startUserProfile() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.type = await this.getResponse( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      getNewUserProfile(this.session.ucpId), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      'new user profile', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      _ => 'userprofile', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.userName = "abcxyz" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.cancelRequest = getCancelUserProfile(this.session.ucpId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async cancelForm() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.form.type = await this.getResponse( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.form.cancelRequest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      'cancel changes', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      _ => null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  async startSubscribePropertyChange(): Promise<void> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this.loading = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this.addMessage('signing in ...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this.addMessage('subscribing to property change ...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let listening = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const request = getSubPropertyChangeMessage(this.session.ucpId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const subject = this.client.getStreamOfResponsesFromRequest(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const results = await this.client.getAllResponsesFromRequest(getLoginMessage()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const response = results.find( (r: any) => r?.header?.messageType == 'Response' ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      const ucpId = response?.data?.ucpId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if( ucpId == null) throw Error('fail to get success response') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.session.ucpId = ucpId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.addMessage('login success.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.subscription.subId = await new Promise((resolved, reject) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        subject.subscribe({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          next: (data) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // when listening display all results  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if( listening ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              let text = data?.header?.messageName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              this.subscription.messages.push({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                id: Symbol(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              })   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // detect exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if ( data?.header?.messageType == 'ResponseException') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                reject(data?.data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              // detect success subscription 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              const subId = data?.data?.subscriptionId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              if ( subId ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                listening = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                resolved(subId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            console.info(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          complete: () => this.subscription.subId = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.addMessage('subscribe to property change success.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } catch (error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this.addMessage('login fail :' + error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this.addMessage('subscribe to property change fail : ' + error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this.loading = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  endSession = Trottle(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  endSubscribePropertyChange = Trottle(async () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this.loading = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this.addMessage('signing out...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |