1818
1919function QiniuJsSDK ( ) {
2020
21+ var that = this ;
22+
2123 var qiniuUploadUrl ;
2224 if ( window . location . protocol === 'https:' ) {
2325 qiniuUploadUrl = 'https://up.qbox.me' ;
@@ -52,30 +54,45 @@ function QiniuJsSDK() {
5254 ERROR : 2 ,
5355 WARN : 3 ,
5456 INFO : 4 ,
55- Debug : 5 ,
57+ DEBUG : 5 ,
5658 TRACE : 6 ,
57- level : 0 ,
58- log : function ( ) {
59- logger . log . history = logger . log . history || [ ] ;
60- logger . log . history . push ( arguments ) ;
61- if ( window . console && window . console . log && logger . level >= logger . TRACE ) {
59+ level : 0
60+ } ;
61+
62+ function log ( type , args ) {
63+ var header = "[qiniu-js-sdk][" + type + "]" ;
64+ if ( that . detectIEVersion ( ) ) {
65+ // http://stackoverflow.com/questions/5538972/console-log-apply-not-working-in-ie9
66+ //var log = Function.prototype.bind.call(console.log, console);
67+ //log.apply(console, args);
68+ var msg = header ;
69+ for ( var i = 0 ; i < args . length ; i ++ ) {
70+ msg += that . stringifyJSON ( args [ i ] ) ;
71+ }
72+ console . log ( msg ) ;
73+ } else {
74+ args . unshift ( header ) ;
75+ console . log . apply ( console , args ) ;
76+ }
77+ }
78+
79+ function makeLogFunc ( code ) {
80+ var func = code . toLowerCase ( ) ;
81+ logger [ func ] = function ( ) {
82+ // logger[func].history = logger[func].history || [];
83+ // logger[func].history.push(arguments);
84+ if ( window . console && window . console . log && logger . level >= logger [ code ] ) {
6285 var args = Array . prototype . slice . call ( arguments ) ;
63- if ( that . detectIEVersion ( ) ) {
64- // http://stackoverflow.com/questions/5538972/console-log-apply-not-working-in-ie9
65- //var log = Function.prototype.bind.call(console.log, console);
66- //log.apply(console, args);
67- var msg = "[qiniu-js-sdk]" ;
68- for ( var i = 0 ; i < args . length ; i ++ ) {
69- msg += that . stringifyJSON ( args [ i ] ) ;
70- }
71- console . log ( msg ) ;
72- } else {
73- args . unshift ( "[qiniu-js-sdk]" ) ;
74- console . log . apply ( console , args ) ;
75- }
86+ log ( func , args ) ;
7687 }
88+ } ;
89+ }
90+
91+ for ( var property in logger ) {
92+ if ( logger . hasOwnProperty ( property ) && ( typeof logger [ property ] ) === "number" && ! logger . hasOwnProperty ( property . toLowerCase ( ) ) ) {
93+ makeLogFunc ( property ) ;
7794 }
78- } ;
95+ }
7996
8097
8198 /**
@@ -325,10 +342,47 @@ function QiniuJsSDK() {
325342 return eval ( '(' + text + ')' ) ;
326343 } ;
327344
328- this . stringifyJSON = function ( json ) {
345+ /**
346+ * parse javascript object to json string
347+ * @param {Object } object
348+ * @return {String } json string
349+ */
350+ this . stringifyJSON = function ( obj ) {
329351 // Attempt to parse using the native JSON parser first
330352 if ( window . JSON && window . JSON . stringify ) {
331- return window . JSON . stringify ( json ) ;
353+ return window . JSON . stringify ( obj ) ;
354+ }
355+ switch ( typeof ( obj ) ) {
356+ case 'string' :
357+ return '"' + obj . replace ( / ( [ " \\ ] ) / g, '\\$1' ) + '"' ;
358+ case 'array' :
359+ return '[' + obj . map ( that . stringifyJSON ) . join ( ',' ) + ']' ;
360+ case 'object' :
361+ if ( obj instanceof Array ) {
362+ var strArr = [ ] ;
363+ var len = obj . length ;
364+ for ( var i = 0 ; i < len ; i ++ ) {
365+ strArr . push ( that . stringifyJSON ( obj [ i ] ) ) ;
366+ }
367+ return '[' + strArr . join ( ',' ) + ']' ;
368+ } else if ( obj === null ) {
369+ return 'null' ;
370+ } else {
371+ var string = [ ] ;
372+ for ( var property in obj ) {
373+ if ( obj . hasOwnProperty ( property ) ) {
374+ string . push ( that . stringifyJSON ( property ) + ':' + that . stringifyJSON ( obj [ property ] ) ) ;
375+ }
376+ }
377+ return '{' + string . join ( ',' ) + '}' ;
378+ }
379+ break ;
380+ case 'number' :
381+ return obj ;
382+ case false :
383+ return obj ;
384+ case 'boolean' :
385+ return obj ;
332386 }
333387 } ;
334388
@@ -341,8 +395,6 @@ function QiniuJsSDK() {
341395 return text === null ? "" : text . replace ( / ^ \s + | \s + $ / g, '' ) ;
342396 } ;
343397
344- var that = this ;
345-
346398 /**
347399 * create a uploader by QiniuJsSDK
348400 * @param {object } options to create a new uploader
@@ -362,11 +414,11 @@ function QiniuJsSDK() {
362414 throw 'browse_button setting in options is required!' ;
363415 }
364416
365- logger . log ( "init uploader" ) ;
417+ logger . debug ( "init uploader start " ) ;
366418
367- logger . log ( "environment: " , mOxie . Env ) ;
419+ logger . debug ( "environment: " , mOxie . Env ) ;
368420
369- logger . log ( "userAgent: " , navigator . userAgent ) ;
421+ logger . debug ( "userAgent: " , navigator . userAgent ) ;
370422
371423 var option = { } ;
372424
@@ -424,10 +476,11 @@ function QiniuJsSDK() {
424476 // reset chunk_size to max_chunk_size(4m) when chunk_size > 4m
425477 }
426478 // if op.chunk_size set 0 will be cause to direct upload
427- logger . log ( "reset chunk size:" , op . chunk_size ) ;
428479 } ;
429480
430481 reset_chunk_size ( ) ;
482+ logger . debug ( "invoke reset_chunk_size()" ) ;
483+ logger . debug ( "op.chunk_size: " , op . chunk_size ) ;
431484
432485 // if op.uptoken has no value
433486 // get token from 'uptoken_url'
@@ -479,50 +532,54 @@ function QiniuJsSDK() {
479532 }
480533 } ) ;
481534
482- logger . log ( "option: " , option ) ;
535+ logger . debug ( "option: " , option ) ;
483536
484537 // create a new uploader with composed options
485538 var uploader = new plupload . Uploader ( option ) ;
486539
487- logger . log ( "create plupload.Uploader") ;
540+ logger . debug ( "new plupload.Uploader(option) ") ;
488541
489542 // bind getUpToken to 'Init' event
490543 uploader . bind ( 'Init' , function ( up , params ) {
491- logger . log ( "uploader Init") ;
544+ logger . debug ( " Init event activated ") ;
492545 getUpToken ( ) ;
493546 } ) ;
494547
495- logger . log ( "bind Init event" ) ;
496-
497- // init uploader
498- uploader . init ( ) ;
499-
500- logger . log ( "uploader init" ) ;
548+ logger . debug ( "bind Init event" ) ;
501549
502550 // bind 'FilesAdded' event
503551 // when file be added and auto_start has set value
504552 // uploader will auto start upload the file
505553 uploader . bind ( 'FilesAdded' , function ( up , files ) {
506- logger . log ( "uploader FilesAdded") ;
554+ logger . debug ( " FilesAdded event activated ") ;
507555 var auto_start = up . getOption && up . getOption ( 'auto_start' ) ;
508556 auto_start = auto_start || ( up . settings && up . settings . auto_start ) ;
557+ logger . debug ( "auto_start: " , auto_start ) ;
558+ logger . debug ( "files: " , files ) ;
509559 if ( auto_start ) {
510- plupload . each ( files , function ( i , file ) {
560+ setTimeout ( function ( ) {
511561 up . start ( ) ;
512- } ) ;
562+ logger . debug ( "invoke up.start()" ) ;
563+ } , 0 ) ;
564+ // up.start();
565+ // plupload.each(files, function(i, file) {
566+ // up.start();
567+ // logger.debug("invoke up.start()")
568+ // logger.debug("file: ", file);
569+ // });
513570 }
514571 up . refresh ( ) ; // Reposition Flash/Silverlight
515572 } ) ;
516573
517- logger . log ( "bind FilesAdded event" ) ;
574+ logger . debug ( "bind FilesAdded event" ) ;
518575
519576 // bind 'BeforeUpload' event
520577 // intercept the process of upload
521578 // - prepare uptoken
522579 // - according the chunk size to make differnt upload strategy
523580 // - resume upload with the last breakpoint of file
524581 uploader . bind ( 'BeforeUpload' , function ( up , file ) {
525- logger . log ( "uploader BeforeUpload") ;
582+ logger . debug ( " BeforeUpload event activated ") ;
526583 // add a key named speed for file object
527584 file . speed = file . speed || 0 ;
528585 ctx = '' ;
@@ -545,7 +602,7 @@ function QiniuJsSDK() {
545602 } ;
546603 }
547604
548- logger . log ( "directUpload multipart_params_obj: " , multipart_params_obj ) ;
605+ logger . debug ( "directUpload multipart_params_obj: " , multipart_params_obj ) ;
549606
550607 var x_vars = op . x_vars ;
551608 if ( x_vars !== undefined && typeof x_vars === 'object' ) {
@@ -581,10 +638,14 @@ function QiniuJsSDK() {
581638
582639 var chunk_size = up . getOption && up . getOption ( 'chunk_size' ) ;
583640 chunk_size = chunk_size || ( up . settings && up . settings . chunk_size ) ;
641+
642+ logger . debug ( "uploader.runtime: " , uploader . runtime ) ;
643+ logger . debug ( "chunk_size: " , chunk_size ) ;
644+
584645 // TODO: flash support chunk upload
585- if ( uploader . runtime === 'html5' && chunk_size ) {
646+ if ( ( uploader . runtime === 'html5' || uploader . runtime === 'flash' ) && chunk_size ) {
586647 if ( file . size < chunk_size || is_android_weixin_or_qq ( ) ) {
587- logger . log ( "directUpload because file.size < chunk_size || is_android_weixin_or_qq()" ) ;
648+ logger . debug ( "directUpload because file.size < chunk_size || is_android_weixin_or_qq()" ) ;
588649 // direct upload if file size is less then the chunk size
589650 directUpload ( up , file , that . key_handler ) ;
590651 } else {
@@ -652,18 +713,18 @@ function QiniuJsSDK() {
652713 } ) ;
653714 }
654715 } else {
655- logger . log ( "directUpload because uploader.runtime !== 'html5' || !chunk_size" ) ;
716+ logger . debug ( "directUpload because uploader.runtime !== 'html5' || !chunk_size" ) ;
656717 // direct upload if runtime is not html5
657718 directUpload ( up , file , that . key_handler ) ;
658719 }
659720 } ) ;
660721
661- logger . log ( "bind BeforeUpload event" ) ;
722+ logger . debug ( "bind BeforeUpload event" ) ;
662723
663724 // bind 'UploadProgress' event
664725 // calculate upload speed
665726 uploader . bind ( 'UploadProgress' , function ( up , file ) {
666- logger . log ( "uploader UploadProgress") ;
727+ logger . trace ( " UploadProgress event activated ") ;
667728 speedCalInfo . currentTime = new Date ( ) . getTime ( ) ;
668729 var timeUsed = speedCalInfo . currentTime - speedCalInfo . startTime ; // ms
669730 var fileUploaded = file . loaded || 0 ;
@@ -673,12 +734,12 @@ function QiniuJsSDK() {
673734 file . speed = ( fileUploaded / timeUsed * 1000 ) . toFixed ( 0 ) || 0 ; // unit: byte/s
674735 } ) ;
675736
676- logger . log ( "bind UploadProgress event" ) ;
737+ logger . debug ( "bind UploadProgress event" ) ;
677738
678739 // bind 'ChunkUploaded' event
679740 // store the chunk upload info and set next chunk upload url
680741 uploader . bind ( 'ChunkUploaded' , function ( up , file , info ) {
681- logger . log ( "uploader ChunkUploaded") ;
742+ logger . debug ( " ChunkUploaded event activated ") ;
682743 var res = that . parseJSON ( info . response ) ;
683744 // ctx should look like '[chunk01_ctx],[chunk02_ctx],[chunk03_ctx],...'
684745 ctx = ctx ? ctx + ',' + res . ctx : res . ctx ;
@@ -699,13 +760,14 @@ function QiniuJsSDK() {
699760 } ) ) ;
700761 } ) ;
701762
702- logger . log ( "bind ChunkUploaded event" ) ;
763+ logger . debug ( "bind ChunkUploaded event" ) ;
703764
704765 // bind 'Error' event
705766 // check the err.code and return the errTip
706767 uploader . bind ( 'Error' , ( function ( _Error_Handler ) {
707768 return function ( up , err ) {
708- logger . log ( "uploader Error" ) ;
769+ logger . error ( "Error event activated" ) ;
770+ logger . error ( "err: " , err ) ;
709771 var errTip = '' ;
710772 var file = err . file ;
711773 if ( file ) {
@@ -791,15 +853,15 @@ function QiniuJsSDK() {
791853 } ;
792854 } ) ( _Error_Handler ) ) ;
793855
794- logger . log ( "bind Error event" ) ;
856+ logger . debug ( "bind Error event" ) ;
795857
796858 // bind 'FileUploaded' event
797859 // intercept the complete of upload
798860 // - get downtoken from downtoken_url if bucket is private
799861 // - invoke mkfile api to compose chunks if upload strategy is chunk upload
800862 uploader . bind ( 'FileUploaded' , ( function ( _FileUploaded_Handler ) {
801863 return function ( up , file , info ) {
802- logger . log ( "uploader Error ") ;
864+ logger . debug ( "FileUploaded event activated ") ;
803865
804866 var last_step = function ( up , file , info ) {
805867 if ( op . downtoken_url ) {
@@ -900,7 +962,14 @@ function QiniuJsSDK() {
900962 } ;
901963 } ) ( _FileUploaded_Handler ) ) ;
902964
903- logger . log ( "bind FileUploaded event" ) ;
965+ logger . debug ( "bind FileUploaded event" ) ;
966+
967+ // init uploader
968+ uploader . init ( ) ;
969+
970+ logger . debug ( "invoke uploader.init()" ) ;
971+
972+ logger . debug ( "init uploader end" ) ;
904973
905974 return uploader ;
906975 } ;
0 commit comments