//.. processing document on the server side import { Injectable } from '@angular/core'; //import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Http, Response, Headers, RequestOptions } from '@angular/http'; import { Observable } from 'rxjs'; import { NotificationsService } from 'angular2-notifications'; import { UtilityService } from '../../shared/services/utilityService/utility.service'; //const httpOptionsT = { // headers: new HttpHeaders({ 'Content-Type': 'text/plain' }) //}; @Injectable( // { providedIn: 'root' } ) export class ProcOnSrvSideSvc { clName: string = "ProcOnSrvSideSvc"; public theUrl: string = "/api/proc_cont"; public resUrlPfx: string = "/api/get_result"; public parmsUrlPfx: string = "/api/get_params"; public taskId: string = ''; public stringBuf: string; public responBuf: string; public procResult: string; public parmsBuf: string; public responObj: any; // private respObs: Observable; private respObs: Observable; private respObsObj: Observable; public ppartLen: number = 102400; //.. 102912 is too large payload // public ppartLen: number = 10240; public ppartCnt: number = 0; public p_offset: number = 0; public interval: any; cycleCnt: number; cycleMAX: number = 40; editorHolder: any; templSyncer: any; fHeaders: Headers; rOptions: RequestOptions; noptions = { timeOut: 4000, showProgressBar: true, pauseOnHover: true, clickToClose: true, maxLength: 250 }; prevTstampInt: number = 0; currTstampInt: number = 0; notifDelayMsec: number = 1200; constructor( // private http: HttpClient, private http: Http, private utilSvc: UtilityService, private nService: NotificationsService ) { if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": new: start"); this.fHeaders= new Headers({'Content-Type': 'text/plain'}); this.rOptions= new RequestOptions({'responseType':0}); } sendToSrv( content: string, editorHolder: any, templSyncer: any ) { var methName= "sendToSrv"; this.stringBuf= content; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": start: content length="+ this.stringBuf.length ); this.editorHolder= editorHolder; this.templSyncer= templSyncer; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": emptying editor..."); this.editorHolder.editor.session.setValue("temp empty"); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": theUrl:["+this.theUrl+"]"); this.nService.info( "Start processing", "sending: content length="+this.stringBuf.length, this.noptions ); this.taskId= ''; let contLen= this.stringBuf.length; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": content length="+contLen+ " ppartLen="+this.ppartLen ); this.ppartCnt= 1+ Math.floor(contLen / this.ppartLen); if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": ppartCnt="+ this.ppartCnt ); if( this.ppartCnt > 1 ) { if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": will send multiple parts..."); this.nService.info( "Start processing", "will send multiple parts..."); this.prevTstampInt= Date.now(); this.p_offset= 0; let ppart= this.stringBuf.substr( this.p_offset, this.ppartLen ); if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": First part:["+ppart+"]"); //.. first this.sendPart( this.theUrl, ppart, 1 ); } else { //.. ppartCnt == 1 if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": will send all-in-1"); this.nService.info( "Start processing", "will send all-in-1 part", this.noptions); this.prevTstampInt= Date.now(); //.. single var sUrl= this.theUrl+"?part=1of1"; this.sendPart( sUrl, this.stringBuf, 1 ); }; } sendPart( postUrl: string, contPart: string, partNum: number ) { var methName= "sendPart"; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": start: Url:["+postUrl+"]"); this.currTstampInt= Date.now(); let ntDiff= this.currTstampInt - this.prevTstampInt; if( this.utilSvc.getTracelvl() > 1 ) console.log( this.clName+": "+methName+ ": prevTstampInt="+this.prevTstampInt+ " currTstampInt="+this.currTstampInt+" the diff="+ntDiff ); if( ntDiff > this.notifDelayMsec ) { if( this.utilSvc.getTracelvl() > 1 ) console.log(this.clName+": "+methName+": notif.delay's long enough."); this.prevTstampInt= this.currTstampInt; this.nService.info( "Transferring file", " part Number="+partNum, this.noptions ); }; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": part length="+ contPart.length ); this.respObs= this.http.post( postUrl, contPart, this.rOptions ); // this.http.post( postUrl, contPart, httpOptionsT ); // this.respObs.subscribe( (respo: string) => { this.respObs.subscribe( (respo: Response) => { if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": got response:["+respo+"]"); if( this.utilSvc.getTracelvl() > 1 ) console.log( this.clName+": "+methName+": json:["+ JSON.stringify(respo)+"]"); this.responBuf= respo.text(); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": responBuf:["+this.responBuf+"]"); if( this.taskId.length < 1 ) { if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+ ": taskId is empty -get it from response"); let respObj= JSON.parse(this.responBuf); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": respObj.taskId:["+ respObj.taskId+"]"); if( respObj.taskId == null || respObj.taskId.length == 0 ) { let errMsg= this.clName+": "+methName+ ": Error: failed to get taskId from the server response !"; console.log( errMsg ); this.nService.error( "Transferring file", errMsg, this.noptions ); return; } else { //.. extracted respObj.taskId this.taskId= respObj.taskId; if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": obtained new taskId:["+ this.taskId+"]"); this.nService.info( "Transferring file", "current taskId:["+this.taskId+"]", this.noptions); }; }; let tpercent= (100.0*partNum/this.ppartCnt).toFixed(); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+ ": part#="+partNum+" transfer percent="+tpercent ); this.currTstampInt= Date.now(); let ntDiff= this.currTstampInt - this.prevTstampInt; if( this.utilSvc.getTracelvl() > 1 ) console.log( this.clName+": "+methName+ ": prevTstampInt="+this.prevTstampInt+ " currTstampInt="+this.currTstampInt+" the diff="+ntDiff ); if( ntDiff > this.notifDelayMsec ) { if( this.utilSvc.getTracelvl() > 1 ) console.log(this.clName+": "+methName+": notif.delay long enough."); this.prevTstampInt= this.currTstampInt; this.nService.info( "Transferring file", " progress: "+tpercent+" %", this.noptions ); //" part Number="+partNum+" vs part Count="+this.ppartCnt, this.noptions ); }; if( partNum < this.ppartCnt ) { // this.nService.info( methName,"need to send more parts..."); let partN= partNum + 1; this.p_offset= this.p_offset + this.ppartLen; var ppart= ''; if( partN < this.ppartCnt ) { if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+ ": next part is not the last: partN="+partN ); ppart= this.stringBuf.substr( this.p_offset, this.ppartLen ); } else { if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+ ": next part is the last."); ppart= this.stringBuf.substr( this.p_offset ); }; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": next part:["+ppart+"]"); let nUrl= this.theUrl+"?taskId="+this.taskId+"&part="+partN+"of"+this.ppartCnt; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": next Url:["+nUrl+"]"); this.sendPart( nUrl, ppart, partN ); } else { //.. partNum == this.ppartCnt this.nService.info( "Transferring file", "all "+this.ppartCnt+ " parts are sent - check processing...", this.noptions); var progrUrl= "/api/get_progress?taskId="+this.taskId; if( this.utilSvc.getTracelvl() > 0 ) console.log(this.clName+": "+methName+": progrUrl:["+progrUrl+"]"); this.showProcProgr( progrUrl ); }; }, error => { console.log( this.clName+": "+methName+ ": got Error:["+JSON.stringify(error)+']'); this.responBuf= JSON.stringify(error); this.nService.error( "Transferring file", " Error:["+this.responBuf+"]", this.noptions); }); } showProcProgr( proUrl: string ) { var methName= "showProcProgr"; if( this.utilSvc.getTracelvl() > 0 ) console.log(methName+": start: proUrl:["+proUrl+"]"); this.cycleCnt= 0; this.interval = setInterval( () => { if( this.utilSvc.getTracelvl() > 1 ) console.log(methName+": call getProcProgr"); this.getProcProgr( proUrl ); }, 2500 ); } getProcProgr( proUrl: string ) { var methName= "getProcProgr"; if( this.utilSvc.getTracelvl() > 0 ) console.log( methName+": getProcProgr: start: proUrl:["+proUrl+"]"); this.cycleCnt++; if( this.utilSvc.getTracelvl() > 0 ) console.log( methName+": cycleCnt="+this.cycleCnt ); this.nService.info( "Processing", "Requesting server status...", this.noptions); // this.respObsObj= // this.http.get( proUrl ); this.respObs= this.http.get( proUrl ); // this.respObs.subscribe( (respo: string) => { //this.respObsObj.subscribe( (respo) => { this.respObs.subscribe( (respo: Response) => { if( this.utilSvc.getTracelvl() > 0 ) console.log( methName+": response:["+JSON.stringify(respo)+"]"); this.responBuf= respo.text(); if( this.utilSvc.getTracelvl() > 0 ) console.log( methName+": responBuf:["+this.responBuf+"]"); let respObj= JSON.parse(this.responBuf); // this.responObj= respo; //.. Object if( respObj.percentage != undefined && respObj.percentage != null ) { if( this.utilSvc.getTracelvl() > 0 ) console.log(methName+": got percentage:["+respObj.percentage+"]"); if( respObj.percentage >= 100.0 ) { if( this.utilSvc.getTracelvl() > 0 ) console.log(methName+": percentage == 100 !"); this.nService.info( "Processing completed", "The server finished: 100% !", this.noptions); clearInterval( this.interval ); if( this.utilSvc.getTracelvl() > 0 ) console.log(methName+": getting the processing result..."); this.getProcResult(); } }; if( this.utilSvc.getTracelvl() > 0 ) console.log(methName+": cycleCnt="+this.cycleCnt+ " vs MAX="+this.cycleMAX ); if( this.cycleCnt > this.cycleMAX ) { this.nService.error( "Processing", "Too many status requests - stop !",this.noptions ); clearInterval( this.interval ); } }, error => { console.log( this.clName+": "+methName+": got Error:["+ JSON.stringify(error)+']'); this.responObj= error; //.. as Object this.nService.error( "Processing"," Error:["+ JSON.stringify(error)+']', this.noptions ); clearInterval( this.interval ); }); } getProcResult() { var methName= "getProcResult"; let resUrl= this.resUrlPfx+"?taskId="+this.taskId; if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": start: resUrl:["+resUrl+"]"); this.respObs= this.http.get( resUrl, this.rOptions ); // this.http.get( resUrl, {responseType: 'text'} ); // this.respObs.subscribe( (respo: string) => { this.respObs.subscribe( (respo: Response) => { if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": got response:["+respo+"]"); if( this.utilSvc.getTracelvl() > 1 ) console.log( this.clName+": "+methName+": json:["+ JSON.stringify(respo)+"]"); this.responBuf= respo.text(); if( this.utilSvc.getTracelvl() > 1 ) console.log( this.clName+": "+methName+": responBuf:["+this.responBuf+"]"); if( this.utilSvc.getTracelvl() == 0 ) { let respoBg= this.responBuf.substr(0, 300); console.log(this.clName+": "+methName+": response Begin:["+respoBg+"...]"); }; this.procResult= this.responBuf; this.nService.info( "Processing completed", "the result length="+this.procResult.length, this.noptions ); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+ ": setting response to the editor..."); this.editorHolder.editor.session.setValue( this.procResult ); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": calling syncTemplate ..."); this.templSyncer.syncTemplate('1'); if( this.utilSvc.getTracelvl() > 0 ) console.log( this.clName+": "+methName+": finished."); }, error => { console.log( this.clName+": "+methName+": subscribe Error:["+ JSON.stringify(error)+']'); this.procResult= JSON.stringify(error); this.nService.error( "Getting Processing result", " Error:["+JSON.stringify(error)+']', this.noptions); }); } }