cos-js-sdk-v5.js 352 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943
  1. (function webpackUniversalModuleDefinition(root, factory) {
  2. if(typeof exports === 'object' && typeof module === 'object')
  3. module.exports = factory();
  4. else if(typeof define === 'function' && define.amd)
  5. define([], factory);
  6. else if(typeof exports === 'object')
  7. exports["COS"] = factory();
  8. else
  9. root["COS"] = factory();
  10. })(typeof self !== 'undefined' ? self : this, function() {
  11. return /******/ (function(modules) { // webpackBootstrap
  12. /******/ // The module cache
  13. /******/ var installedModules = {};
  14. /******/
  15. /******/ // The require function
  16. /******/ function __webpack_require__(moduleId) {
  17. /******/
  18. /******/ // Check if module is in cache
  19. /******/ if(installedModules[moduleId]) {
  20. /******/ return installedModules[moduleId].exports;
  21. /******/ }
  22. /******/ // Create a new module (and put it into the cache)
  23. /******/ var module = installedModules[moduleId] = {
  24. /******/ i: moduleId,
  25. /******/ l: false,
  26. /******/ exports: {}
  27. /******/ };
  28. /******/
  29. /******/ // Execute the module function
  30. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  31. /******/
  32. /******/ // Flag the module as loaded
  33. /******/ module.l = true;
  34. /******/
  35. /******/ // Return the exports of the module
  36. /******/ return module.exports;
  37. /******/ }
  38. /******/
  39. /******/
  40. /******/ // expose the modules object (__webpack_modules__)
  41. /******/ __webpack_require__.m = modules;
  42. /******/
  43. /******/ // expose the module cache
  44. /******/ __webpack_require__.c = installedModules;
  45. /******/
  46. /******/ // define getter function for harmony exports
  47. /******/ __webpack_require__.d = function(exports, name, getter) {
  48. /******/ if(!__webpack_require__.o(exports, name)) {
  49. /******/ Object.defineProperty(exports, name, {
  50. /******/ configurable: false,
  51. /******/ enumerable: true,
  52. /******/ get: getter
  53. /******/ });
  54. /******/ }
  55. /******/ };
  56. /******/
  57. /******/ // getDefaultExport function for compatibility with non-harmony modules
  58. /******/ __webpack_require__.n = function(module) {
  59. /******/ var getter = module && module.__esModule ?
  60. /******/ function getDefault() { return module['default']; } :
  61. /******/ function getModuleExports() { return module; };
  62. /******/ __webpack_require__.d(getter, 'a', getter);
  63. /******/ return getter;
  64. /******/ };
  65. /******/
  66. /******/ // Object.prototype.hasOwnProperty.call
  67. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  68. /******/
  69. /******/ // __webpack_public_path__
  70. /******/ __webpack_require__.p = "/dist/";
  71. /******/
  72. /******/ // Load entry module and return exports
  73. /******/ return __webpack_require__(__webpack_require__.s = 5);
  74. /******/ })
  75. /************************************************************************/
  76. /******/ ([
  77. /* 0 */
  78. /***/ (function(module, exports, __webpack_require__) {
  79. "use strict";
  80. /* WEBPACK VAR INJECTION */(function(process) {
  81. var md5 = __webpack_require__(7);
  82. var CryptoJS = __webpack_require__(10);
  83. var xml2json = __webpack_require__(11);
  84. var json2xml = __webpack_require__(14);
  85. function camSafeUrlEncode(str) {
  86. return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
  87. }
  88. function getObjectKeys(obj, forKey) {
  89. var list = [];
  90. for (var key in obj) {
  91. if (obj.hasOwnProperty(key)) {
  92. list.push(forKey ? camSafeUrlEncode(key).toLowerCase() : key);
  93. }
  94. }
  95. return list.sort(function (a, b) {
  96. a = a.toLowerCase();
  97. b = b.toLowerCase();
  98. return a === b ? 0 : a > b ? 1 : -1;
  99. });
  100. };
  101. var obj2str = function (obj) {
  102. var i, key, val;
  103. var list = [];
  104. var keyList = getObjectKeys(obj);
  105. for (i = 0; i < keyList.length; i++) {
  106. key = keyList[i];
  107. val = obj[key] === undefined || obj[key] === null ? '' : '' + obj[key];
  108. key = camSafeUrlEncode(key).toLowerCase();
  109. val = camSafeUrlEncode(val) || '';
  110. list.push(key + '=' + val);
  111. }
  112. return list.join('&');
  113. };
  114. //测试用的key后面可以去掉
  115. var getAuth = function (opt) {
  116. opt = opt || {};
  117. var SecretId = opt.SecretId;
  118. var SecretKey = opt.SecretKey;
  119. var KeyTime = opt.KeyTime;
  120. var method = (opt.method || opt.Method || 'get').toLowerCase();
  121. var queryParams = clone(opt.Query || opt.params || {});
  122. var headers = clone(opt.Headers || opt.headers || {});
  123. var Key = opt.Key || '';
  124. var pathname;
  125. if (opt.UseRawKey) {
  126. pathname = opt.Pathname || opt.pathname || '/' + Key;
  127. } else {
  128. pathname = opt.Pathname || opt.pathname || Key;
  129. pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);
  130. }
  131. if (!SecretId) throw new Error('missing param SecretId');
  132. if (!SecretKey) throw new Error('missing param SecretKey');
  133. // 签名有效起止时间
  134. var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;
  135. var exp = now;
  136. var Expires = opt.Expires || opt.expires;
  137. if (Expires === undefined) {
  138. exp += 900; // 签名过期时间为当前 + 900s
  139. } else {
  140. exp += Expires * 1 || 0;
  141. }
  142. // 要用到的 Authorization 参数列表
  143. var qSignAlgorithm = 'sha1';
  144. var qAk = SecretId;
  145. var qSignTime = KeyTime || now + ';' + exp;
  146. var qKeyTime = KeyTime || now + ';' + exp;
  147. var qHeaderList = getObjectKeys(headers).join(';').toLowerCase();
  148. var qUrlParamList = getObjectKeys(queryParams).join(';').toLowerCase();
  149. // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778
  150. // 步骤一:计算 SignKey
  151. var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();
  152. // 步骤二:构成 FormatString
  153. var formatString = [method, pathname, util.obj2str(queryParams), util.obj2str(headers), ''].join('\n');
  154. // 步骤三:计算 StringToSign
  155. var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\n');
  156. // 步骤四:计算 Signature
  157. var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();
  158. // 步骤五:构造 Authorization
  159. var authorization = ['q-sign-algorithm=' + qSignAlgorithm, 'q-ak=' + qAk, 'q-sign-time=' + qSignTime, 'q-key-time=' + qKeyTime, 'q-header-list=' + qHeaderList, 'q-url-param-list=' + qUrlParamList, 'q-signature=' + qSignature].join('&');
  160. return authorization;
  161. };
  162. var readIntBE = function (chunk, size, offset) {
  163. var bytes = size / 8;
  164. var buf = chunk.slice(offset, offset + bytes);
  165. new Uint8Array(buf).reverse();
  166. return new { 8: Uint8Array, 16: Uint16Array, 32: Uint32Array }[size](buf)[0];
  167. };
  168. var buf2str = function (chunk, start, end, isUtf8) {
  169. var buf = chunk.slice(start, end);
  170. var str = '';
  171. new Uint8Array(buf).forEach(function (charCode) {
  172. str += String.fromCharCode(charCode);
  173. });
  174. if (isUtf8) str = decodeURIComponent(escape(str));
  175. return str;
  176. };
  177. var parseSelectPayload = function (chunk) {
  178. var header = {};
  179. var body = buf2str(chunk);
  180. var result = { records: [] };
  181. while (chunk.byteLength) {
  182. var totalLength = readIntBE(chunk, 32, 0);
  183. var headerLength = readIntBE(chunk, 32, 4);
  184. var payloadRestLength = totalLength - headerLength - 16;
  185. var offset = 0;
  186. var content;
  187. chunk = chunk.slice(12);
  188. // 获取 Message 的 header 信息
  189. while (offset < headerLength) {
  190. var headerNameLength = readIntBE(chunk, 8, offset);
  191. var headerName = buf2str(chunk, offset + 1, offset + 1 + headerNameLength);
  192. var headerValueLength = readIntBE(chunk, 16, offset + headerNameLength + 2);
  193. var headerValue = buf2str(chunk, offset + headerNameLength + 4, offset + headerNameLength + 4 + headerValueLength);
  194. header[headerName] = headerValue;
  195. offset += headerNameLength + 4 + headerValueLength;
  196. }
  197. if (header[':event-type'] === 'Records') {
  198. content = buf2str(chunk, offset, offset + payloadRestLength, true);
  199. result.records.push(content);
  200. } else if (header[':event-type'] === 'Stats') {
  201. content = buf2str(chunk, offset, offset + payloadRestLength, true);
  202. result.stats = util.xml2json(content).Stats;
  203. } else if (header[':event-type'] === 'error') {
  204. var errCode = header[':error-code'];
  205. var errMessage = header[':error-message'];
  206. var err = new Error(errMessage);
  207. err.message = errMessage;
  208. err.name = err.code = errCode;
  209. result.error = err;
  210. } else if (['Progress', 'Continuation', 'End'].includes(header[':event-type'])) {
  211. // do nothing
  212. }
  213. chunk = chunk.slice(offset + payloadRestLength + 4);
  214. }
  215. return {
  216. payload: result.records.join(''),
  217. body: body
  218. };
  219. };
  220. var getSourceParams = function (source) {
  221. var parser = this.options.CopySourceParser;
  222. if (parser) return parser(source);
  223. var m = source.match(/^([^.]+-\d+)\.cos(v6|-cdc)?\.([^.]+)\.myqcloud\.com\/(.+)$/);
  224. if (!m) return null;
  225. return { Bucket: m[1], Region: m[3], Key: m[4] };
  226. };
  227. var noop = function () {};
  228. // 清除对象里值为的 undefined 或 null 的属性
  229. var clearKey = function (obj) {
  230. var retObj = {};
  231. for (var key in obj) {
  232. if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {
  233. retObj[key] = obj[key];
  234. }
  235. }
  236. return retObj;
  237. };
  238. var readAsBinaryString = function (blob, callback) {
  239. var readFun;
  240. var fr = new FileReader();
  241. if (FileReader.prototype.readAsBinaryString) {
  242. readFun = FileReader.prototype.readAsBinaryString;
  243. fr.onload = function () {
  244. callback(this.result);
  245. };
  246. } else if (FileReader.prototype.readAsArrayBuffer) {
  247. // 在 ie11 添加 readAsBinaryString 兼容
  248. readFun = function (fileData) {
  249. var binary = "";
  250. var pt = this;
  251. var reader = new FileReader();
  252. reader.onload = function (e) {
  253. var bytes = new Uint8Array(reader.result);
  254. var length = bytes.byteLength;
  255. for (var i = 0; i < length; i++) {
  256. binary += String.fromCharCode(bytes[i]);
  257. }
  258. callback(binary);
  259. };
  260. reader.readAsArrayBuffer(fileData);
  261. };
  262. } else {
  263. console.error('FileReader not support readAsBinaryString');
  264. }
  265. readFun.call(fr, blob);
  266. };
  267. var fileSliceNeedCopy = function () {
  268. var compareVersion = function (a, b) {
  269. a = a.split('.');
  270. b = b.split('.');
  271. for (var i = 0; i < b.length; i++) {
  272. if (a[i] !== b[i]) {
  273. return parseInt(a[i]) > parseInt(b[i]) ? 1 : -1;
  274. }
  275. }
  276. return 0;
  277. };
  278. var check = function (ua) {
  279. var ChromeVersion = (ua.match(/Chrome\/([.\d]+)/) || [])[1];
  280. var QBCoreVersion = (ua.match(/QBCore\/([.\d]+)/) || [])[1];
  281. var QQBrowserVersion = (ua.match(/QQBrowser\/([.\d]+)/) || [])[1];
  282. var need = ChromeVersion && compareVersion(ChromeVersion, '53.0.2785.116') < 0 && QBCoreVersion && compareVersion(QBCoreVersion, '3.53.991.400') < 0 && QQBrowserVersion && compareVersion(QQBrowserVersion, '9.0.2524.400') <= 0 || false;
  283. return need;
  284. };
  285. return check(navigator && navigator.userAgent);
  286. }();
  287. // 获取文件分片
  288. var fileSlice = function (file, start, end, isUseToUpload, callback) {
  289. var blob;
  290. if (file.slice) {
  291. blob = file.slice(start, end);
  292. } else if (file.mozSlice) {
  293. blob = file.mozSlice(start, end);
  294. } else if (file.webkitSlice) {
  295. blob = file.webkitSlice(start, end);
  296. }
  297. if (isUseToUpload && fileSliceNeedCopy) {
  298. var reader = new FileReader();
  299. reader.onload = function (e) {
  300. blob = null;
  301. callback(new Blob([reader.result]));
  302. };
  303. reader.readAsArrayBuffer(blob);
  304. } else {
  305. callback(blob);
  306. }
  307. };
  308. // 获取文件内容的 MD5
  309. var getBodyMd5 = function (UploadCheckContentMd5, Body, callback, onProgress) {
  310. callback = callback || noop;
  311. if (UploadCheckContentMd5) {
  312. if (typeof Body === 'string') {
  313. callback(util.md5(Body, true));
  314. } else if (Blob && Body instanceof Blob) {
  315. util.getFileMd5(Body, function (err, md5) {
  316. callback(md5);
  317. }, onProgress);
  318. } else {
  319. callback();
  320. }
  321. } else {
  322. callback();
  323. }
  324. };
  325. // 获取文件 md5 值
  326. var md5ChunkSize = 1024 * 1024;
  327. var getFileMd5 = function (blob, callback, onProgress) {
  328. var size = blob.size;
  329. var loaded = 0;
  330. var md5ctx = md5.getCtx();
  331. var next = function (start) {
  332. if (start >= size) {
  333. var hash = md5ctx.digest('hex');
  334. callback(null, hash);
  335. return;
  336. }
  337. var end = Math.min(size, start + md5ChunkSize);
  338. util.fileSlice(blob, start, end, false, function (chunk) {
  339. readAsBinaryString(chunk, function (content) {
  340. chunk = null;
  341. md5ctx = md5ctx.update(content, true);
  342. loaded += content.length;
  343. content = null;
  344. if (onProgress) onProgress({ loaded: loaded, total: size, percent: Math.round(loaded / size * 10000) / 10000 });
  345. next(start + md5ChunkSize);
  346. });
  347. });
  348. };
  349. next(0);
  350. };
  351. function clone(obj) {
  352. return map(obj, function (v) {
  353. return typeof v === 'object' && v !== null ? clone(v) : v;
  354. });
  355. }
  356. function attr(obj, name, defaultValue) {
  357. return obj && name in obj ? obj[name] : defaultValue;
  358. }
  359. function extend(target, source) {
  360. each(source, function (val, key) {
  361. target[key] = source[key];
  362. });
  363. return target;
  364. }
  365. function isArray(arr) {
  366. return arr instanceof Array;
  367. }
  368. function isInArray(arr, item) {
  369. var flag = false;
  370. for (var i = 0; i < arr.length; i++) {
  371. if (item === arr[i]) {
  372. flag = true;
  373. break;
  374. }
  375. }
  376. return flag;
  377. }
  378. function makeArray(arr) {
  379. return isArray(arr) ? arr : [arr];
  380. }
  381. function each(obj, fn) {
  382. for (var i in obj) {
  383. if (obj.hasOwnProperty(i)) {
  384. fn(obj[i], i);
  385. }
  386. }
  387. }
  388. function map(obj, fn) {
  389. var o = isArray(obj) ? [] : {};
  390. for (var i in obj) {
  391. if (obj.hasOwnProperty(i)) {
  392. o[i] = fn(obj[i], i);
  393. }
  394. }
  395. return o;
  396. }
  397. function filter(obj, fn) {
  398. var iaArr = isArray(obj);
  399. var o = iaArr ? [] : {};
  400. for (var i in obj) {
  401. if (obj.hasOwnProperty(i)) {
  402. if (fn(obj[i], i)) {
  403. if (iaArr) {
  404. o.push(obj[i]);
  405. } else {
  406. o[i] = obj[i];
  407. }
  408. }
  409. }
  410. }
  411. return o;
  412. }
  413. var binaryBase64 = function (str) {
  414. var i,
  415. len,
  416. char,
  417. res = '';
  418. for (i = 0, len = str.length / 2; i < len; i++) {
  419. char = parseInt(str[i * 2] + str[i * 2 + 1], 16);
  420. res += String.fromCharCode(char);
  421. }
  422. return btoa(res);
  423. };
  424. var uuid = function () {
  425. var S4 = function () {
  426. return ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1);
  427. };
  428. return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
  429. };
  430. var hasMissingParams = function (apiName, params) {
  431. var Bucket = params.Bucket;
  432. var Region = params.Region;
  433. var Key = params.Key;
  434. var Domain = this.options.Domain;
  435. var checkBucket = !Domain || Domain.indexOf('{Bucket}') > -1;
  436. var checkRegion = !Domain || Domain.indexOf('{Region}') > -1;
  437. if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList' || apiName === 'listObjectVersions') {
  438. if (checkBucket && !Bucket) return 'Bucket';
  439. if (checkRegion && !Region) return 'Region';
  440. } else if (apiName.indexOf('Object') > -1 || apiName.indexOf('multipart') > -1 || apiName === 'sliceUploadFile' || apiName === 'abortUploadTask') {
  441. if (checkBucket && !Bucket) return 'Bucket';
  442. if (checkRegion && !Region) return 'Region';
  443. if (!Key) return 'Key';
  444. }
  445. return false;
  446. };
  447. var formatParams = function (apiName, params) {
  448. // 复制参数对象
  449. params = extend({}, params);
  450. // 统一处理 Headers
  451. if (apiName !== 'getAuth' && apiName !== 'getV4Auth' && apiName !== 'getObjectUrl') {
  452. var Headers = params.Headers || {};
  453. if (params && typeof params === 'object') {
  454. (function () {
  455. for (var key in params) {
  456. if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) {
  457. Headers[key] = params[key];
  458. }
  459. }
  460. })();
  461. var headerMap = {
  462. // params headers
  463. 'x-cos-mfa': 'MFA',
  464. 'Content-MD5': 'ContentMD5',
  465. 'Content-Length': 'ContentLength',
  466. 'Content-Type': 'ContentType',
  467. 'Expect': 'Expect',
  468. 'Expires': 'Expires',
  469. 'Cache-Control': 'CacheControl',
  470. 'Content-Disposition': 'ContentDisposition',
  471. 'Content-Encoding': 'ContentEncoding',
  472. 'Range': 'Range',
  473. 'If-Modified-Since': 'IfModifiedSince',
  474. 'If-Unmodified-Since': 'IfUnmodifiedSince',
  475. 'If-Match': 'IfMatch',
  476. 'If-None-Match': 'IfNoneMatch',
  477. 'x-cos-copy-source': 'CopySource',
  478. 'x-cos-copy-source-Range': 'CopySourceRange',
  479. 'x-cos-metadata-directive': 'MetadataDirective',
  480. 'x-cos-copy-source-If-Modified-Since': 'CopySourceIfModifiedSince',
  481. 'x-cos-copy-source-If-Unmodified-Since': 'CopySourceIfUnmodifiedSince',
  482. 'x-cos-copy-source-If-Match': 'CopySourceIfMatch',
  483. 'x-cos-copy-source-If-None-Match': 'CopySourceIfNoneMatch',
  484. 'x-cos-acl': 'ACL',
  485. 'x-cos-grant-read': 'GrantRead',
  486. 'x-cos-grant-write': 'GrantWrite',
  487. 'x-cos-grant-full-control': 'GrantFullControl',
  488. 'x-cos-grant-read-acp': 'GrantReadAcp',
  489. 'x-cos-grant-write-acp': 'GrantWriteAcp',
  490. 'x-cos-storage-class': 'StorageClass',
  491. 'x-cos-traffic-limit': 'TrafficLimit',
  492. 'x-cos-mime-limit': 'MimeLimit',
  493. // SSE-C
  494. 'x-cos-server-side-encryption-customer-algorithm': 'SSECustomerAlgorithm',
  495. 'x-cos-server-side-encryption-customer-key': 'SSECustomerKey',
  496. 'x-cos-server-side-encryption-customer-key-MD5': 'SSECustomerKeyMD5',
  497. // SSE-COS、SSE-KMS
  498. 'x-cos-server-side-encryption': 'ServerSideEncryption',
  499. 'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',
  500. 'x-cos-server-side-encryption-context': 'SSEContext'
  501. };
  502. util.each(headerMap, function (paramKey, headerKey) {
  503. if (params[paramKey] !== undefined) {
  504. Headers[headerKey] = params[paramKey];
  505. }
  506. });
  507. params.Headers = clearKey(Headers);
  508. }
  509. }
  510. return params;
  511. };
  512. var apiWrapper = function (apiName, apiFn) {
  513. return function (params, callback) {
  514. var self = this;
  515. // 处理参数
  516. if (typeof params === 'function') {
  517. callback = params;
  518. params = {};
  519. }
  520. // 整理参数格式
  521. params = formatParams(apiName, params);
  522. // 代理回调函数
  523. var formatResult = function (result) {
  524. if (result && result.headers) {
  525. result.headers['x-cos-request-id'] && (result.RequestId = result.headers['x-cos-request-id']);
  526. result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']);
  527. result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']);
  528. }
  529. return result;
  530. };
  531. var _callback = function (err, data) {
  532. callback && callback(formatResult(err), formatResult(data));
  533. };
  534. var checkParams = function () {
  535. if (apiName !== 'getService' && apiName !== 'abortUploadTask') {
  536. // 判断参数是否完整
  537. var missingResult = hasMissingParams.call(self, apiName, params);
  538. if (missingResult) {
  539. return 'missing param ' + missingResult;
  540. }
  541. // 判断 region 格式
  542. if (params.Region) {
  543. if (self.options.CompatibilityMode) {
  544. if (!/^([a-z\d-.]+)$/.test(params.Region)) {
  545. return 'Region format error.';
  546. }
  547. } else {
  548. if (params.Region.indexOf('cos.') > -1) {
  549. return 'param Region should not be start with "cos."';
  550. } else if (!/^([a-z\d-]+)$/.test(params.Region)) {
  551. return 'Region format error.';
  552. }
  553. }
  554. // 判断 region 格式
  555. if (!self.options.CompatibilityMode && params.Region.indexOf('-') === -1 && params.Region !== 'yfb' && params.Region !== 'default' && params.Region !== 'accelerate') {
  556. console.warn('warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224');
  557. }
  558. }
  559. // 兼容不带 AppId 的 Bucket
  560. if (params.Bucket) {
  561. if (!/^([a-z\d-]+)-(\d+)$/.test(params.Bucket)) {
  562. if (params.AppId) {
  563. params.Bucket = params.Bucket + '-' + params.AppId;
  564. } else if (self.options.AppId) {
  565. params.Bucket = params.Bucket + '-' + self.options.AppId;
  566. } else {
  567. return 'Bucket should format as "test-1250000000".';
  568. }
  569. }
  570. if (params.AppId) {
  571. console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:"test-1250000000" ).');
  572. delete params.AppId;
  573. }
  574. }
  575. // 如果 Key 是 / 开头,强制去掉第一个 /
  576. if (!self.options.UseRawKey && params.Key && params.Key.substr(0, 1) === '/') {
  577. params.Key = params.Key.substr(1);
  578. }
  579. }
  580. };
  581. var errMsg = checkParams();
  582. var isSync = apiName === 'getAuth' || apiName === 'getObjectUrl';
  583. if (window.Promise && !isSync && !callback) {
  584. return new Promise(function (resolve, reject) {
  585. callback = function (err, data) {
  586. err ? reject(err) : resolve(data);
  587. };
  588. if (errMsg) return _callback(util.error(new Error(errMsg)));
  589. apiFn.call(self, params, _callback);
  590. });
  591. } else {
  592. if (errMsg) return _callback(util.error(new Error(errMsg)));
  593. var res = apiFn.call(self, params, _callback);
  594. if (isSync) return res;
  595. }
  596. };
  597. };
  598. var throttleOnProgress = function (total, onProgress) {
  599. var self = this;
  600. var size0 = 0;
  601. var size1 = 0;
  602. var time0 = Date.now();
  603. var time1;
  604. var timer;
  605. function update() {
  606. timer = 0;
  607. if (onProgress && typeof onProgress === 'function') {
  608. time1 = Date.now();
  609. var speed = Math.max(0, Math.round((size1 - size0) / ((time1 - time0) / 1000) * 100) / 100) || 0;
  610. var percent;
  611. if (size1 === 0 && total === 0) {
  612. percent = 1;
  613. } else {
  614. percent = Math.floor(size1 / total * 100) / 100 || 0;
  615. }
  616. time0 = time1;
  617. size0 = size1;
  618. try {
  619. onProgress({ loaded: size1, total: total, speed: speed, percent: percent });
  620. } catch (e) {}
  621. }
  622. }
  623. return function (info, immediately) {
  624. if (info) {
  625. size1 = info.loaded;
  626. total = info.total;
  627. }
  628. if (immediately) {
  629. clearTimeout(timer);
  630. update();
  631. } else {
  632. if (timer) return;
  633. timer = setTimeout(update, self.options.ProgressInterval);
  634. }
  635. };
  636. };
  637. var getFileSize = function (api, params, callback) {
  638. var size;
  639. if (typeof params.Body === 'string') {
  640. params.Body = new Blob([params.Body], { type: 'text/plain' });
  641. } else if (params.Body instanceof ArrayBuffer) {
  642. params.Body = new Blob([params.Body]);
  643. }
  644. if (params.Body && (params.Body instanceof Blob || params.Body.toString() === '[object File]' || params.Body.toString() === '[object Blob]')) {
  645. size = params.Body.size;
  646. } else {
  647. callback(util.error(new Error('params body format error, Only allow File|Blob|String.')));
  648. return;
  649. }
  650. params.ContentLength = size;
  651. callback(null, size);
  652. };
  653. // 获取调正的时间戳
  654. var getSkewTime = function (offset) {
  655. return Date.now() + (offset || 0);
  656. };
  657. var error = function (err, opt) {
  658. var sourceErr = err;
  659. err.message = err.message || null;
  660. if (typeof opt === 'string') {
  661. err.error = opt;
  662. err.message = opt;
  663. } else if (typeof opt === 'object' && opt !== null) {
  664. extend(err, opt);
  665. if (opt.code || opt.name) err.code = opt.code || opt.name;
  666. if (opt.message) err.message = opt.message;
  667. if (opt.stack) err.stack = opt.stack;
  668. }
  669. if (typeof Object.defineProperty === 'function') {
  670. Object.defineProperty(err, 'name', { writable: true, enumerable: false });
  671. Object.defineProperty(err, 'message', { enumerable: true });
  672. }
  673. err.name = opt && opt.name || err.name || err.code || 'Error';
  674. if (!err.code) err.code = err.name;
  675. if (!err.error) err.error = clone(sourceErr); // 兼容老的错误格式
  676. return err;
  677. };
  678. var isNode = function () {
  679. return typeof window !== 'object' && typeof process === 'object' && "function" === 'function';
  680. };
  681. var isCIHost = function (url) {
  682. return (/^https?:\/\/([^/]+\.)?ci\.[^/]+/.test(url)
  683. );
  684. };
  685. var util = {
  686. noop: noop,
  687. formatParams: formatParams,
  688. apiWrapper: apiWrapper,
  689. xml2json: xml2json,
  690. json2xml: json2xml,
  691. md5: md5,
  692. clearKey: clearKey,
  693. fileSlice: fileSlice,
  694. getBodyMd5: getBodyMd5,
  695. getFileMd5: getFileMd5,
  696. binaryBase64: binaryBase64,
  697. extend: extend,
  698. isArray: isArray,
  699. isInArray: isInArray,
  700. makeArray: makeArray,
  701. each: each,
  702. map: map,
  703. filter: filter,
  704. clone: clone,
  705. attr: attr,
  706. uuid: uuid,
  707. camSafeUrlEncode: camSafeUrlEncode,
  708. throttleOnProgress: throttleOnProgress,
  709. getFileSize: getFileSize,
  710. getSkewTime: getSkewTime,
  711. error: error,
  712. obj2str: obj2str,
  713. getAuth: getAuth,
  714. parseSelectPayload: parseSelectPayload,
  715. getSourceParams: getSourceParams,
  716. isBrowser: true,
  717. isNode: isNode,
  718. isCIHost: isCIHost
  719. };
  720. module.exports = util;
  721. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
  722. /***/ }),
  723. /* 1 */
  724. /***/ (function(module, exports) {
  725. // shim for using process in browser
  726. var process = module.exports = {};
  727. // cached from whatever global is present so that test runners that stub it
  728. // don't break things. But we need to wrap it in a try catch in case it is
  729. // wrapped in strict mode code which doesn't define any globals. It's inside a
  730. // function because try/catches deoptimize in certain engines.
  731. var cachedSetTimeout;
  732. var cachedClearTimeout;
  733. function defaultSetTimout() {
  734. throw new Error('setTimeout has not been defined');
  735. }
  736. function defaultClearTimeout () {
  737. throw new Error('clearTimeout has not been defined');
  738. }
  739. (function () {
  740. try {
  741. if (typeof setTimeout === 'function') {
  742. cachedSetTimeout = setTimeout;
  743. } else {
  744. cachedSetTimeout = defaultSetTimout;
  745. }
  746. } catch (e) {
  747. cachedSetTimeout = defaultSetTimout;
  748. }
  749. try {
  750. if (typeof clearTimeout === 'function') {
  751. cachedClearTimeout = clearTimeout;
  752. } else {
  753. cachedClearTimeout = defaultClearTimeout;
  754. }
  755. } catch (e) {
  756. cachedClearTimeout = defaultClearTimeout;
  757. }
  758. } ())
  759. function runTimeout(fun) {
  760. if (cachedSetTimeout === setTimeout) {
  761. //normal enviroments in sane situations
  762. return setTimeout(fun, 0);
  763. }
  764. // if setTimeout wasn't available but was latter defined
  765. if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
  766. cachedSetTimeout = setTimeout;
  767. return setTimeout(fun, 0);
  768. }
  769. try {
  770. // when when somebody has screwed with setTimeout but no I.E. maddness
  771. return cachedSetTimeout(fun, 0);
  772. } catch(e){
  773. try {
  774. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  775. return cachedSetTimeout.call(null, fun, 0);
  776. } catch(e){
  777. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
  778. return cachedSetTimeout.call(this, fun, 0);
  779. }
  780. }
  781. }
  782. function runClearTimeout(marker) {
  783. if (cachedClearTimeout === clearTimeout) {
  784. //normal enviroments in sane situations
  785. return clearTimeout(marker);
  786. }
  787. // if clearTimeout wasn't available but was latter defined
  788. if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
  789. cachedClearTimeout = clearTimeout;
  790. return clearTimeout(marker);
  791. }
  792. try {
  793. // when when somebody has screwed with setTimeout but no I.E. maddness
  794. return cachedClearTimeout(marker);
  795. } catch (e){
  796. try {
  797. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  798. return cachedClearTimeout.call(null, marker);
  799. } catch (e){
  800. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
  801. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  802. return cachedClearTimeout.call(this, marker);
  803. }
  804. }
  805. }
  806. var queue = [];
  807. var draining = false;
  808. var currentQueue;
  809. var queueIndex = -1;
  810. function cleanUpNextTick() {
  811. if (!draining || !currentQueue) {
  812. return;
  813. }
  814. draining = false;
  815. if (currentQueue.length) {
  816. queue = currentQueue.concat(queue);
  817. } else {
  818. queueIndex = -1;
  819. }
  820. if (queue.length) {
  821. drainQueue();
  822. }
  823. }
  824. function drainQueue() {
  825. if (draining) {
  826. return;
  827. }
  828. var timeout = runTimeout(cleanUpNextTick);
  829. draining = true;
  830. var len = queue.length;
  831. while(len) {
  832. currentQueue = queue;
  833. queue = [];
  834. while (++queueIndex < len) {
  835. if (currentQueue) {
  836. currentQueue[queueIndex].run();
  837. }
  838. }
  839. queueIndex = -1;
  840. len = queue.length;
  841. }
  842. currentQueue = null;
  843. draining = false;
  844. runClearTimeout(timeout);
  845. }
  846. process.nextTick = function (fun) {
  847. var args = new Array(arguments.length - 1);
  848. if (arguments.length > 1) {
  849. for (var i = 1; i < arguments.length; i++) {
  850. args[i - 1] = arguments[i];
  851. }
  852. }
  853. queue.push(new Item(fun, args));
  854. if (queue.length === 1 && !draining) {
  855. runTimeout(drainQueue);
  856. }
  857. };
  858. // v8 likes predictible objects
  859. function Item(fun, array) {
  860. this.fun = fun;
  861. this.array = array;
  862. }
  863. Item.prototype.run = function () {
  864. this.fun.apply(null, this.array);
  865. };
  866. process.title = 'browser';
  867. process.browser = true;
  868. process.env = {};
  869. process.argv = [];
  870. process.version = ''; // empty string to avoid regexp issues
  871. process.versions = {};
  872. function noop() {}
  873. process.on = noop;
  874. process.addListener = noop;
  875. process.once = noop;
  876. process.off = noop;
  877. process.removeListener = noop;
  878. process.removeAllListeners = noop;
  879. process.emit = noop;
  880. process.prependListener = noop;
  881. process.prependOnceListener = noop;
  882. process.listeners = function (name) { return [] }
  883. process.binding = function (name) {
  884. throw new Error('process.binding is not supported');
  885. };
  886. process.cwd = function () { return '/' };
  887. process.chdir = function (dir) {
  888. throw new Error('process.chdir is not supported');
  889. };
  890. process.umask = function() { return 0; };
  891. /***/ }),
  892. /* 2 */
  893. /***/ (function(module, exports) {
  894. /*
  895. * DOM Level 2
  896. * Object DOMException
  897. * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
  898. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
  899. */
  900. function copy(src,dest){
  901. for(var p in src){
  902. dest[p] = src[p];
  903. }
  904. }
  905. /**
  906. ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
  907. ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
  908. */
  909. function _extends(Class,Super){
  910. var pt = Class.prototype;
  911. if(Object.create){
  912. var ppt = Object.create(Super.prototype)
  913. pt.__proto__ = ppt;
  914. }
  915. if(!(pt instanceof Super)){
  916. function t(){};
  917. t.prototype = Super.prototype;
  918. t = new t();
  919. copy(pt,t);
  920. Class.prototype = pt = t;
  921. }
  922. if(pt.constructor != Class){
  923. if(typeof Class != 'function'){
  924. console.error("unknow Class:"+Class)
  925. }
  926. pt.constructor = Class
  927. }
  928. }
  929. var htmlns = 'http://www.w3.org/1999/xhtml' ;
  930. // Node Types
  931. var NodeType = {}
  932. var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
  933. var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
  934. var TEXT_NODE = NodeType.TEXT_NODE = 3;
  935. var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
  936. var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
  937. var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
  938. var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
  939. var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
  940. var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
  941. var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
  942. var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
  943. var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
  944. // ExceptionCode
  945. var ExceptionCode = {}
  946. var ExceptionMessage = {};
  947. var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
  948. var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
  949. var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
  950. var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
  951. var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
  952. var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
  953. var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
  954. var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
  955. var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
  956. var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
  957. //level2
  958. var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
  959. var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
  960. var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
  961. var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
  962. var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
  963. function DOMException(code, message) {
  964. if(message instanceof Error){
  965. var error = message;
  966. }else{
  967. error = this;
  968. Error.call(this, ExceptionMessage[code]);
  969. this.message = ExceptionMessage[code];
  970. if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
  971. }
  972. error.code = code;
  973. if(message) this.message = this.message + ": " + message;
  974. return error;
  975. };
  976. DOMException.prototype = Error.prototype;
  977. copy(ExceptionCode,DOMException)
  978. /**
  979. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
  980. * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
  981. * The items in the NodeList are accessible via an integral index, starting from 0.
  982. */
  983. function NodeList() {
  984. };
  985. NodeList.prototype = {
  986. /**
  987. * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
  988. * @standard level1
  989. */
  990. length:0,
  991. /**
  992. * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
  993. * @standard level1
  994. * @param index unsigned long
  995. * Index into the collection.
  996. * @return Node
  997. * The node at the indexth position in the NodeList, or null if that is not a valid index.
  998. */
  999. item: function(index) {
  1000. return this[index] || null;
  1001. },
  1002. toString:function(isHTML,nodeFilter){
  1003. for(var buf = [], i = 0;i<this.length;i++){
  1004. serializeToString(this[i],buf,isHTML,nodeFilter);
  1005. }
  1006. return buf.join('');
  1007. }
  1008. };
  1009. function LiveNodeList(node,refresh){
  1010. this._node = node;
  1011. this._refresh = refresh
  1012. _updateLiveList(this);
  1013. }
  1014. function _updateLiveList(list){
  1015. var inc = list._node._inc || list._node.ownerDocument._inc;
  1016. if(list._inc != inc){
  1017. var ls = list._refresh(list._node);
  1018. //console.log(ls.length)
  1019. __set__(list,'length',ls.length);
  1020. copy(ls,list);
  1021. list._inc = inc;
  1022. }
  1023. }
  1024. LiveNodeList.prototype.item = function(i){
  1025. _updateLiveList(this);
  1026. return this[i];
  1027. }
  1028. _extends(LiveNodeList,NodeList);
  1029. /**
  1030. *
  1031. * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
  1032. * NamedNodeMap objects in the DOM are live.
  1033. * used for attributes or DocumentType entities
  1034. */
  1035. function NamedNodeMap() {
  1036. };
  1037. function _findNodeIndex(list,node){
  1038. var i = list.length;
  1039. while(i--){
  1040. if(list[i] === node){return i}
  1041. }
  1042. }
  1043. function _addNamedNode(el,list,newAttr,oldAttr){
  1044. if(oldAttr){
  1045. list[_findNodeIndex(list,oldAttr)] = newAttr;
  1046. }else{
  1047. list[list.length++] = newAttr;
  1048. }
  1049. if(el){
  1050. newAttr.ownerElement = el;
  1051. var doc = el.ownerDocument;
  1052. if(doc){
  1053. oldAttr && _onRemoveAttribute(doc,el,oldAttr);
  1054. _onAddAttribute(doc,el,newAttr);
  1055. }
  1056. }
  1057. }
  1058. function _removeNamedNode(el,list,attr){
  1059. //console.log('remove attr:'+attr)
  1060. var i = _findNodeIndex(list,attr);
  1061. if(i>=0){
  1062. var lastIndex = list.length-1
  1063. while(i<lastIndex){
  1064. list[i] = list[++i]
  1065. }
  1066. list.length = lastIndex;
  1067. if(el){
  1068. var doc = el.ownerDocument;
  1069. if(doc){
  1070. _onRemoveAttribute(doc,el,attr);
  1071. attr.ownerElement = null;
  1072. }
  1073. }
  1074. }else{
  1075. throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
  1076. }
  1077. }
  1078. NamedNodeMap.prototype = {
  1079. length:0,
  1080. item:NodeList.prototype.item,
  1081. getNamedItem: function(key) {
  1082. // if(key.indexOf(':')>0 || key == 'xmlns'){
  1083. // return null;
  1084. // }
  1085. //console.log()
  1086. var i = this.length;
  1087. while(i--){
  1088. var attr = this[i];
  1089. //console.log(attr.nodeName,key)
  1090. if(attr.nodeName == key){
  1091. return attr;
  1092. }
  1093. }
  1094. },
  1095. setNamedItem: function(attr) {
  1096. var el = attr.ownerElement;
  1097. if(el && el!=this._ownerElement){
  1098. throw new DOMException(INUSE_ATTRIBUTE_ERR);
  1099. }
  1100. var oldAttr = this.getNamedItem(attr.nodeName);
  1101. _addNamedNode(this._ownerElement,this,attr,oldAttr);
  1102. return oldAttr;
  1103. },
  1104. /* returns Node */
  1105. setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
  1106. var el = attr.ownerElement, oldAttr;
  1107. if(el && el!=this._ownerElement){
  1108. throw new DOMException(INUSE_ATTRIBUTE_ERR);
  1109. }
  1110. oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
  1111. _addNamedNode(this._ownerElement,this,attr,oldAttr);
  1112. return oldAttr;
  1113. },
  1114. /* returns Node */
  1115. removeNamedItem: function(key) {
  1116. var attr = this.getNamedItem(key);
  1117. _removeNamedNode(this._ownerElement,this,attr);
  1118. return attr;
  1119. },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
  1120. //for level2
  1121. removeNamedItemNS:function(namespaceURI,localName){
  1122. var attr = this.getNamedItemNS(namespaceURI,localName);
  1123. _removeNamedNode(this._ownerElement,this,attr);
  1124. return attr;
  1125. },
  1126. getNamedItemNS: function(namespaceURI, localName) {
  1127. var i = this.length;
  1128. while(i--){
  1129. var node = this[i];
  1130. if(node.localName == localName && node.namespaceURI == namespaceURI){
  1131. return node;
  1132. }
  1133. }
  1134. return null;
  1135. }
  1136. };
  1137. /**
  1138. * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
  1139. */
  1140. function DOMImplementation(/* Object */ features) {
  1141. this._features = {};
  1142. if (features) {
  1143. for (var feature in features) {
  1144. this._features = features[feature];
  1145. }
  1146. }
  1147. };
  1148. DOMImplementation.prototype = {
  1149. hasFeature: function(/* string */ feature, /* string */ version) {
  1150. var versions = this._features[feature.toLowerCase()];
  1151. if (versions && (!version || version in versions)) {
  1152. return true;
  1153. } else {
  1154. return false;
  1155. }
  1156. },
  1157. // Introduced in DOM Level 2:
  1158. createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
  1159. var doc = new Document();
  1160. doc.implementation = this;
  1161. doc.childNodes = new NodeList();
  1162. doc.doctype = doctype;
  1163. if(doctype){
  1164. doc.appendChild(doctype);
  1165. }
  1166. if(qualifiedName){
  1167. var root = doc.createElementNS(namespaceURI,qualifiedName);
  1168. doc.appendChild(root);
  1169. }
  1170. return doc;
  1171. },
  1172. // Introduced in DOM Level 2:
  1173. createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
  1174. var node = new DocumentType();
  1175. node.name = qualifiedName;
  1176. node.nodeName = qualifiedName;
  1177. node.publicId = publicId;
  1178. node.systemId = systemId;
  1179. // Introduced in DOM Level 2:
  1180. //readonly attribute DOMString internalSubset;
  1181. //TODO:..
  1182. // readonly attribute NamedNodeMap entities;
  1183. // readonly attribute NamedNodeMap notations;
  1184. return node;
  1185. }
  1186. };
  1187. /**
  1188. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
  1189. */
  1190. function Node() {
  1191. };
  1192. Node.prototype = {
  1193. firstChild : null,
  1194. lastChild : null,
  1195. previousSibling : null,
  1196. nextSibling : null,
  1197. attributes : null,
  1198. parentNode : null,
  1199. childNodes : null,
  1200. ownerDocument : null,
  1201. nodeValue : null,
  1202. namespaceURI : null,
  1203. prefix : null,
  1204. localName : null,
  1205. // Modified in DOM Level 2:
  1206. insertBefore:function(newChild, refChild){//raises
  1207. return _insertBefore(this,newChild,refChild);
  1208. },
  1209. replaceChild:function(newChild, oldChild){//raises
  1210. this.insertBefore(newChild,oldChild);
  1211. if(oldChild){
  1212. this.removeChild(oldChild);
  1213. }
  1214. },
  1215. removeChild:function(oldChild){
  1216. return _removeChild(this,oldChild);
  1217. },
  1218. appendChild:function(newChild){
  1219. return this.insertBefore(newChild,null);
  1220. },
  1221. hasChildNodes:function(){
  1222. return this.firstChild != null;
  1223. },
  1224. cloneNode:function(deep){
  1225. return cloneNode(this.ownerDocument||this,this,deep);
  1226. },
  1227. // Modified in DOM Level 2:
  1228. normalize:function(){
  1229. var child = this.firstChild;
  1230. while(child){
  1231. var next = child.nextSibling;
  1232. if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
  1233. this.removeChild(next);
  1234. child.appendData(next.data);
  1235. }else{
  1236. child.normalize();
  1237. child = next;
  1238. }
  1239. }
  1240. },
  1241. // Introduced in DOM Level 2:
  1242. isSupported:function(feature, version){
  1243. return this.ownerDocument.implementation.hasFeature(feature,version);
  1244. },
  1245. // Introduced in DOM Level 2:
  1246. hasAttributes:function(){
  1247. return this.attributes.length>0;
  1248. },
  1249. lookupPrefix:function(namespaceURI){
  1250. var el = this;
  1251. while(el){
  1252. var map = el._nsMap;
  1253. //console.dir(map)
  1254. if(map){
  1255. for(var n in map){
  1256. if(map[n] == namespaceURI){
  1257. return n;
  1258. }
  1259. }
  1260. }
  1261. el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
  1262. }
  1263. return null;
  1264. },
  1265. // Introduced in DOM Level 3:
  1266. lookupNamespaceURI:function(prefix){
  1267. var el = this;
  1268. while(el){
  1269. var map = el._nsMap;
  1270. //console.dir(map)
  1271. if(map){
  1272. if(prefix in map){
  1273. return map[prefix] ;
  1274. }
  1275. }
  1276. el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
  1277. }
  1278. return null;
  1279. },
  1280. // Introduced in DOM Level 3:
  1281. isDefaultNamespace:function(namespaceURI){
  1282. var prefix = this.lookupPrefix(namespaceURI);
  1283. return prefix == null;
  1284. }
  1285. };
  1286. function _xmlEncoder(c){
  1287. return c == '<' && '&lt;' ||
  1288. c == '>' && '&gt;' ||
  1289. c == '&' && '&amp;' ||
  1290. c == '"' && '&quot;' ||
  1291. '&#'+c.charCodeAt()+';'
  1292. }
  1293. copy(NodeType,Node);
  1294. copy(NodeType,Node.prototype);
  1295. /**
  1296. * @param callback return true for continue,false for break
  1297. * @return boolean true: break visit;
  1298. */
  1299. function _visitNode(node,callback){
  1300. if(callback(node)){
  1301. return true;
  1302. }
  1303. if(node = node.firstChild){
  1304. do{
  1305. if(_visitNode(node,callback)){return true}
  1306. }while(node=node.nextSibling)
  1307. }
  1308. }
  1309. function Document(){
  1310. }
  1311. function _onAddAttribute(doc,el,newAttr){
  1312. doc && doc._inc++;
  1313. var ns = newAttr.namespaceURI ;
  1314. if(ns == 'http://www.w3.org/2000/xmlns/'){
  1315. //update namespace
  1316. el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
  1317. }
  1318. }
  1319. function _onRemoveAttribute(doc,el,newAttr,remove){
  1320. doc && doc._inc++;
  1321. var ns = newAttr.namespaceURI ;
  1322. if(ns == 'http://www.w3.org/2000/xmlns/'){
  1323. //update namespace
  1324. delete el._nsMap[newAttr.prefix?newAttr.localName:'']
  1325. }
  1326. }
  1327. function _onUpdateChild(doc,el,newChild){
  1328. if(doc && doc._inc){
  1329. doc._inc++;
  1330. //update childNodes
  1331. var cs = el.childNodes;
  1332. if(newChild){
  1333. cs[cs.length++] = newChild;
  1334. }else{
  1335. //console.log(1)
  1336. var child = el.firstChild;
  1337. var i = 0;
  1338. while(child){
  1339. cs[i++] = child;
  1340. child =child.nextSibling;
  1341. }
  1342. cs.length = i;
  1343. }
  1344. }
  1345. }
  1346. /**
  1347. * attributes;
  1348. * children;
  1349. *
  1350. * writeable properties:
  1351. * nodeValue,Attr:value,CharacterData:data
  1352. * prefix
  1353. */
  1354. function _removeChild(parentNode,child){
  1355. var previous = child.previousSibling;
  1356. var next = child.nextSibling;
  1357. if(previous){
  1358. previous.nextSibling = next;
  1359. }else{
  1360. parentNode.firstChild = next
  1361. }
  1362. if(next){
  1363. next.previousSibling = previous;
  1364. }else{
  1365. parentNode.lastChild = previous;
  1366. }
  1367. _onUpdateChild(parentNode.ownerDocument,parentNode);
  1368. return child;
  1369. }
  1370. /**
  1371. * preformance key(refChild == null)
  1372. */
  1373. function _insertBefore(parentNode,newChild,nextChild){
  1374. var cp = newChild.parentNode;
  1375. if(cp){
  1376. cp.removeChild(newChild);//remove and update
  1377. }
  1378. if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
  1379. var newFirst = newChild.firstChild;
  1380. if (newFirst == null) {
  1381. return newChild;
  1382. }
  1383. var newLast = newChild.lastChild;
  1384. }else{
  1385. newFirst = newLast = newChild;
  1386. }
  1387. var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
  1388. newFirst.previousSibling = pre;
  1389. newLast.nextSibling = nextChild;
  1390. if(pre){
  1391. pre.nextSibling = newFirst;
  1392. }else{
  1393. parentNode.firstChild = newFirst;
  1394. }
  1395. if(nextChild == null){
  1396. parentNode.lastChild = newLast;
  1397. }else{
  1398. nextChild.previousSibling = newLast;
  1399. }
  1400. do{
  1401. newFirst.parentNode = parentNode;
  1402. }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
  1403. _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
  1404. //console.log(parentNode.lastChild.nextSibling == null)
  1405. if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
  1406. newChild.firstChild = newChild.lastChild = null;
  1407. }
  1408. return newChild;
  1409. }
  1410. function _appendSingleChild(parentNode,newChild){
  1411. var cp = newChild.parentNode;
  1412. if(cp){
  1413. var pre = parentNode.lastChild;
  1414. cp.removeChild(newChild);//remove and update
  1415. var pre = parentNode.lastChild;
  1416. }
  1417. var pre = parentNode.lastChild;
  1418. newChild.parentNode = parentNode;
  1419. newChild.previousSibling = pre;
  1420. newChild.nextSibling = null;
  1421. if(pre){
  1422. pre.nextSibling = newChild;
  1423. }else{
  1424. parentNode.firstChild = newChild;
  1425. }
  1426. parentNode.lastChild = newChild;
  1427. _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
  1428. return newChild;
  1429. //console.log("__aa",parentNode.lastChild.nextSibling == null)
  1430. }
  1431. Document.prototype = {
  1432. //implementation : null,
  1433. nodeName : '#document',
  1434. nodeType : DOCUMENT_NODE,
  1435. doctype : null,
  1436. documentElement : null,
  1437. _inc : 1,
  1438. insertBefore : function(newChild, refChild){//raises
  1439. if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
  1440. var child = newChild.firstChild;
  1441. while(child){
  1442. var next = child.nextSibling;
  1443. this.insertBefore(child,refChild);
  1444. child = next;
  1445. }
  1446. return newChild;
  1447. }
  1448. if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
  1449. this.documentElement = newChild;
  1450. }
  1451. return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
  1452. },
  1453. removeChild : function(oldChild){
  1454. if(this.documentElement == oldChild){
  1455. this.documentElement = null;
  1456. }
  1457. return _removeChild(this,oldChild);
  1458. },
  1459. // Introduced in DOM Level 2:
  1460. importNode : function(importedNode,deep){
  1461. return importNode(this,importedNode,deep);
  1462. },
  1463. // Introduced in DOM Level 2:
  1464. getElementById : function(id){
  1465. var rtv = null;
  1466. _visitNode(this.documentElement,function(node){
  1467. if(node.nodeType == ELEMENT_NODE){
  1468. if(node.getAttribute('id') == id){
  1469. rtv = node;
  1470. return true;
  1471. }
  1472. }
  1473. })
  1474. return rtv;
  1475. },
  1476. //document factory method:
  1477. createElement : function(tagName){
  1478. var node = new Element();
  1479. node.ownerDocument = this;
  1480. node.nodeName = tagName;
  1481. node.tagName = tagName;
  1482. node.childNodes = new NodeList();
  1483. var attrs = node.attributes = new NamedNodeMap();
  1484. attrs._ownerElement = node;
  1485. return node;
  1486. },
  1487. createDocumentFragment : function(){
  1488. var node = new DocumentFragment();
  1489. node.ownerDocument = this;
  1490. node.childNodes = new NodeList();
  1491. return node;
  1492. },
  1493. createTextNode : function(data){
  1494. var node = new Text();
  1495. node.ownerDocument = this;
  1496. node.appendData(data)
  1497. return node;
  1498. },
  1499. createComment : function(data){
  1500. var node = new Comment();
  1501. node.ownerDocument = this;
  1502. node.appendData(data)
  1503. return node;
  1504. },
  1505. createCDATASection : function(data){
  1506. var node = new CDATASection();
  1507. node.ownerDocument = this;
  1508. node.appendData(data)
  1509. return node;
  1510. },
  1511. createProcessingInstruction : function(target,data){
  1512. var node = new ProcessingInstruction();
  1513. node.ownerDocument = this;
  1514. node.tagName = node.target = target;
  1515. node.nodeValue= node.data = data;
  1516. return node;
  1517. },
  1518. createAttribute : function(name){
  1519. var node = new Attr();
  1520. node.ownerDocument = this;
  1521. node.name = name;
  1522. node.nodeName = name;
  1523. node.localName = name;
  1524. node.specified = true;
  1525. return node;
  1526. },
  1527. createEntityReference : function(name){
  1528. var node = new EntityReference();
  1529. node.ownerDocument = this;
  1530. node.nodeName = name;
  1531. return node;
  1532. },
  1533. // Introduced in DOM Level 2:
  1534. createElementNS : function(namespaceURI,qualifiedName){
  1535. var node = new Element();
  1536. var pl = qualifiedName.split(':');
  1537. var attrs = node.attributes = new NamedNodeMap();
  1538. node.childNodes = new NodeList();
  1539. node.ownerDocument = this;
  1540. node.nodeName = qualifiedName;
  1541. node.tagName = qualifiedName;
  1542. node.namespaceURI = namespaceURI;
  1543. if(pl.length == 2){
  1544. node.prefix = pl[0];
  1545. node.localName = pl[1];
  1546. }else{
  1547. //el.prefix = null;
  1548. node.localName = qualifiedName;
  1549. }
  1550. attrs._ownerElement = node;
  1551. return node;
  1552. },
  1553. // Introduced in DOM Level 2:
  1554. createAttributeNS : function(namespaceURI,qualifiedName){
  1555. var node = new Attr();
  1556. var pl = qualifiedName.split(':');
  1557. node.ownerDocument = this;
  1558. node.nodeName = qualifiedName;
  1559. node.name = qualifiedName;
  1560. node.namespaceURI = namespaceURI;
  1561. node.specified = true;
  1562. if(pl.length == 2){
  1563. node.prefix = pl[0];
  1564. node.localName = pl[1];
  1565. }else{
  1566. //el.prefix = null;
  1567. node.localName = qualifiedName;
  1568. }
  1569. return node;
  1570. }
  1571. };
  1572. _extends(Document,Node);
  1573. function Element() {
  1574. this._nsMap = {};
  1575. };
  1576. Element.prototype = {
  1577. nodeType : ELEMENT_NODE,
  1578. hasAttribute : function(name){
  1579. return this.getAttributeNode(name)!=null;
  1580. },
  1581. getAttribute : function(name){
  1582. var attr = this.getAttributeNode(name);
  1583. return attr && attr.value || '';
  1584. },
  1585. getAttributeNode : function(name){
  1586. return this.attributes.getNamedItem(name);
  1587. },
  1588. setAttribute : function(name, value){
  1589. var attr = this.ownerDocument.createAttribute(name);
  1590. attr.value = attr.nodeValue = "" + value;
  1591. this.setAttributeNode(attr)
  1592. },
  1593. removeAttribute : function(name){
  1594. var attr = this.getAttributeNode(name)
  1595. attr && this.removeAttributeNode(attr);
  1596. },
  1597. //four real opeartion method
  1598. appendChild:function(newChild){
  1599. if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
  1600. return this.insertBefore(newChild,null);
  1601. }else{
  1602. return _appendSingleChild(this,newChild);
  1603. }
  1604. },
  1605. setAttributeNode : function(newAttr){
  1606. return this.attributes.setNamedItem(newAttr);
  1607. },
  1608. setAttributeNodeNS : function(newAttr){
  1609. return this.attributes.setNamedItemNS(newAttr);
  1610. },
  1611. removeAttributeNode : function(oldAttr){
  1612. //console.log(this == oldAttr.ownerElement)
  1613. return this.attributes.removeNamedItem(oldAttr.nodeName);
  1614. },
  1615. //get real attribute name,and remove it by removeAttributeNode
  1616. removeAttributeNS : function(namespaceURI, localName){
  1617. var old = this.getAttributeNodeNS(namespaceURI, localName);
  1618. old && this.removeAttributeNode(old);
  1619. },
  1620. hasAttributeNS : function(namespaceURI, localName){
  1621. return this.getAttributeNodeNS(namespaceURI, localName)!=null;
  1622. },
  1623. getAttributeNS : function(namespaceURI, localName){
  1624. var attr = this.getAttributeNodeNS(namespaceURI, localName);
  1625. return attr && attr.value || '';
  1626. },
  1627. setAttributeNS : function(namespaceURI, qualifiedName, value){
  1628. var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
  1629. attr.value = attr.nodeValue = "" + value;
  1630. this.setAttributeNode(attr)
  1631. },
  1632. getAttributeNodeNS : function(namespaceURI, localName){
  1633. return this.attributes.getNamedItemNS(namespaceURI, localName);
  1634. },
  1635. getElementsByTagName : function(tagName){
  1636. return new LiveNodeList(this,function(base){
  1637. var ls = [];
  1638. _visitNode(base,function(node){
  1639. if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
  1640. ls.push(node);
  1641. }
  1642. });
  1643. return ls;
  1644. });
  1645. },
  1646. getElementsByTagNameNS : function(namespaceURI, localName){
  1647. return new LiveNodeList(this,function(base){
  1648. var ls = [];
  1649. _visitNode(base,function(node){
  1650. if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
  1651. ls.push(node);
  1652. }
  1653. });
  1654. return ls;
  1655. });
  1656. }
  1657. };
  1658. Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
  1659. Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
  1660. _extends(Element,Node);
  1661. function Attr() {
  1662. };
  1663. Attr.prototype.nodeType = ATTRIBUTE_NODE;
  1664. _extends(Attr,Node);
  1665. function CharacterData() {
  1666. };
  1667. CharacterData.prototype = {
  1668. data : '',
  1669. substringData : function(offset, count) {
  1670. return this.data.substring(offset, offset+count);
  1671. },
  1672. appendData: function(text) {
  1673. text = this.data+text;
  1674. this.nodeValue = this.data = text;
  1675. this.length = text.length;
  1676. },
  1677. insertData: function(offset,text) {
  1678. this.replaceData(offset,0,text);
  1679. },
  1680. appendChild:function(newChild){
  1681. throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
  1682. },
  1683. deleteData: function(offset, count) {
  1684. this.replaceData(offset,count,"");
  1685. },
  1686. replaceData: function(offset, count, text) {
  1687. var start = this.data.substring(0,offset);
  1688. var end = this.data.substring(offset+count);
  1689. text = start + text + end;
  1690. this.nodeValue = this.data = text;
  1691. this.length = text.length;
  1692. }
  1693. }
  1694. _extends(CharacterData,Node);
  1695. function Text() {
  1696. };
  1697. Text.prototype = {
  1698. nodeName : "#text",
  1699. nodeType : TEXT_NODE,
  1700. splitText : function(offset) {
  1701. var text = this.data;
  1702. var newText = text.substring(offset);
  1703. text = text.substring(0, offset);
  1704. this.data = this.nodeValue = text;
  1705. this.length = text.length;
  1706. var newNode = this.ownerDocument.createTextNode(newText);
  1707. if(this.parentNode){
  1708. this.parentNode.insertBefore(newNode, this.nextSibling);
  1709. }
  1710. return newNode;
  1711. }
  1712. }
  1713. _extends(Text,CharacterData);
  1714. function Comment() {
  1715. };
  1716. Comment.prototype = {
  1717. nodeName : "#comment",
  1718. nodeType : COMMENT_NODE
  1719. }
  1720. _extends(Comment,CharacterData);
  1721. function CDATASection() {
  1722. };
  1723. CDATASection.prototype = {
  1724. nodeName : "#cdata-section",
  1725. nodeType : CDATA_SECTION_NODE
  1726. }
  1727. _extends(CDATASection,CharacterData);
  1728. function DocumentType() {
  1729. };
  1730. DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
  1731. _extends(DocumentType,Node);
  1732. function Notation() {
  1733. };
  1734. Notation.prototype.nodeType = NOTATION_NODE;
  1735. _extends(Notation,Node);
  1736. function Entity() {
  1737. };
  1738. Entity.prototype.nodeType = ENTITY_NODE;
  1739. _extends(Entity,Node);
  1740. function EntityReference() {
  1741. };
  1742. EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
  1743. _extends(EntityReference,Node);
  1744. function DocumentFragment() {
  1745. };
  1746. DocumentFragment.prototype.nodeName = "#document-fragment";
  1747. DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
  1748. _extends(DocumentFragment,Node);
  1749. function ProcessingInstruction() {
  1750. }
  1751. ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
  1752. _extends(ProcessingInstruction,Node);
  1753. function XMLSerializer(){}
  1754. XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
  1755. return nodeSerializeToString.call(node,isHtml,nodeFilter);
  1756. }
  1757. Node.prototype.toString = nodeSerializeToString;
  1758. function nodeSerializeToString(isHtml,nodeFilter){
  1759. var buf = [];
  1760. var refNode = this.nodeType == 9?this.documentElement:this;
  1761. var prefix = refNode.prefix;
  1762. var uri = refNode.namespaceURI;
  1763. if(uri && prefix == null){
  1764. //console.log(prefix)
  1765. var prefix = refNode.lookupPrefix(uri);
  1766. if(prefix == null){
  1767. //isHTML = true;
  1768. var visibleNamespaces=[
  1769. {namespace:uri,prefix:null}
  1770. //{namespace:uri,prefix:''}
  1771. ]
  1772. }
  1773. }
  1774. serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
  1775. //console.log('###',this.nodeType,uri,prefix,buf.join(''))
  1776. return buf.join('');
  1777. }
  1778. function needNamespaceDefine(node,isHTML, visibleNamespaces) {
  1779. var prefix = node.prefix||'';
  1780. var uri = node.namespaceURI;
  1781. if (!prefix && !uri){
  1782. return false;
  1783. }
  1784. if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
  1785. || uri == 'http://www.w3.org/2000/xmlns/'){
  1786. return false;
  1787. }
  1788. var i = visibleNamespaces.length
  1789. //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
  1790. while (i--) {
  1791. var ns = visibleNamespaces[i];
  1792. // get namespace prefix
  1793. //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
  1794. if (ns.prefix == prefix){
  1795. return ns.namespace != uri;
  1796. }
  1797. }
  1798. //console.log(isHTML,uri,prefix=='')
  1799. //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
  1800. // return false;
  1801. //}
  1802. //node.flag = '11111'
  1803. //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
  1804. return true;
  1805. }
  1806. function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
  1807. if(nodeFilter){
  1808. node = nodeFilter(node);
  1809. if(node){
  1810. if(typeof node == 'string'){
  1811. buf.push(node);
  1812. return;
  1813. }
  1814. }else{
  1815. return;
  1816. }
  1817. //buf.sort.apply(attrs, attributeSorter);
  1818. }
  1819. switch(node.nodeType){
  1820. case ELEMENT_NODE:
  1821. if (!visibleNamespaces) visibleNamespaces = [];
  1822. var startVisibleNamespaces = visibleNamespaces.length;
  1823. var attrs = node.attributes;
  1824. var len = attrs.length;
  1825. var child = node.firstChild;
  1826. var nodeName = node.tagName;
  1827. isHTML = (htmlns === node.namespaceURI) ||isHTML
  1828. buf.push('<',nodeName);
  1829. for(var i=0;i<len;i++){
  1830. // add namespaces for attributes
  1831. var attr = attrs.item(i);
  1832. if (attr.prefix == 'xmlns') {
  1833. visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
  1834. }else if(attr.nodeName == 'xmlns'){
  1835. visibleNamespaces.push({ prefix: '', namespace: attr.value });
  1836. }
  1837. }
  1838. for(var i=0;i<len;i++){
  1839. var attr = attrs.item(i);
  1840. if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
  1841. var prefix = attr.prefix||'';
  1842. var uri = attr.namespaceURI;
  1843. var ns = prefix ? ' xmlns:' + prefix : " xmlns";
  1844. buf.push(ns, '="' , uri , '"');
  1845. visibleNamespaces.push({ prefix: prefix, namespace:uri });
  1846. }
  1847. serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
  1848. }
  1849. // add namespace for current node
  1850. if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
  1851. var prefix = node.prefix||'';
  1852. var uri = node.namespaceURI;
  1853. var ns = prefix ? ' xmlns:' + prefix : " xmlns";
  1854. buf.push(ns, '="' , uri , '"');
  1855. visibleNamespaces.push({ prefix: prefix, namespace:uri });
  1856. }
  1857. if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
  1858. buf.push('>');
  1859. //if is cdata child node
  1860. if(isHTML && /^script$/i.test(nodeName)){
  1861. while(child){
  1862. if(child.data){
  1863. buf.push(child.data);
  1864. }else{
  1865. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1866. }
  1867. child = child.nextSibling;
  1868. }
  1869. }else
  1870. {
  1871. while(child){
  1872. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1873. child = child.nextSibling;
  1874. }
  1875. }
  1876. buf.push('</',nodeName,'>');
  1877. }else{
  1878. buf.push('/>');
  1879. }
  1880. // remove added visible namespaces
  1881. //visibleNamespaces.length = startVisibleNamespaces;
  1882. return;
  1883. case DOCUMENT_NODE:
  1884. case DOCUMENT_FRAGMENT_NODE:
  1885. var child = node.firstChild;
  1886. while(child){
  1887. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1888. child = child.nextSibling;
  1889. }
  1890. return;
  1891. case ATTRIBUTE_NODE:
  1892. return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
  1893. case TEXT_NODE:
  1894. return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
  1895. case CDATA_SECTION_NODE:
  1896. return buf.push( '<![CDATA[',node.data,']]>');
  1897. case COMMENT_NODE:
  1898. return buf.push( "<!--",node.data,"-->");
  1899. case DOCUMENT_TYPE_NODE:
  1900. var pubid = node.publicId;
  1901. var sysid = node.systemId;
  1902. buf.push('<!DOCTYPE ',node.name);
  1903. if(pubid){
  1904. buf.push(' PUBLIC "',pubid);
  1905. if (sysid && sysid!='.') {
  1906. buf.push( '" "',sysid);
  1907. }
  1908. buf.push('">');
  1909. }else if(sysid && sysid!='.'){
  1910. buf.push(' SYSTEM "',sysid,'">');
  1911. }else{
  1912. var sub = node.internalSubset;
  1913. if(sub){
  1914. buf.push(" [",sub,"]");
  1915. }
  1916. buf.push(">");
  1917. }
  1918. return;
  1919. case PROCESSING_INSTRUCTION_NODE:
  1920. return buf.push( "<?",node.target," ",node.data,"?>");
  1921. case ENTITY_REFERENCE_NODE:
  1922. return buf.push( '&',node.nodeName,';');
  1923. //case ENTITY_NODE:
  1924. //case NOTATION_NODE:
  1925. default:
  1926. buf.push('??',node.nodeName);
  1927. }
  1928. }
  1929. function importNode(doc,node,deep){
  1930. var node2;
  1931. switch (node.nodeType) {
  1932. case ELEMENT_NODE:
  1933. node2 = node.cloneNode(false);
  1934. node2.ownerDocument = doc;
  1935. //var attrs = node2.attributes;
  1936. //var len = attrs.length;
  1937. //for(var i=0;i<len;i++){
  1938. //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
  1939. //}
  1940. case DOCUMENT_FRAGMENT_NODE:
  1941. break;
  1942. case ATTRIBUTE_NODE:
  1943. deep = true;
  1944. break;
  1945. //case ENTITY_REFERENCE_NODE:
  1946. //case PROCESSING_INSTRUCTION_NODE:
  1947. ////case TEXT_NODE:
  1948. //case CDATA_SECTION_NODE:
  1949. //case COMMENT_NODE:
  1950. // deep = false;
  1951. // break;
  1952. //case DOCUMENT_NODE:
  1953. //case DOCUMENT_TYPE_NODE:
  1954. //cannot be imported.
  1955. //case ENTITY_NODE:
  1956. //case NOTATION_NODE:
  1957. //can not hit in level3
  1958. //default:throw e;
  1959. }
  1960. if(!node2){
  1961. node2 = node.cloneNode(false);//false
  1962. }
  1963. node2.ownerDocument = doc;
  1964. node2.parentNode = null;
  1965. if(deep){
  1966. var child = node.firstChild;
  1967. while(child){
  1968. node2.appendChild(importNode(doc,child,deep));
  1969. child = child.nextSibling;
  1970. }
  1971. }
  1972. return node2;
  1973. }
  1974. //
  1975. //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
  1976. // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
  1977. function cloneNode(doc,node,deep){
  1978. var node2 = new node.constructor();
  1979. for(var n in node){
  1980. var v = node[n];
  1981. if(typeof v != 'object' ){
  1982. if(v != node2[n]){
  1983. node2[n] = v;
  1984. }
  1985. }
  1986. }
  1987. if(node.childNodes){
  1988. node2.childNodes = new NodeList();
  1989. }
  1990. node2.ownerDocument = doc;
  1991. switch (node2.nodeType) {
  1992. case ELEMENT_NODE:
  1993. var attrs = node.attributes;
  1994. var attrs2 = node2.attributes = new NamedNodeMap();
  1995. var len = attrs.length
  1996. attrs2._ownerElement = node2;
  1997. for(var i=0;i<len;i++){
  1998. node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
  1999. }
  2000. break;;
  2001. case ATTRIBUTE_NODE:
  2002. deep = true;
  2003. }
  2004. if(deep){
  2005. var child = node.firstChild;
  2006. while(child){
  2007. node2.appendChild(cloneNode(doc,child,deep));
  2008. child = child.nextSibling;
  2009. }
  2010. }
  2011. return node2;
  2012. }
  2013. function __set__(object,key,value){
  2014. object[key] = value
  2015. }
  2016. //do dynamic
  2017. try{
  2018. if(Object.defineProperty){
  2019. Object.defineProperty(LiveNodeList.prototype,'length',{
  2020. get:function(){
  2021. _updateLiveList(this);
  2022. return this.$$length;
  2023. }
  2024. });
  2025. Object.defineProperty(Node.prototype,'textContent',{
  2026. get:function(){
  2027. return getTextContent(this);
  2028. },
  2029. set:function(data){
  2030. switch(this.nodeType){
  2031. case ELEMENT_NODE:
  2032. case DOCUMENT_FRAGMENT_NODE:
  2033. while(this.firstChild){
  2034. this.removeChild(this.firstChild);
  2035. }
  2036. if(data || String(data)){
  2037. this.appendChild(this.ownerDocument.createTextNode(data));
  2038. }
  2039. break;
  2040. default:
  2041. //TODO:
  2042. this.data = data;
  2043. this.value = data;
  2044. this.nodeValue = data;
  2045. }
  2046. }
  2047. })
  2048. function getTextContent(node){
  2049. switch(node.nodeType){
  2050. case ELEMENT_NODE:
  2051. case DOCUMENT_FRAGMENT_NODE:
  2052. var buf = [];
  2053. node = node.firstChild;
  2054. while(node){
  2055. if(node.nodeType!==7 && node.nodeType !==8){
  2056. buf.push(getTextContent(node));
  2057. }
  2058. node = node.nextSibling;
  2059. }
  2060. return buf.join('');
  2061. default:
  2062. return node.nodeValue;
  2063. }
  2064. }
  2065. __set__ = function(object,key,value){
  2066. //console.log(value)
  2067. object['$$'+key] = value
  2068. }
  2069. }
  2070. }catch(e){//ie8
  2071. }
  2072. //if(typeof require == 'function'){
  2073. exports.DOMImplementation = DOMImplementation;
  2074. exports.XMLSerializer = XMLSerializer;
  2075. //}
  2076. /***/ }),
  2077. /* 3 */
  2078. /***/ (function(module, exports) {
  2079. var initEvent = function (cos) {
  2080. var listeners = {};
  2081. var getList = function (action) {
  2082. !listeners[action] && (listeners[action] = []);
  2083. return listeners[action];
  2084. };
  2085. cos.on = function (action, callback) {
  2086. if (action === 'task-list-update') {
  2087. console.warn('warning: Event "' + action + '" has been deprecated. Please use "list-update" instead.');
  2088. }
  2089. getList(action).push(callback);
  2090. };
  2091. cos.off = function (action, callback) {
  2092. var list = getList(action);
  2093. for (var i = list.length - 1; i >= 0; i--) {
  2094. callback === list[i] && list.splice(i, 1);
  2095. }
  2096. };
  2097. cos.emit = function (action, data) {
  2098. var list = getList(action).map(function (cb) {
  2099. return cb;
  2100. });
  2101. for (var i = 0; i < list.length; i++) {
  2102. list[i](data);
  2103. }
  2104. };
  2105. };
  2106. var EventProxy = function () {
  2107. initEvent(this);
  2108. };
  2109. module.exports.init = initEvent;
  2110. module.exports.EventProxy = EventProxy;
  2111. /***/ }),
  2112. /* 4 */
  2113. /***/ (function(module, exports, __webpack_require__) {
  2114. var util = __webpack_require__(0);
  2115. // 按照文件特征值,缓存 UploadId
  2116. var cacheKey = 'cos_sdk_upload_cache';
  2117. var expires = 30 * 24 * 3600;
  2118. var cache;
  2119. var timer;
  2120. var getCache = function () {
  2121. try {
  2122. var val = JSON.parse(localStorage.getItem(cacheKey));
  2123. } catch (e) {}
  2124. if (!val) val = [];
  2125. cache = val;
  2126. };
  2127. var setCache = function () {
  2128. try {
  2129. localStorage.setItem(cacheKey, JSON.stringify(cache));
  2130. } catch (e) {}
  2131. };
  2132. var init = function () {
  2133. if (cache) return;
  2134. getCache.call(this);
  2135. // 清理太老旧的数据
  2136. var changed = false;
  2137. var now = Math.round(Date.now() / 1000);
  2138. for (var i = cache.length - 1; i >= 0; i--) {
  2139. var mtime = cache[i][2];
  2140. if (!mtime || mtime + expires < now) {
  2141. cache.splice(i, 1);
  2142. changed = true;
  2143. }
  2144. }
  2145. changed && setCache();
  2146. };
  2147. // 把缓存存到本地
  2148. var save = function () {
  2149. if (timer) return;
  2150. timer = setTimeout(function () {
  2151. setCache();
  2152. timer = null;
  2153. }, 400);
  2154. };
  2155. var mod = {
  2156. using: {},
  2157. // 标记 UploadId 正在使用
  2158. setUsing: function (uuid) {
  2159. mod.using[uuid] = true;
  2160. },
  2161. // 标记 UploadId 已经没在使用
  2162. removeUsing: function (uuid) {
  2163. delete mod.using[uuid];
  2164. },
  2165. // 用上传参数生成哈希值
  2166. getFileId: function (file, ChunkSize, Bucket, Key) {
  2167. if (file.name && file.size && file.lastModifiedDate && ChunkSize) {
  2168. return util.md5([file.name, file.size, file.lastModifiedDate, ChunkSize, Bucket, Key].join('::'));
  2169. } else {
  2170. return null;
  2171. }
  2172. },
  2173. // 获取文件对应的 UploadId 列表
  2174. getUploadIdList: function (uuid) {
  2175. if (!uuid) return null;
  2176. init.call(this);
  2177. var list = [];
  2178. for (var i = 0; i < cache.length; i++) {
  2179. if (cache[i][0] === uuid) list.push(cache[i][1]);
  2180. }
  2181. return list.length ? list : null;
  2182. },
  2183. // 缓存 UploadId
  2184. saveUploadId: function (uuid, UploadId, limit) {
  2185. init.call(this);
  2186. if (!uuid) return;
  2187. // 清理没用的 UploadId,js 文件没有 FilePath ,只清理相同记录
  2188. for (var i = cache.length - 1; i >= 0; i--) {
  2189. var item = cache[i];
  2190. if (item[0] === uuid && item[1] === UploadId) {
  2191. cache.splice(i, 1);
  2192. }
  2193. }
  2194. cache.unshift([uuid, UploadId, Math.round(Date.now() / 1000)]);
  2195. if (cache.length > limit) cache.splice(limit);
  2196. save();
  2197. },
  2198. // UploadId 已用完,移除掉
  2199. removeUploadId: function (UploadId) {
  2200. init.call(this);
  2201. delete mod.using[UploadId];
  2202. for (var i = cache.length - 1; i >= 0; i--) {
  2203. if (cache[i][1] === UploadId) cache.splice(i, 1);
  2204. }
  2205. save();
  2206. }
  2207. };
  2208. module.exports = mod;
  2209. /***/ }),
  2210. /* 5 */
  2211. /***/ (function(module, exports, __webpack_require__) {
  2212. var COS = __webpack_require__(6);
  2213. module.exports = COS;
  2214. /***/ }),
  2215. /* 6 */
  2216. /***/ (function(module, exports, __webpack_require__) {
  2217. "use strict";
  2218. var util = __webpack_require__(0);
  2219. var event = __webpack_require__(3);
  2220. var task = __webpack_require__(15);
  2221. var base = __webpack_require__(16);
  2222. var advance = __webpack_require__(18);
  2223. var defaultOptions = {
  2224. AppId: '', // AppId 已废弃,请拼接到 Bucket 后传入,例如:test-1250000000
  2225. SecretId: '',
  2226. SecretKey: '',
  2227. SecurityToken: '', // 使用临时密钥需要注意自行刷新 Token
  2228. ChunkRetryTimes: 2,
  2229. FileParallelLimit: 3,
  2230. ChunkParallelLimit: 3,
  2231. ChunkSize: 1024 * 1024,
  2232. SliceSize: 1024 * 1024,
  2233. CopyChunkParallelLimit: 20,
  2234. CopyChunkSize: 1024 * 1024 * 10,
  2235. CopySliceSize: 1024 * 1024 * 10,
  2236. MaxPartNumber: 10000,
  2237. ProgressInterval: 1000,
  2238. Domain: '',
  2239. ServiceDomain: '',
  2240. Protocol: '',
  2241. CompatibilityMode: false,
  2242. ForcePathStyle: false,
  2243. UseRawKey: false,
  2244. Timeout: 0, // 单位毫秒,0 代表不设置超时时间
  2245. CorrectClockSkew: true,
  2246. SystemClockOffset: 0, // 单位毫秒,ms
  2247. UploadCheckContentMd5: false,
  2248. UploadQueueSize: 10000,
  2249. UploadAddMetaMd5: false,
  2250. UploadIdCacheLimit: 50,
  2251. UseAccelerate: false
  2252. };
  2253. // 对外暴露的类
  2254. var COS = function (options) {
  2255. this.options = util.extend(util.clone(defaultOptions), options || {});
  2256. this.options.FileParallelLimit = Math.max(1, this.options.FileParallelLimit);
  2257. this.options.ChunkParallelLimit = Math.max(1, this.options.ChunkParallelLimit);
  2258. this.options.ChunkRetryTimes = Math.max(0, this.options.ChunkRetryTimes);
  2259. this.options.ChunkSize = Math.max(1024 * 1024, this.options.ChunkSize);
  2260. this.options.CopyChunkParallelLimit = Math.max(1, this.options.CopyChunkParallelLimit);
  2261. this.options.CopyChunkSize = Math.max(1024 * 1024, this.options.CopyChunkSize);
  2262. this.options.CopySliceSize = Math.max(0, this.options.CopySliceSize);
  2263. this.options.MaxPartNumber = Math.max(1024, Math.min(10000, this.options.MaxPartNumber));
  2264. this.options.Timeout = Math.max(0, this.options.Timeout);
  2265. if (this.options.AppId) {
  2266. console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: "test-1250000000").');
  2267. }
  2268. if (util.isNode()) {
  2269. console.warn('warning: cos-js-sdk-v5 不支持 nodejs 环境使用,请改用 cos-nodejs-sdk-v5,参考文档: https://cloud.tencent.com/document/product/436/8629');
  2270. console.warn('warning: cos-js-sdk-v5 does not support nodejs environment. Please use cos-nodejs-sdk-v5 instead. See: https://cloud.tencent.com/document/product/436/8629');
  2271. }
  2272. event.init(this);
  2273. task.init(this);
  2274. };
  2275. base.init(COS, task);
  2276. advance.init(COS, task);
  2277. COS.util = {
  2278. md5: util.md5,
  2279. xml2json: util.xml2json,
  2280. json2xml: util.json2xml
  2281. };
  2282. COS.getAuthorization = util.getAuth;
  2283. COS.version = '1.3.1';
  2284. module.exports = COS;
  2285. /***/ }),
  2286. /* 7 */
  2287. /***/ (function(module, exports, __webpack_require__) {
  2288. /* WEBPACK VAR INJECTION */(function(process, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/* https://github.com/emn178/js-md5 */
  2289. (function () {
  2290. 'use strict';
  2291. var ERROR = 'input is invalid type';
  2292. var WINDOW = typeof window === 'object';
  2293. var root = WINDOW ? window : {};
  2294. if (root.JS_MD5_NO_WINDOW) {
  2295. WINDOW = false;
  2296. }
  2297. var WEB_WORKER = !WINDOW && typeof self === 'object';
  2298. var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
  2299. if (NODE_JS) {
  2300. root = global;
  2301. } else if (WEB_WORKER) {
  2302. root = self;
  2303. }
  2304. var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports;
  2305. var AMD = "function" === 'function' && __webpack_require__(9);
  2306. var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
  2307. var HEX_CHARS = '0123456789abcdef'.split('');
  2308. var EXTRA = [128, 32768, 8388608, -2147483648];
  2309. var SHIFT = [0, 8, 16, 24];
  2310. var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64'];
  2311. var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
  2312. var blocks = [],
  2313. buffer8;
  2314. if (ARRAY_BUFFER) {
  2315. var buffer = new ArrayBuffer(68);
  2316. buffer8 = new Uint8Array(buffer);
  2317. blocks = new Uint32Array(buffer);
  2318. }
  2319. if (root.JS_MD5_NO_NODE_JS || !Array.isArray) {
  2320. Array.isArray = function (obj) {
  2321. return Object.prototype.toString.call(obj) === '[object Array]';
  2322. };
  2323. }
  2324. if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
  2325. ArrayBuffer.isView = function (obj) {
  2326. return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
  2327. };
  2328. }
  2329. /**
  2330. * @method hex
  2331. * @memberof md5
  2332. * @description Output hash as hex string
  2333. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2334. * @returns {String} Hex string
  2335. * @example
  2336. * md5.hex('The quick brown fox jumps over the lazy dog');
  2337. * // equal to
  2338. * md5('The quick brown fox jumps over the lazy dog');
  2339. */
  2340. /**
  2341. * @method digest
  2342. * @memberof md5
  2343. * @description Output hash as bytes array
  2344. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2345. * @returns {Array} Bytes array
  2346. * @example
  2347. * md5.digest('The quick brown fox jumps over the lazy dog');
  2348. */
  2349. /**
  2350. * @method array
  2351. * @memberof md5
  2352. * @description Output hash as bytes array
  2353. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2354. * @returns {Array} Bytes array
  2355. * @example
  2356. * md5.array('The quick brown fox jumps over the lazy dog');
  2357. */
  2358. /**
  2359. * @method arrayBuffer
  2360. * @memberof md5
  2361. * @description Output hash as ArrayBuffer
  2362. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2363. * @returns {ArrayBuffer} ArrayBuffer
  2364. * @example
  2365. * md5.arrayBuffer('The quick brown fox jumps over the lazy dog');
  2366. */
  2367. /**
  2368. * @method buffer
  2369. * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
  2370. * @memberof md5
  2371. * @description Output hash as ArrayBuffer
  2372. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2373. * @returns {ArrayBuffer} ArrayBuffer
  2374. * @example
  2375. * md5.buffer('The quick brown fox jumps over the lazy dog');
  2376. */
  2377. /**
  2378. * @method base64
  2379. * @memberof md5
  2380. * @description Output hash as base64 string
  2381. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2382. * @returns {String} base64 string
  2383. * @example
  2384. * md5.base64('The quick brown fox jumps over the lazy dog');
  2385. */
  2386. var createOutputMethod = function (outputType) {
  2387. return function (message, isBinStr) {
  2388. return new Md5(true).update(message, isBinStr)[outputType]();
  2389. };
  2390. };
  2391. /**
  2392. * @method create
  2393. * @memberof md5
  2394. * @description Create Md5 object
  2395. * @returns {Md5} Md5 object.
  2396. * @example
  2397. * var hash = md5.create();
  2398. */
  2399. /**
  2400. * @method update
  2401. * @memberof md5
  2402. * @description Create and update Md5 object
  2403. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2404. * @returns {Md5} Md5 object.
  2405. * @example
  2406. * var hash = md5.update('The quick brown fox jumps over the lazy dog');
  2407. * // equal to
  2408. * var hash = md5.create();
  2409. * hash.update('The quick brown fox jumps over the lazy dog');
  2410. */
  2411. var createMethod = function () {
  2412. var method = createOutputMethod('hex');
  2413. if (NODE_JS) {
  2414. method = nodeWrap(method);
  2415. }
  2416. method.getCtx = method.create = function () {
  2417. return new Md5();
  2418. };
  2419. method.update = function (message) {
  2420. return method.create().update(message);
  2421. };
  2422. for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
  2423. var type = OUTPUT_TYPES[i];
  2424. method[type] = createOutputMethod(type);
  2425. }
  2426. return method;
  2427. };
  2428. var nodeWrap = function (method) {
  2429. var crypto = eval("require('crypto')");
  2430. var Buffer = eval("require('buffer').Buffer");
  2431. var nodeMethod = function (message) {
  2432. if (typeof message === 'string') {
  2433. return crypto.createHash('md5').update(message, 'utf8').digest('hex');
  2434. } else {
  2435. if (message === null || message === undefined) {
  2436. throw ERROR;
  2437. } else if (message.constructor === ArrayBuffer) {
  2438. message = new Uint8Array(message);
  2439. }
  2440. }
  2441. if (Array.isArray(message) || ArrayBuffer.isView(message) || message.constructor === Buffer) {
  2442. return crypto.createHash('md5').update(new Buffer(message)).digest('hex');
  2443. } else {
  2444. return method(message);
  2445. }
  2446. };
  2447. return nodeMethod;
  2448. };
  2449. /**
  2450. * Md5 class
  2451. * @class Md5
  2452. * @description This is internal class.
  2453. * @see {@link md5.create}
  2454. */
  2455. function Md5(sharedMemory) {
  2456. if (sharedMemory) {
  2457. blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  2458. this.blocks = blocks;
  2459. this.buffer8 = buffer8;
  2460. } else {
  2461. if (ARRAY_BUFFER) {
  2462. var buffer = new ArrayBuffer(68);
  2463. this.buffer8 = new Uint8Array(buffer);
  2464. this.blocks = new Uint32Array(buffer);
  2465. } else {
  2466. this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  2467. }
  2468. }
  2469. this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0;
  2470. this.finalized = this.hashed = false;
  2471. this.first = true;
  2472. }
  2473. /**
  2474. * @method update
  2475. * @memberof Md5
  2476. * @instance
  2477. * @description Update hash
  2478. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2479. * @returns {Md5} Md5 object.
  2480. * @see {@link md5.update}
  2481. */
  2482. Md5.prototype.update = function (message, isBinStr) {
  2483. if (this.finalized) {
  2484. return;
  2485. }
  2486. var code,
  2487. index = 0,
  2488. i,
  2489. length = message.length,
  2490. blocks = this.blocks;
  2491. var buffer8 = this.buffer8;
  2492. while (index < length) {
  2493. if (this.hashed) {
  2494. this.hashed = false;
  2495. blocks[0] = blocks[16];
  2496. blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  2497. }
  2498. if (ARRAY_BUFFER) {
  2499. for (i = this.start; index < length && i < 64; ++index) {
  2500. code = message.charCodeAt(index);
  2501. if (isBinStr || code < 0x80) {
  2502. buffer8[i++] = code;
  2503. } else if (code < 0x800) {
  2504. buffer8[i++] = 0xc0 | code >> 6;
  2505. buffer8[i++] = 0x80 | code & 0x3f;
  2506. } else if (code < 0xd800 || code >= 0xe000) {
  2507. buffer8[i++] = 0xe0 | code >> 12;
  2508. buffer8[i++] = 0x80 | code >> 6 & 0x3f;
  2509. buffer8[i++] = 0x80 | code & 0x3f;
  2510. } else {
  2511. code = 0x10000 + ((code & 0x3ff) << 10 | message.charCodeAt(++index) & 0x3ff);
  2512. buffer8[i++] = 0xf0 | code >> 18;
  2513. buffer8[i++] = 0x80 | code >> 12 & 0x3f;
  2514. buffer8[i++] = 0x80 | code >> 6 & 0x3f;
  2515. buffer8[i++] = 0x80 | code & 0x3f;
  2516. }
  2517. }
  2518. } else {
  2519. for (i = this.start; index < length && i < 64; ++index) {
  2520. code = message.charCodeAt(index);
  2521. if (isBinStr || code < 0x80) {
  2522. blocks[i >> 2] |= code << SHIFT[i++ & 3];
  2523. } else if (code < 0x800) {
  2524. blocks[i >> 2] |= (0xc0 | code >> 6) << SHIFT[i++ & 3];
  2525. blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
  2526. } else if (code < 0xd800 || code >= 0xe000) {
  2527. blocks[i >> 2] |= (0xe0 | code >> 12) << SHIFT[i++ & 3];
  2528. blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];
  2529. blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
  2530. } else {
  2531. code = 0x10000 + ((code & 0x3ff) << 10 | message.charCodeAt(++index) & 0x3ff);
  2532. blocks[i >> 2] |= (0xf0 | code >> 18) << SHIFT[i++ & 3];
  2533. blocks[i >> 2] |= (0x80 | code >> 12 & 0x3f) << SHIFT[i++ & 3];
  2534. blocks[i >> 2] |= (0x80 | code >> 6 & 0x3f) << SHIFT[i++ & 3];
  2535. blocks[i >> 2] |= (0x80 | code & 0x3f) << SHIFT[i++ & 3];
  2536. }
  2537. }
  2538. }
  2539. this.lastByteIndex = i;
  2540. this.bytes += i - this.start;
  2541. if (i >= 64) {
  2542. this.start = i - 64;
  2543. this.hash();
  2544. this.hashed = true;
  2545. } else {
  2546. this.start = i;
  2547. }
  2548. }
  2549. if (this.bytes > 4294967295) {
  2550. this.hBytes += this.bytes / 4294967296 << 0;
  2551. this.bytes = this.bytes % 4294967296;
  2552. }
  2553. return this;
  2554. };
  2555. Md5.prototype.finalize = function () {
  2556. if (this.finalized) {
  2557. return;
  2558. }
  2559. this.finalized = true;
  2560. var blocks = this.blocks,
  2561. i = this.lastByteIndex;
  2562. blocks[i >> 2] |= EXTRA[i & 3];
  2563. if (i >= 56) {
  2564. if (!this.hashed) {
  2565. this.hash();
  2566. }
  2567. blocks[0] = blocks[16];
  2568. blocks[16] = blocks[1] = blocks[2] = blocks[3] = blocks[4] = blocks[5] = blocks[6] = blocks[7] = blocks[8] = blocks[9] = blocks[10] = blocks[11] = blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
  2569. }
  2570. blocks[14] = this.bytes << 3;
  2571. blocks[15] = this.hBytes << 3 | this.bytes >>> 29;
  2572. this.hash();
  2573. };
  2574. Md5.prototype.hash = function () {
  2575. var a,
  2576. b,
  2577. c,
  2578. d,
  2579. bc,
  2580. da,
  2581. blocks = this.blocks;
  2582. if (this.first) {
  2583. a = blocks[0] - 680876937;
  2584. a = (a << 7 | a >>> 25) - 271733879 << 0;
  2585. d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708;
  2586. d = (d << 12 | d >>> 20) + a << 0;
  2587. c = (-271733879 ^ d & (a ^ -271733879)) + blocks[2] - 1126478375;
  2588. c = (c << 17 | c >>> 15) + d << 0;
  2589. b = (a ^ c & (d ^ a)) + blocks[3] - 1316259209;
  2590. b = (b << 22 | b >>> 10) + c << 0;
  2591. } else {
  2592. a = this.h0;
  2593. b = this.h1;
  2594. c = this.h2;
  2595. d = this.h3;
  2596. a += (d ^ b & (c ^ d)) + blocks[0] - 680876936;
  2597. a = (a << 7 | a >>> 25) + b << 0;
  2598. d += (c ^ a & (b ^ c)) + blocks[1] - 389564586;
  2599. d = (d << 12 | d >>> 20) + a << 0;
  2600. c += (b ^ d & (a ^ b)) + blocks[2] + 606105819;
  2601. c = (c << 17 | c >>> 15) + d << 0;
  2602. b += (a ^ c & (d ^ a)) + blocks[3] - 1044525330;
  2603. b = (b << 22 | b >>> 10) + c << 0;
  2604. }
  2605. a += (d ^ b & (c ^ d)) + blocks[4] - 176418897;
  2606. a = (a << 7 | a >>> 25) + b << 0;
  2607. d += (c ^ a & (b ^ c)) + blocks[5] + 1200080426;
  2608. d = (d << 12 | d >>> 20) + a << 0;
  2609. c += (b ^ d & (a ^ b)) + blocks[6] - 1473231341;
  2610. c = (c << 17 | c >>> 15) + d << 0;
  2611. b += (a ^ c & (d ^ a)) + blocks[7] - 45705983;
  2612. b = (b << 22 | b >>> 10) + c << 0;
  2613. a += (d ^ b & (c ^ d)) + blocks[8] + 1770035416;
  2614. a = (a << 7 | a >>> 25) + b << 0;
  2615. d += (c ^ a & (b ^ c)) + blocks[9] - 1958414417;
  2616. d = (d << 12 | d >>> 20) + a << 0;
  2617. c += (b ^ d & (a ^ b)) + blocks[10] - 42063;
  2618. c = (c << 17 | c >>> 15) + d << 0;
  2619. b += (a ^ c & (d ^ a)) + blocks[11] - 1990404162;
  2620. b = (b << 22 | b >>> 10) + c << 0;
  2621. a += (d ^ b & (c ^ d)) + blocks[12] + 1804603682;
  2622. a = (a << 7 | a >>> 25) + b << 0;
  2623. d += (c ^ a & (b ^ c)) + blocks[13] - 40341101;
  2624. d = (d << 12 | d >>> 20) + a << 0;
  2625. c += (b ^ d & (a ^ b)) + blocks[14] - 1502002290;
  2626. c = (c << 17 | c >>> 15) + d << 0;
  2627. b += (a ^ c & (d ^ a)) + blocks[15] + 1236535329;
  2628. b = (b << 22 | b >>> 10) + c << 0;
  2629. a += (c ^ d & (b ^ c)) + blocks[1] - 165796510;
  2630. a = (a << 5 | a >>> 27) + b << 0;
  2631. d += (b ^ c & (a ^ b)) + blocks[6] - 1069501632;
  2632. d = (d << 9 | d >>> 23) + a << 0;
  2633. c += (a ^ b & (d ^ a)) + blocks[11] + 643717713;
  2634. c = (c << 14 | c >>> 18) + d << 0;
  2635. b += (d ^ a & (c ^ d)) + blocks[0] - 373897302;
  2636. b = (b << 20 | b >>> 12) + c << 0;
  2637. a += (c ^ d & (b ^ c)) + blocks[5] - 701558691;
  2638. a = (a << 5 | a >>> 27) + b << 0;
  2639. d += (b ^ c & (a ^ b)) + blocks[10] + 38016083;
  2640. d = (d << 9 | d >>> 23) + a << 0;
  2641. c += (a ^ b & (d ^ a)) + blocks[15] - 660478335;
  2642. c = (c << 14 | c >>> 18) + d << 0;
  2643. b += (d ^ a & (c ^ d)) + blocks[4] - 405537848;
  2644. b = (b << 20 | b >>> 12) + c << 0;
  2645. a += (c ^ d & (b ^ c)) + blocks[9] + 568446438;
  2646. a = (a << 5 | a >>> 27) + b << 0;
  2647. d += (b ^ c & (a ^ b)) + blocks[14] - 1019803690;
  2648. d = (d << 9 | d >>> 23) + a << 0;
  2649. c += (a ^ b & (d ^ a)) + blocks[3] - 187363961;
  2650. c = (c << 14 | c >>> 18) + d << 0;
  2651. b += (d ^ a & (c ^ d)) + blocks[8] + 1163531501;
  2652. b = (b << 20 | b >>> 12) + c << 0;
  2653. a += (c ^ d & (b ^ c)) + blocks[13] - 1444681467;
  2654. a = (a << 5 | a >>> 27) + b << 0;
  2655. d += (b ^ c & (a ^ b)) + blocks[2] - 51403784;
  2656. d = (d << 9 | d >>> 23) + a << 0;
  2657. c += (a ^ b & (d ^ a)) + blocks[7] + 1735328473;
  2658. c = (c << 14 | c >>> 18) + d << 0;
  2659. b += (d ^ a & (c ^ d)) + blocks[12] - 1926607734;
  2660. b = (b << 20 | b >>> 12) + c << 0;
  2661. bc = b ^ c;
  2662. a += (bc ^ d) + blocks[5] - 378558;
  2663. a = (a << 4 | a >>> 28) + b << 0;
  2664. d += (bc ^ a) + blocks[8] - 2022574463;
  2665. d = (d << 11 | d >>> 21) + a << 0;
  2666. da = d ^ a;
  2667. c += (da ^ b) + blocks[11] + 1839030562;
  2668. c = (c << 16 | c >>> 16) + d << 0;
  2669. b += (da ^ c) + blocks[14] - 35309556;
  2670. b = (b << 23 | b >>> 9) + c << 0;
  2671. bc = b ^ c;
  2672. a += (bc ^ d) + blocks[1] - 1530992060;
  2673. a = (a << 4 | a >>> 28) + b << 0;
  2674. d += (bc ^ a) + blocks[4] + 1272893353;
  2675. d = (d << 11 | d >>> 21) + a << 0;
  2676. da = d ^ a;
  2677. c += (da ^ b) + blocks[7] - 155497632;
  2678. c = (c << 16 | c >>> 16) + d << 0;
  2679. b += (da ^ c) + blocks[10] - 1094730640;
  2680. b = (b << 23 | b >>> 9) + c << 0;
  2681. bc = b ^ c;
  2682. a += (bc ^ d) + blocks[13] + 681279174;
  2683. a = (a << 4 | a >>> 28) + b << 0;
  2684. d += (bc ^ a) + blocks[0] - 358537222;
  2685. d = (d << 11 | d >>> 21) + a << 0;
  2686. da = d ^ a;
  2687. c += (da ^ b) + blocks[3] - 722521979;
  2688. c = (c << 16 | c >>> 16) + d << 0;
  2689. b += (da ^ c) + blocks[6] + 76029189;
  2690. b = (b << 23 | b >>> 9) + c << 0;
  2691. bc = b ^ c;
  2692. a += (bc ^ d) + blocks[9] - 640364487;
  2693. a = (a << 4 | a >>> 28) + b << 0;
  2694. d += (bc ^ a) + blocks[12] - 421815835;
  2695. d = (d << 11 | d >>> 21) + a << 0;
  2696. da = d ^ a;
  2697. c += (da ^ b) + blocks[15] + 530742520;
  2698. c = (c << 16 | c >>> 16) + d << 0;
  2699. b += (da ^ c) + blocks[2] - 995338651;
  2700. b = (b << 23 | b >>> 9) + c << 0;
  2701. a += (c ^ (b | ~d)) + blocks[0] - 198630844;
  2702. a = (a << 6 | a >>> 26) + b << 0;
  2703. d += (b ^ (a | ~c)) + blocks[7] + 1126891415;
  2704. d = (d << 10 | d >>> 22) + a << 0;
  2705. c += (a ^ (d | ~b)) + blocks[14] - 1416354905;
  2706. c = (c << 15 | c >>> 17) + d << 0;
  2707. b += (d ^ (c | ~a)) + blocks[5] - 57434055;
  2708. b = (b << 21 | b >>> 11) + c << 0;
  2709. a += (c ^ (b | ~d)) + blocks[12] + 1700485571;
  2710. a = (a << 6 | a >>> 26) + b << 0;
  2711. d += (b ^ (a | ~c)) + blocks[3] - 1894986606;
  2712. d = (d << 10 | d >>> 22) + a << 0;
  2713. c += (a ^ (d | ~b)) + blocks[10] - 1051523;
  2714. c = (c << 15 | c >>> 17) + d << 0;
  2715. b += (d ^ (c | ~a)) + blocks[1] - 2054922799;
  2716. b = (b << 21 | b >>> 11) + c << 0;
  2717. a += (c ^ (b | ~d)) + blocks[8] + 1873313359;
  2718. a = (a << 6 | a >>> 26) + b << 0;
  2719. d += (b ^ (a | ~c)) + blocks[15] - 30611744;
  2720. d = (d << 10 | d >>> 22) + a << 0;
  2721. c += (a ^ (d | ~b)) + blocks[6] - 1560198380;
  2722. c = (c << 15 | c >>> 17) + d << 0;
  2723. b += (d ^ (c | ~a)) + blocks[13] + 1309151649;
  2724. b = (b << 21 | b >>> 11) + c << 0;
  2725. a += (c ^ (b | ~d)) + blocks[4] - 145523070;
  2726. a = (a << 6 | a >>> 26) + b << 0;
  2727. d += (b ^ (a | ~c)) + blocks[11] - 1120210379;
  2728. d = (d << 10 | d >>> 22) + a << 0;
  2729. c += (a ^ (d | ~b)) + blocks[2] + 718787259;
  2730. c = (c << 15 | c >>> 17) + d << 0;
  2731. b += (d ^ (c | ~a)) + blocks[9] - 343485551;
  2732. b = (b << 21 | b >>> 11) + c << 0;
  2733. if (this.first) {
  2734. this.h0 = a + 1732584193 << 0;
  2735. this.h1 = b - 271733879 << 0;
  2736. this.h2 = c - 1732584194 << 0;
  2737. this.h3 = d + 271733878 << 0;
  2738. this.first = false;
  2739. } else {
  2740. this.h0 = this.h0 + a << 0;
  2741. this.h1 = this.h1 + b << 0;
  2742. this.h2 = this.h2 + c << 0;
  2743. this.h3 = this.h3 + d << 0;
  2744. }
  2745. };
  2746. /**
  2747. * @method hex
  2748. * @memberof Md5
  2749. * @instance
  2750. * @description Output hash as hex string
  2751. * @returns {String} Hex string
  2752. * @see {@link md5.hex}
  2753. * @example
  2754. * hash.hex();
  2755. */
  2756. Md5.prototype.hex = function () {
  2757. this.finalize();
  2758. var h0 = this.h0,
  2759. h1 = this.h1,
  2760. h2 = this.h2,
  2761. h3 = this.h3;
  2762. return HEX_CHARS[h0 >> 4 & 0x0F] + HEX_CHARS[h0 & 0x0F] + HEX_CHARS[h0 >> 12 & 0x0F] + HEX_CHARS[h0 >> 8 & 0x0F] + HEX_CHARS[h0 >> 20 & 0x0F] + HEX_CHARS[h0 >> 16 & 0x0F] + HEX_CHARS[h0 >> 28 & 0x0F] + HEX_CHARS[h0 >> 24 & 0x0F] + HEX_CHARS[h1 >> 4 & 0x0F] + HEX_CHARS[h1 & 0x0F] + HEX_CHARS[h1 >> 12 & 0x0F] + HEX_CHARS[h1 >> 8 & 0x0F] + HEX_CHARS[h1 >> 20 & 0x0F] + HEX_CHARS[h1 >> 16 & 0x0F] + HEX_CHARS[h1 >> 28 & 0x0F] + HEX_CHARS[h1 >> 24 & 0x0F] + HEX_CHARS[h2 >> 4 & 0x0F] + HEX_CHARS[h2 & 0x0F] + HEX_CHARS[h2 >> 12 & 0x0F] + HEX_CHARS[h2 >> 8 & 0x0F] + HEX_CHARS[h2 >> 20 & 0x0F] + HEX_CHARS[h2 >> 16 & 0x0F] + HEX_CHARS[h2 >> 28 & 0x0F] + HEX_CHARS[h2 >> 24 & 0x0F] + HEX_CHARS[h3 >> 4 & 0x0F] + HEX_CHARS[h3 & 0x0F] + HEX_CHARS[h3 >> 12 & 0x0F] + HEX_CHARS[h3 >> 8 & 0x0F] + HEX_CHARS[h3 >> 20 & 0x0F] + HEX_CHARS[h3 >> 16 & 0x0F] + HEX_CHARS[h3 >> 28 & 0x0F] + HEX_CHARS[h3 >> 24 & 0x0F];
  2763. };
  2764. /**
  2765. * @method toString
  2766. * @memberof Md5
  2767. * @instance
  2768. * @description Output hash as hex string
  2769. * @returns {String} Hex string
  2770. * @see {@link md5.hex}
  2771. * @example
  2772. * hash.toString();
  2773. */
  2774. Md5.prototype.toString = Md5.prototype.hex;
  2775. /**
  2776. * @method digest
  2777. * @memberof Md5
  2778. * @instance
  2779. * @description Output hash as bytes array
  2780. * @returns {Array} Bytes array
  2781. * @see {@link md5.digest}
  2782. * @example
  2783. * hash.digest();
  2784. */
  2785. Md5.prototype.digest = function (format) {
  2786. if (format === 'hex') return this.hex();
  2787. this.finalize();
  2788. var h0 = this.h0,
  2789. h1 = this.h1,
  2790. h2 = this.h2,
  2791. h3 = this.h3;
  2792. var res = [h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >> 24 & 0xFF];
  2793. return res;
  2794. };
  2795. /**
  2796. * @method array
  2797. * @memberof Md5
  2798. * @instance
  2799. * @description Output hash as bytes array
  2800. * @returns {Array} Bytes array
  2801. * @see {@link md5.array}
  2802. * @example
  2803. * hash.array();
  2804. */
  2805. Md5.prototype.array = Md5.prototype.digest;
  2806. /**
  2807. * @method arrayBuffer
  2808. * @memberof Md5
  2809. * @instance
  2810. * @description Output hash as ArrayBuffer
  2811. * @returns {ArrayBuffer} ArrayBuffer
  2812. * @see {@link md5.arrayBuffer}
  2813. * @example
  2814. * hash.arrayBuffer();
  2815. */
  2816. Md5.prototype.arrayBuffer = function () {
  2817. this.finalize();
  2818. var buffer = new ArrayBuffer(16);
  2819. var blocks = new Uint32Array(buffer);
  2820. blocks[0] = this.h0;
  2821. blocks[1] = this.h1;
  2822. blocks[2] = this.h2;
  2823. blocks[3] = this.h3;
  2824. return buffer;
  2825. };
  2826. /**
  2827. * @method buffer
  2828. * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead.
  2829. * @memberof Md5
  2830. * @instance
  2831. * @description Output hash as ArrayBuffer
  2832. * @returns {ArrayBuffer} ArrayBuffer
  2833. * @see {@link md5.buffer}
  2834. * @example
  2835. * hash.buffer();
  2836. */
  2837. Md5.prototype.buffer = Md5.prototype.arrayBuffer;
  2838. /**
  2839. * @method base64
  2840. * @memberof Md5
  2841. * @instance
  2842. * @description Output hash as base64 string
  2843. * @returns {String} base64 string
  2844. * @see {@link md5.base64}
  2845. * @example
  2846. * hash.base64();
  2847. */
  2848. Md5.prototype.base64 = function () {
  2849. var v1,
  2850. v2,
  2851. v3,
  2852. base64Str = '',
  2853. bytes = this.array();
  2854. for (var i = 0; i < 15;) {
  2855. v1 = bytes[i++];
  2856. v2 = bytes[i++];
  2857. v3 = bytes[i++];
  2858. base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] + BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] + BASE64_ENCODE_CHAR[v3 & 63];
  2859. }
  2860. v1 = bytes[i];
  2861. base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + BASE64_ENCODE_CHAR[v1 << 4 & 63] + '==';
  2862. return base64Str;
  2863. };
  2864. var exports = createMethod();
  2865. if (COMMON_JS) {
  2866. module.exports = exports;
  2867. } else {
  2868. /**
  2869. * @method md5
  2870. * @description Md5 hash function, export to global in browsers.
  2871. * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash
  2872. * @returns {String} md5 hashes
  2873. * @example
  2874. * md5(''); // d41d8cd98f00b204e9800998ecf8427e
  2875. * md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6
  2876. * md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0
  2877. *
  2878. * // It also supports UTF-8 encoding
  2879. * md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07
  2880. *
  2881. * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer`
  2882. * md5([]); // d41d8cd98f00b204e9800998ecf8427e
  2883. * md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e
  2884. */
  2885. root.md5 = exports;
  2886. if (AMD) {
  2887. !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {
  2888. return exports;
  2889. }).call(exports, __webpack_require__, exports, module),
  2890. __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
  2891. }
  2892. }
  2893. })();
  2894. /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(8)))
  2895. /***/ }),
  2896. /* 8 */
  2897. /***/ (function(module, exports) {
  2898. var g;
  2899. // This works in non-strict mode
  2900. g = (function() {
  2901. return this;
  2902. })();
  2903. try {
  2904. // This works if eval is allowed (see CSP)
  2905. g = g || Function("return this")() || (1,eval)("this");
  2906. } catch(e) {
  2907. // This works if the window reference is available
  2908. if(typeof window === "object")
  2909. g = window;
  2910. }
  2911. // g can still be undefined, but nothing to do about it...
  2912. // We return undefined, instead of nothing here, so it's
  2913. // easier to handle this case. if(!global) { ...}
  2914. module.exports = g;
  2915. /***/ }),
  2916. /* 9 */
  2917. /***/ (function(module, exports) {
  2918. /* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
  2919. module.exports = __webpack_amd_options__;
  2920. /* WEBPACK VAR INJECTION */}.call(exports, {}))
  2921. /***/ }),
  2922. /* 10 */
  2923. /***/ (function(module, exports, __webpack_require__) {
  2924. /*
  2925. CryptoJS v3.1.2
  2926. code.google.com/p/crypto-js
  2927. (c) 2009-2013 by Jeff Mott. All rights reserved.
  2928. code.google.com/p/crypto-js/wiki/License
  2929. */
  2930. var CryptoJS = CryptoJS || function (g, l) {
  2931. var e = {},
  2932. d = e.lib = {},
  2933. m = function () {},
  2934. k = d.Base = { extend: function (a) {
  2935. m.prototype = this;var c = new m();a && c.mixIn(a);c.hasOwnProperty("init") || (c.init = function () {
  2936. c.$super.init.apply(this, arguments);
  2937. });c.init.prototype = c;c.$super = this;return c;
  2938. }, create: function () {
  2939. var a = this.extend();a.init.apply(a, arguments);return a;
  2940. }, init: function () {}, mixIn: function (a) {
  2941. for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);a.hasOwnProperty("toString") && (this.toString = a.toString);
  2942. }, clone: function () {
  2943. return this.init.prototype.extend(this);
  2944. } },
  2945. p = d.WordArray = k.extend({ init: function (a, c) {
  2946. a = this.words = a || [];this.sigBytes = c != l ? c : 4 * a.length;
  2947. }, toString: function (a) {
  2948. return (a || n).stringify(this);
  2949. }, concat: function (a) {
  2950. var c = this.words,
  2951. q = a.words,
  2952. f = this.sigBytes;a = a.sigBytes;this.clamp();if (f % 4) for (var b = 0; b < a; b++) c[f + b >>> 2] |= (q[b >>> 2] >>> 24 - 8 * (b % 4) & 255) << 24 - 8 * ((f + b) % 4);else if (65535 < q.length) for (b = 0; b < a; b += 4) c[f + b >>> 2] = q[b >>> 2];else c.push.apply(c, q);this.sigBytes += a;return this;
  2953. }, clamp: function () {
  2954. var a = this.words,
  2955. c = this.sigBytes;a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);a.length = g.ceil(c / 4);
  2956. }, clone: function () {
  2957. var a = k.clone.call(this);a.words = this.words.slice(0);return a;
  2958. }, random: function (a) {
  2959. for (var c = [], b = 0; b < a; b += 4) c.push(4294967296 * g.random() | 0);return new p.init(c, a);
  2960. } }),
  2961. b = e.enc = {},
  2962. n = b.Hex = { stringify: function (a) {
  2963. var c = a.words;a = a.sigBytes;for (var b = [], f = 0; f < a; f++) {
  2964. var d = c[f >>> 2] >>> 24 - 8 * (f % 4) & 255;b.push((d >>> 4).toString(16));b.push((d & 15).toString(16));
  2965. }return b.join("");
  2966. }, parse: function (a) {
  2967. for (var c = a.length, b = [], f = 0; f < c; f += 2) b[f >>> 3] |= parseInt(a.substr(f, 2), 16) << 24 - 4 * (f % 8);return new p.init(b, c / 2);
  2968. } },
  2969. j = b.Latin1 = { stringify: function (a) {
  2970. var c = a.words;a = a.sigBytes;for (var b = [], f = 0; f < a; f++) b.push(String.fromCharCode(c[f >>> 2] >>> 24 - 8 * (f % 4) & 255));return b.join("");
  2971. }, parse: function (a) {
  2972. for (var c = a.length, b = [], f = 0; f < c; f++) b[f >>> 2] |= (a.charCodeAt(f) & 255) << 24 - 8 * (f % 4);return new p.init(b, c);
  2973. } },
  2974. h = b.Utf8 = { stringify: function (a) {
  2975. try {
  2976. return decodeURIComponent(escape(j.stringify(a)));
  2977. } catch (c) {
  2978. throw Error("Malformed UTF-8 data");
  2979. }
  2980. }, parse: function (a) {
  2981. return j.parse(unescape(encodeURIComponent(a)));
  2982. } },
  2983. r = d.BufferedBlockAlgorithm = k.extend({ reset: function () {
  2984. this._data = new p.init();this._nDataBytes = 0;
  2985. }, _append: function (a) {
  2986. "string" == typeof a && (a = h.parse(a));this._data.concat(a);this._nDataBytes += a.sigBytes;
  2987. }, _process: function (a) {
  2988. var c = this._data,
  2989. b = c.words,
  2990. f = c.sigBytes,
  2991. d = this.blockSize,
  2992. e = f / (4 * d),
  2993. e = a ? g.ceil(e) : g.max((e | 0) - this._minBufferSize, 0);a = e * d;f = g.min(4 * a, f);if (a) {
  2994. for (var k = 0; k < a; k += d) this._doProcessBlock(b, k);k = b.splice(0, a);c.sigBytes -= f;
  2995. }return new p.init(k, f);
  2996. }, clone: function () {
  2997. var a = k.clone.call(this);
  2998. a._data = this._data.clone();return a;
  2999. }, _minBufferSize: 0 });d.Hasher = r.extend({ cfg: k.extend(), init: function (a) {
  3000. this.cfg = this.cfg.extend(a);this.reset();
  3001. }, reset: function () {
  3002. r.reset.call(this);this._doReset();
  3003. }, update: function (a) {
  3004. this._append(a);this._process();return this;
  3005. }, finalize: function (a) {
  3006. a && this._append(a);return this._doFinalize();
  3007. }, blockSize: 16, _createHelper: function (a) {
  3008. return function (b, d) {
  3009. return new a.init(d).finalize(b);
  3010. };
  3011. }, _createHmacHelper: function (a) {
  3012. return function (b, d) {
  3013. return new s.HMAC.init(a, d).finalize(b);
  3014. };
  3015. } });var s = e.algo = {};return e;
  3016. }(Math);
  3017. (function () {
  3018. var g = CryptoJS,
  3019. l = g.lib,
  3020. e = l.WordArray,
  3021. d = l.Hasher,
  3022. m = [],
  3023. l = g.algo.SHA1 = d.extend({ _doReset: function () {
  3024. this._hash = new e.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
  3025. }, _doProcessBlock: function (d, e) {
  3026. for (var b = this._hash.words, n = b[0], j = b[1], h = b[2], g = b[3], l = b[4], a = 0; 80 > a; a++) {
  3027. if (16 > a) m[a] = d[e + a] | 0;else {
  3028. var c = m[a - 3] ^ m[a - 8] ^ m[a - 14] ^ m[a - 16];m[a] = c << 1 | c >>> 31;
  3029. }c = (n << 5 | n >>> 27) + l + m[a];c = 20 > a ? c + ((j & h | ~j & g) + 1518500249) : 40 > a ? c + ((j ^ h ^ g) + 1859775393) : 60 > a ? c + ((j & h | j & g | h & g) - 1894007588) : c + ((j ^ h ^ g) - 899497514);l = g;g = h;h = j << 30 | j >>> 2;j = n;n = c;
  3030. }b[0] = b[0] + n | 0;b[1] = b[1] + j | 0;b[2] = b[2] + h | 0;b[3] = b[3] + g | 0;b[4] = b[4] + l | 0;
  3031. }, _doFinalize: function () {
  3032. var d = this._data,
  3033. e = d.words,
  3034. b = 8 * this._nDataBytes,
  3035. g = 8 * d.sigBytes;e[g >>> 5] |= 128 << 24 - g % 32;e[(g + 64 >>> 9 << 4) + 14] = Math.floor(b / 4294967296);e[(g + 64 >>> 9 << 4) + 15] = b;d.sigBytes = 4 * e.length;this._process();return this._hash;
  3036. }, clone: function () {
  3037. var e = d.clone.call(this);e._hash = this._hash.clone();return e;
  3038. } });g.SHA1 = d._createHelper(l);g.HmacSHA1 = d._createHmacHelper(l);
  3039. })();
  3040. (function () {
  3041. var g = CryptoJS,
  3042. l = g.enc.Utf8;g.algo.HMAC = g.lib.Base.extend({ init: function (e, d) {
  3043. e = this._hasher = new e.init();"string" == typeof d && (d = l.parse(d));var g = e.blockSize,
  3044. k = 4 * g;d.sigBytes > k && (d = e.finalize(d));d.clamp();for (var p = this._oKey = d.clone(), b = this._iKey = d.clone(), n = p.words, j = b.words, h = 0; h < g; h++) n[h] ^= 1549556828, j[h] ^= 909522486;p.sigBytes = b.sigBytes = k;this.reset();
  3045. }, reset: function () {
  3046. var e = this._hasher;e.reset();e.update(this._iKey);
  3047. }, update: function (e) {
  3048. this._hasher.update(e);return this;
  3049. }, finalize: function (e) {
  3050. var d = this._hasher;e = d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e));
  3051. } });
  3052. })();
  3053. (function () {
  3054. // Shortcuts
  3055. var C = CryptoJS;
  3056. var C_lib = C.lib;
  3057. var WordArray = C_lib.WordArray;
  3058. var C_enc = C.enc;
  3059. /**
  3060. * Base64 encoding strategy.
  3061. */
  3062. var Base64 = C_enc.Base64 = {
  3063. /**
  3064. * Converts a word array to a Base64 string.
  3065. *
  3066. * @param {WordArray} wordArray The word array.
  3067. *
  3068. * @return {string} The Base64 string.
  3069. *
  3070. * @static
  3071. *
  3072. * @example
  3073. *
  3074. * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  3075. */
  3076. stringify: function (wordArray) {
  3077. // Shortcuts
  3078. var words = wordArray.words;
  3079. var sigBytes = wordArray.sigBytes;
  3080. var map = this._map;
  3081. // Clamp excess bits
  3082. wordArray.clamp();
  3083. // Convert
  3084. var base64Chars = [];
  3085. for (var i = 0; i < sigBytes; i += 3) {
  3086. var byte1 = words[i >>> 2] >>> 24 - i % 4 * 8 & 0xff;
  3087. var byte2 = words[i + 1 >>> 2] >>> 24 - (i + 1) % 4 * 8 & 0xff;
  3088. var byte3 = words[i + 2 >>> 2] >>> 24 - (i + 2) % 4 * 8 & 0xff;
  3089. var triplet = byte1 << 16 | byte2 << 8 | byte3;
  3090. for (var j = 0; j < 4 && i + j * 0.75 < sigBytes; j++) {
  3091. base64Chars.push(map.charAt(triplet >>> 6 * (3 - j) & 0x3f));
  3092. }
  3093. }
  3094. // Add padding
  3095. var paddingChar = map.charAt(64);
  3096. if (paddingChar) {
  3097. while (base64Chars.length % 4) {
  3098. base64Chars.push(paddingChar);
  3099. }
  3100. }
  3101. return base64Chars.join('');
  3102. },
  3103. /**
  3104. * Converts a Base64 string to a word array.
  3105. *
  3106. * @param {string} base64Str The Base64 string.
  3107. *
  3108. * @return {WordArray} The word array.
  3109. *
  3110. * @static
  3111. *
  3112. * @example
  3113. *
  3114. * var wordArray = CryptoJS.enc.Base64.parse(base64String);
  3115. */
  3116. parse: function (base64Str) {
  3117. // Shortcuts
  3118. var base64StrLength = base64Str.length;
  3119. var map = this._map;
  3120. // Ignore padding
  3121. var paddingChar = map.charAt(64);
  3122. if (paddingChar) {
  3123. var paddingIndex = base64Str.indexOf(paddingChar);
  3124. if (paddingIndex != -1) {
  3125. base64StrLength = paddingIndex;
  3126. }
  3127. }
  3128. // Convert
  3129. var words = [];
  3130. var nBytes = 0;
  3131. for (var i = 0; i < base64StrLength; i++) {
  3132. if (i % 4) {
  3133. var bits1 = map.indexOf(base64Str.charAt(i - 1)) << i % 4 * 2;
  3134. var bits2 = map.indexOf(base64Str.charAt(i)) >>> 6 - i % 4 * 2;
  3135. words[nBytes >>> 2] |= (bits1 | bits2) << 24 - nBytes % 4 * 8;
  3136. nBytes++;
  3137. }
  3138. }
  3139. return WordArray.create(words, nBytes);
  3140. },
  3141. _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  3142. };
  3143. })();
  3144. if (true) {
  3145. module.exports = CryptoJS;
  3146. } else {
  3147. window.CryptoJS = CryptoJS;
  3148. }
  3149. /***/ }),
  3150. /* 11 */
  3151. /***/ (function(module, exports, __webpack_require__) {
  3152. /* Copyright 2015 William Summers, MetaTribal LLC
  3153. * adapted from https://developer.mozilla.org/en-US/docs/JXON
  3154. *
  3155. * Licensed under the MIT License, Version 2.0 (the "License");
  3156. * you may not use this file except in compliance with the License.
  3157. * You may obtain a copy of the License at
  3158. *
  3159. * https://opensource.org/licenses/MIT
  3160. *
  3161. * Unless required by applicable law or agreed to in writing, software
  3162. * distributed under the License is distributed on an "AS IS" BASIS,
  3163. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  3164. * See the License for the specific language governing permissions and
  3165. * limitations under the License.
  3166. */
  3167. /**
  3168. * @author William Summers
  3169. * https://github.com/metatribal/xmlToJSON
  3170. */
  3171. var DOMParser = __webpack_require__(12).DOMParser;
  3172. var xmlToJSON = function () {
  3173. this.version = "1.3.5";
  3174. var options = { // set up the default options
  3175. mergeCDATA: true, // extract cdata and merge with text
  3176. normalize: true, // collapse multiple spaces to single space
  3177. stripElemPrefix: true // for elements of same name in diff namespaces, you can enable namespaces and access the nskey property
  3178. };
  3179. var prefixMatch = new RegExp(/(?!xmlns)^.*:/);
  3180. var trimMatch = new RegExp(/^\s+|\s+$/g);
  3181. this.grokType = function (sValue) {
  3182. if (/^\s*$/.test(sValue)) {
  3183. return null;
  3184. }
  3185. if (/^(?:true|false)$/i.test(sValue)) {
  3186. return sValue.toLowerCase() === "true";
  3187. }
  3188. if (isFinite(sValue)) {
  3189. return parseFloat(sValue);
  3190. }
  3191. return sValue;
  3192. };
  3193. this.parseString = function (xmlString, opt) {
  3194. if (xmlString) {
  3195. var xml = this.stringToXML(xmlString);
  3196. if (xml.getElementsByTagName('parsererror').length) {
  3197. return null;
  3198. } else {
  3199. return this.parseXML(xml, opt);
  3200. }
  3201. } else {
  3202. return null;
  3203. }
  3204. };
  3205. this.parseXML = function (oXMLParent, opt) {
  3206. // initialize options
  3207. for (var key in opt) {
  3208. options[key] = opt[key];
  3209. }
  3210. var vResult = {},
  3211. nLength = 0,
  3212. sCollectedTxt = "";
  3213. // iterate over the children
  3214. var childNum = oXMLParent.childNodes.length;
  3215. if (childNum) {
  3216. for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {
  3217. oNode = oXMLParent.childNodes.item(nItem);
  3218. if (oNode.nodeType === 4) {
  3219. if (options.mergeCDATA) {
  3220. sCollectedTxt += oNode.nodeValue;
  3221. }
  3222. } /* nodeType is "CDATASection" (4) */
  3223. else if (oNode.nodeType === 3) {
  3224. sCollectedTxt += oNode.nodeValue;
  3225. } /* nodeType is "Text" (3) */
  3226. else if (oNode.nodeType === 1) {
  3227. /* nodeType is "Element" (1) */
  3228. if (nLength === 0) {
  3229. vResult = {};
  3230. }
  3231. // using nodeName to support browser (IE) implementation with no 'localName' property
  3232. if (options.stripElemPrefix) {
  3233. sProp = oNode.nodeName.replace(prefixMatch, '');
  3234. } else {
  3235. sProp = oNode.nodeName;
  3236. }
  3237. vContent = xmlToJSON.parseXML(oNode);
  3238. if (vResult.hasOwnProperty(sProp)) {
  3239. if (vResult[sProp].constructor !== Array) {
  3240. vResult[sProp] = [vResult[sProp]];
  3241. }
  3242. vResult[sProp].push(vContent);
  3243. } else {
  3244. vResult[sProp] = vContent;
  3245. nLength++;
  3246. }
  3247. }
  3248. }
  3249. }
  3250. if (!Object.keys(vResult).length) {
  3251. // vResult = sCollectedTxt.replace(trimMatch, '') || ''; // by carsonxu 修复 getBucket返回的 Key 是 " /" 这种场景
  3252. vResult = sCollectedTxt || '';
  3253. }
  3254. return vResult;
  3255. };
  3256. // Convert xmlDocument to a string
  3257. // Returns null on failure
  3258. this.xmlToString = function (xmlDoc) {
  3259. try {
  3260. var xmlString = xmlDoc.xml ? xmlDoc.xml : new XMLSerializer().serializeToString(xmlDoc);
  3261. return xmlString;
  3262. } catch (err) {
  3263. return null;
  3264. }
  3265. };
  3266. // Convert a string to XML Node Structure
  3267. // Returns null on failure
  3268. this.stringToXML = function (xmlString) {
  3269. try {
  3270. var xmlDoc = null;
  3271. if (window.DOMParser) {
  3272. var parser = new DOMParser();
  3273. xmlDoc = parser.parseFromString(xmlString, "text/xml");
  3274. return xmlDoc;
  3275. } else {
  3276. xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  3277. xmlDoc.async = false;
  3278. xmlDoc.loadXML(xmlString);
  3279. return xmlDoc;
  3280. }
  3281. } catch (e) {
  3282. return null;
  3283. }
  3284. };
  3285. return this;
  3286. }.call({});
  3287. var xml2json = function (xmlString) {
  3288. return xmlToJSON.parseString(xmlString);
  3289. };
  3290. module.exports = xml2json;
  3291. /***/ }),
  3292. /* 12 */
  3293. /***/ (function(module, exports, __webpack_require__) {
  3294. function DOMParser(options){
  3295. this.options = options ||{locator:{}};
  3296. }
  3297. DOMParser.prototype.parseFromString = function(source,mimeType){
  3298. var options = this.options;
  3299. var sax = new XMLReader();
  3300. var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
  3301. var errorHandler = options.errorHandler;
  3302. var locator = options.locator;
  3303. var defaultNSMap = options.xmlns||{};
  3304. var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
  3305. if(locator){
  3306. domBuilder.setDocumentLocator(locator)
  3307. }
  3308. sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
  3309. sax.domBuilder = options.domBuilder || domBuilder;
  3310. if(/\/x?html?$/.test(mimeType)){
  3311. entityMap.nbsp = '\xa0';
  3312. entityMap.copy = '\xa9';
  3313. defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
  3314. }
  3315. defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
  3316. if(source){
  3317. sax.parse(source,defaultNSMap,entityMap);
  3318. }else{
  3319. sax.errorHandler.error("invalid doc source");
  3320. }
  3321. return domBuilder.doc;
  3322. }
  3323. function buildErrorHandler(errorImpl,domBuilder,locator){
  3324. if(!errorImpl){
  3325. if(domBuilder instanceof DOMHandler){
  3326. return domBuilder;
  3327. }
  3328. errorImpl = domBuilder ;
  3329. }
  3330. var errorHandler = {}
  3331. var isCallback = errorImpl instanceof Function;
  3332. locator = locator||{}
  3333. function build(key){
  3334. var fn = errorImpl[key];
  3335. if(!fn && isCallback){
  3336. fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
  3337. }
  3338. errorHandler[key] = fn && function(msg){
  3339. fn('[xmldom '+key+']\t'+msg+_locator(locator));
  3340. }||function(){};
  3341. }
  3342. build('warning');
  3343. build('error');
  3344. build('fatalError');
  3345. return errorHandler;
  3346. }
  3347. //console.log('#\n\n\n\n\n\n\n####')
  3348. /**
  3349. * +ContentHandler+ErrorHandler
  3350. * +LexicalHandler+EntityResolver2
  3351. * -DeclHandler-DTDHandler
  3352. *
  3353. * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
  3354. * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
  3355. * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
  3356. */
  3357. function DOMHandler() {
  3358. this.cdata = false;
  3359. }
  3360. function position(locator,node){
  3361. node.lineNumber = locator.lineNumber;
  3362. node.columnNumber = locator.columnNumber;
  3363. }
  3364. /**
  3365. * @see org.xml.sax.ContentHandler#startDocument
  3366. * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
  3367. */
  3368. DOMHandler.prototype = {
  3369. startDocument : function() {
  3370. this.doc = new DOMImplementation().createDocument(null, null, null);
  3371. if (this.locator) {
  3372. this.doc.documentURI = this.locator.systemId;
  3373. }
  3374. },
  3375. startElement:function(namespaceURI, localName, qName, attrs) {
  3376. var doc = this.doc;
  3377. var el = doc.createElementNS(namespaceURI, qName||localName);
  3378. var len = attrs.length;
  3379. appendElement(this, el);
  3380. this.currentElement = el;
  3381. this.locator && position(this.locator,el)
  3382. for (var i = 0 ; i < len; i++) {
  3383. var namespaceURI = attrs.getURI(i);
  3384. var value = attrs.getValue(i);
  3385. var qName = attrs.getQName(i);
  3386. var attr = doc.createAttributeNS(namespaceURI, qName);
  3387. this.locator &&position(attrs.getLocator(i),attr);
  3388. attr.value = attr.nodeValue = value;
  3389. el.setAttributeNode(attr)
  3390. }
  3391. },
  3392. endElement:function(namespaceURI, localName, qName) {
  3393. var current = this.currentElement
  3394. var tagName = current.tagName;
  3395. this.currentElement = current.parentNode;
  3396. },
  3397. startPrefixMapping:function(prefix, uri) {
  3398. },
  3399. endPrefixMapping:function(prefix) {
  3400. },
  3401. processingInstruction:function(target, data) {
  3402. var ins = this.doc.createProcessingInstruction(target, data);
  3403. this.locator && position(this.locator,ins)
  3404. appendElement(this, ins);
  3405. },
  3406. ignorableWhitespace:function(ch, start, length) {
  3407. },
  3408. characters:function(chars, start, length) {
  3409. chars = _toString.apply(this,arguments)
  3410. //console.log(chars)
  3411. if(chars){
  3412. if (this.cdata) {
  3413. var charNode = this.doc.createCDATASection(chars);
  3414. } else {
  3415. var charNode = this.doc.createTextNode(chars);
  3416. }
  3417. if(this.currentElement){
  3418. this.currentElement.appendChild(charNode);
  3419. }else if(/^\s*$/.test(chars)){
  3420. this.doc.appendChild(charNode);
  3421. //process xml
  3422. }
  3423. this.locator && position(this.locator,charNode)
  3424. }
  3425. },
  3426. skippedEntity:function(name) {
  3427. },
  3428. endDocument:function() {
  3429. this.doc.normalize();
  3430. },
  3431. setDocumentLocator:function (locator) {
  3432. if(this.locator = locator){// && !('lineNumber' in locator)){
  3433. locator.lineNumber = 0;
  3434. }
  3435. },
  3436. //LexicalHandler
  3437. comment:function(chars, start, length) {
  3438. chars = _toString.apply(this,arguments)
  3439. var comm = this.doc.createComment(chars);
  3440. this.locator && position(this.locator,comm)
  3441. appendElement(this, comm);
  3442. },
  3443. startCDATA:function() {
  3444. //used in characters() methods
  3445. this.cdata = true;
  3446. },
  3447. endCDATA:function() {
  3448. this.cdata = false;
  3449. },
  3450. startDTD:function(name, publicId, systemId) {
  3451. var impl = this.doc.implementation;
  3452. if (impl && impl.createDocumentType) {
  3453. var dt = impl.createDocumentType(name, publicId, systemId);
  3454. this.locator && position(this.locator,dt)
  3455. appendElement(this, dt);
  3456. }
  3457. },
  3458. /**
  3459. * @see org.xml.sax.ErrorHandler
  3460. * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
  3461. */
  3462. warning:function(error) {
  3463. console.warn('[xmldom warning]\t'+error,_locator(this.locator));
  3464. },
  3465. error:function(error) {
  3466. console.error('[xmldom error]\t'+error,_locator(this.locator));
  3467. },
  3468. fatalError:function(error) {
  3469. console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
  3470. throw error;
  3471. }
  3472. }
  3473. function _locator(l){
  3474. if(l){
  3475. return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
  3476. }
  3477. }
  3478. function _toString(chars,start,length){
  3479. if(typeof chars == 'string'){
  3480. return chars.substr(start,length)
  3481. }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
  3482. if(chars.length >= start+length || start){
  3483. return new java.lang.String(chars,start,length)+'';
  3484. }
  3485. return chars;
  3486. }
  3487. }
  3488. /*
  3489. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
  3490. * used method of org.xml.sax.ext.LexicalHandler:
  3491. * #comment(chars, start, length)
  3492. * #startCDATA()
  3493. * #endCDATA()
  3494. * #startDTD(name, publicId, systemId)
  3495. *
  3496. *
  3497. * IGNORED method of org.xml.sax.ext.LexicalHandler:
  3498. * #endDTD()
  3499. * #startEntity(name)
  3500. * #endEntity(name)
  3501. *
  3502. *
  3503. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
  3504. * IGNORED method of org.xml.sax.ext.DeclHandler
  3505. * #attributeDecl(eName, aName, type, mode, value)
  3506. * #elementDecl(name, model)
  3507. * #externalEntityDecl(name, publicId, systemId)
  3508. * #internalEntityDecl(name, value)
  3509. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
  3510. * IGNORED method of org.xml.sax.EntityResolver2
  3511. * #resolveEntity(String name,String publicId,String baseURI,String systemId)
  3512. * #resolveEntity(publicId, systemId)
  3513. * #getExternalSubset(name, baseURI)
  3514. * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
  3515. * IGNORED method of org.xml.sax.DTDHandler
  3516. * #notationDecl(name, publicId, systemId) {};
  3517. * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
  3518. */
  3519. "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
  3520. DOMHandler.prototype[key] = function(){return null}
  3521. })
  3522. /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
  3523. function appendElement (hander,node) {
  3524. if (!hander.currentElement) {
  3525. hander.doc.appendChild(node);
  3526. } else {
  3527. hander.currentElement.appendChild(node);
  3528. }
  3529. }//appendChild and setAttributeNS are preformance key
  3530. //if(typeof require == 'function'){
  3531. var XMLReader = __webpack_require__(13).XMLReader;
  3532. var DOMImplementation = exports.DOMImplementation = __webpack_require__(2).DOMImplementation;
  3533. exports.XMLSerializer = __webpack_require__(2).XMLSerializer ;
  3534. exports.DOMParser = DOMParser;
  3535. //}
  3536. /***/ }),
  3537. /* 13 */
  3538. /***/ (function(module, exports) {
  3539. //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
  3540. //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
  3541. //[5] Name ::= NameStartChar (NameChar)*
  3542. var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]///\u10000-\uEFFFF
  3543. var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
  3544. var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
  3545. //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
  3546. //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
  3547. //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
  3548. //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
  3549. var S_TAG = 0;//tag name offerring
  3550. var S_ATTR = 1;//attr name offerring
  3551. var S_ATTR_SPACE=2;//attr name end and space offer
  3552. var S_EQ = 3;//=space?
  3553. var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
  3554. var S_ATTR_END = 5;//attr value end and no space(quot end)
  3555. var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
  3556. var S_TAG_CLOSE = 7;//closed el<el />
  3557. function XMLReader(){
  3558. }
  3559. XMLReader.prototype = {
  3560. parse:function(source,defaultNSMap,entityMap){
  3561. var domBuilder = this.domBuilder;
  3562. domBuilder.startDocument();
  3563. _copy(defaultNSMap ,defaultNSMap = {})
  3564. parse(source,defaultNSMap,entityMap,
  3565. domBuilder,this.errorHandler);
  3566. domBuilder.endDocument();
  3567. }
  3568. }
  3569. function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
  3570. function fixedFromCharCode(code) {
  3571. // String.prototype.fromCharCode does not supports
  3572. // > 2 bytes unicode chars directly
  3573. if (code > 0xffff) {
  3574. code -= 0x10000;
  3575. var surrogate1 = 0xd800 + (code >> 10)
  3576. , surrogate2 = 0xdc00 + (code & 0x3ff);
  3577. return String.fromCharCode(surrogate1, surrogate2);
  3578. } else {
  3579. return String.fromCharCode(code);
  3580. }
  3581. }
  3582. function entityReplacer(a){
  3583. var k = a.slice(1,-1);
  3584. if(k in entityMap){
  3585. return entityMap[k];
  3586. }else if(k.charAt(0) === '#'){
  3587. return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
  3588. }else{
  3589. errorHandler.error('entity not found:'+a);
  3590. return a;
  3591. }
  3592. }
  3593. function appendText(end){//has some bugs
  3594. if(end>start){
  3595. var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
  3596. locator&&position(start);
  3597. domBuilder.characters(xt,0,end-start);
  3598. start = end
  3599. }
  3600. }
  3601. function position(p,m){
  3602. while(p>=lineEnd && (m = linePattern.exec(source))){
  3603. lineStart = m.index;
  3604. lineEnd = lineStart + m[0].length;
  3605. locator.lineNumber++;
  3606. //console.log('line++:',locator,startPos,endPos)
  3607. }
  3608. locator.columnNumber = p-lineStart+1;
  3609. }
  3610. var lineStart = 0;
  3611. var lineEnd = 0;
  3612. var linePattern = /.*(?:\r\n?|\n)|.*$/g
  3613. var locator = domBuilder.locator;
  3614. var parseStack = [{currentNSMap:defaultNSMapCopy}]
  3615. var closeMap = {};
  3616. var start = 0;
  3617. while(true){
  3618. try{
  3619. var tagStart = source.indexOf('<',start);
  3620. if(tagStart<0){
  3621. if(!source.substr(start).match(/^\s*$/)){
  3622. var doc = domBuilder.doc;
  3623. var text = doc.createTextNode(source.substr(start));
  3624. doc.appendChild(text);
  3625. domBuilder.currentElement = text;
  3626. }
  3627. return;
  3628. }
  3629. if(tagStart>start){
  3630. appendText(tagStart);
  3631. }
  3632. switch(source.charAt(tagStart+1)){
  3633. case '/':
  3634. var end = source.indexOf('>',tagStart+3);
  3635. var tagName = source.substring(tagStart+2,end);
  3636. var config = parseStack.pop();
  3637. if(end<0){
  3638. tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
  3639. //console.error('#@@@@@@'+tagName)
  3640. errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
  3641. end = tagStart+1+tagName.length;
  3642. }else if(tagName.match(/\s</)){
  3643. tagName = tagName.replace(/[\s<].*/,'');
  3644. errorHandler.error("end tag name: "+tagName+' maybe not complete');
  3645. end = tagStart+1+tagName.length;
  3646. }
  3647. //console.error(parseStack.length,parseStack)
  3648. //console.error(config);
  3649. var localNSMap = config.localNSMap;
  3650. var endMatch = config.tagName == tagName;
  3651. var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
  3652. if(endIgnoreCaseMach){
  3653. domBuilder.endElement(config.uri,config.localName,tagName);
  3654. if(localNSMap){
  3655. for(var prefix in localNSMap){
  3656. domBuilder.endPrefixMapping(prefix) ;
  3657. }
  3658. }
  3659. if(!endMatch){
  3660. errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
  3661. }
  3662. }else{
  3663. parseStack.push(config)
  3664. }
  3665. end++;
  3666. break;
  3667. // end elment
  3668. case '?':// <?...?>
  3669. locator&&position(tagStart);
  3670. end = parseInstruction(source,tagStart,domBuilder);
  3671. break;
  3672. case '!':// <!doctype,<![CDATA,<!--
  3673. locator&&position(tagStart);
  3674. end = parseDCC(source,tagStart,domBuilder,errorHandler);
  3675. break;
  3676. default:
  3677. locator&&position(tagStart);
  3678. var el = new ElementAttributes();
  3679. var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
  3680. //elStartEnd
  3681. var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
  3682. var len = el.length;
  3683. if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
  3684. el.closed = true;
  3685. if(!entityMap.nbsp){
  3686. errorHandler.warning('unclosed xml attribute');
  3687. }
  3688. }
  3689. if(locator && len){
  3690. var locator2 = copyLocator(locator,{});
  3691. //try{//attribute position fixed
  3692. for(var i = 0;i<len;i++){
  3693. var a = el[i];
  3694. position(a.offset);
  3695. a.locator = copyLocator(locator,{});
  3696. }
  3697. //}catch(e){console.error('@@@@@'+e)}
  3698. domBuilder.locator = locator2
  3699. if(appendElement(el,domBuilder,currentNSMap)){
  3700. parseStack.push(el)
  3701. }
  3702. domBuilder.locator = locator;
  3703. }else{
  3704. if(appendElement(el,domBuilder,currentNSMap)){
  3705. parseStack.push(el)
  3706. }
  3707. }
  3708. if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
  3709. end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
  3710. }else{
  3711. end++;
  3712. }
  3713. }
  3714. }catch(e){
  3715. errorHandler.error('element parse error: '+e)
  3716. //errorHandler.error('element parse error: '+e);
  3717. end = -1;
  3718. //throw e;
  3719. }
  3720. if(end>start){
  3721. start = end;
  3722. }else{
  3723. //TODO: 这里有可能sax回退,有位置错误风险
  3724. appendText(Math.max(tagStart,start)+1);
  3725. }
  3726. }
  3727. }
  3728. function copyLocator(f,t){
  3729. t.lineNumber = f.lineNumber;
  3730. t.columnNumber = f.columnNumber;
  3731. return t;
  3732. }
  3733. /**
  3734. * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
  3735. * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
  3736. */
  3737. function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
  3738. var attrName;
  3739. var value;
  3740. var p = ++start;
  3741. var s = S_TAG;//status
  3742. while(true){
  3743. var c = source.charAt(p);
  3744. switch(c){
  3745. case '=':
  3746. if(s === S_ATTR){//attrName
  3747. attrName = source.slice(start,p);
  3748. s = S_EQ;
  3749. }else if(s === S_ATTR_SPACE){
  3750. s = S_EQ;
  3751. }else{
  3752. //fatalError: equal must after attrName or space after attrName
  3753. throw new Error('attribute equal must after attrName');
  3754. }
  3755. break;
  3756. case '\'':
  3757. case '"':
  3758. if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
  3759. ){//equal
  3760. if(s === S_ATTR){
  3761. errorHandler.warning('attribute value must after "="')
  3762. attrName = source.slice(start,p)
  3763. }
  3764. start = p+1;
  3765. p = source.indexOf(c,start)
  3766. if(p>0){
  3767. value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3768. el.add(attrName,value,start-1);
  3769. s = S_ATTR_END;
  3770. }else{
  3771. //fatalError: no end quot match
  3772. throw new Error('attribute value no end \''+c+'\' match');
  3773. }
  3774. }else if(s == S_ATTR_NOQUOT_VALUE){
  3775. value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3776. //console.log(attrName,value,start,p)
  3777. el.add(attrName,value,start);
  3778. //console.dir(el)
  3779. errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
  3780. start = p+1;
  3781. s = S_ATTR_END
  3782. }else{
  3783. //fatalError: no equal before
  3784. throw new Error('attribute value must after "="');
  3785. }
  3786. break;
  3787. case '/':
  3788. switch(s){
  3789. case S_TAG:
  3790. el.setTagName(source.slice(start,p));
  3791. case S_ATTR_END:
  3792. case S_TAG_SPACE:
  3793. case S_TAG_CLOSE:
  3794. s =S_TAG_CLOSE;
  3795. el.closed = true;
  3796. case S_ATTR_NOQUOT_VALUE:
  3797. case S_ATTR:
  3798. case S_ATTR_SPACE:
  3799. break;
  3800. //case S_EQ:
  3801. default:
  3802. throw new Error("attribute invalid close char('/')")
  3803. }
  3804. break;
  3805. case ''://end document
  3806. //throw new Error('unexpected end of input')
  3807. errorHandler.error('unexpected end of input');
  3808. if(s == S_TAG){
  3809. el.setTagName(source.slice(start,p));
  3810. }
  3811. return p;
  3812. case '>':
  3813. switch(s){
  3814. case S_TAG:
  3815. el.setTagName(source.slice(start,p));
  3816. case S_ATTR_END:
  3817. case S_TAG_SPACE:
  3818. case S_TAG_CLOSE:
  3819. break;//normal
  3820. case S_ATTR_NOQUOT_VALUE://Compatible state
  3821. case S_ATTR:
  3822. value = source.slice(start,p);
  3823. if(value.slice(-1) === '/'){
  3824. el.closed = true;
  3825. value = value.slice(0,-1)
  3826. }
  3827. case S_ATTR_SPACE:
  3828. if(s === S_ATTR_SPACE){
  3829. value = attrName;
  3830. }
  3831. if(s == S_ATTR_NOQUOT_VALUE){
  3832. errorHandler.warning('attribute "'+value+'" missed quot(")!!');
  3833. el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
  3834. }else{
  3835. if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
  3836. errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
  3837. }
  3838. el.add(value,value,start)
  3839. }
  3840. break;
  3841. case S_EQ:
  3842. throw new Error('attribute value missed!!');
  3843. }
  3844. // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
  3845. return p;
  3846. /*xml space '\x20' | #x9 | #xD | #xA; */
  3847. case '\u0080':
  3848. c = ' ';
  3849. default:
  3850. if(c<= ' '){//space
  3851. switch(s){
  3852. case S_TAG:
  3853. el.setTagName(source.slice(start,p));//tagName
  3854. s = S_TAG_SPACE;
  3855. break;
  3856. case S_ATTR:
  3857. attrName = source.slice(start,p)
  3858. s = S_ATTR_SPACE;
  3859. break;
  3860. case S_ATTR_NOQUOT_VALUE:
  3861. var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3862. errorHandler.warning('attribute "'+value+'" missed quot(")!!');
  3863. el.add(attrName,value,start)
  3864. case S_ATTR_END:
  3865. s = S_TAG_SPACE;
  3866. break;
  3867. //case S_TAG_SPACE:
  3868. //case S_EQ:
  3869. //case S_ATTR_SPACE:
  3870. // void();break;
  3871. //case S_TAG_CLOSE:
  3872. //ignore warning
  3873. }
  3874. }else{//not space
  3875. //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
  3876. //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
  3877. switch(s){
  3878. //case S_TAG:void();break;
  3879. //case S_ATTR:void();break;
  3880. //case S_ATTR_NOQUOT_VALUE:void();break;
  3881. case S_ATTR_SPACE:
  3882. var tagName = el.tagName;
  3883. if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
  3884. errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
  3885. }
  3886. el.add(attrName,attrName,start);
  3887. start = p;
  3888. s = S_ATTR;
  3889. break;
  3890. case S_ATTR_END:
  3891. errorHandler.warning('attribute space is required"'+attrName+'"!!')
  3892. case S_TAG_SPACE:
  3893. s = S_ATTR;
  3894. start = p;
  3895. break;
  3896. case S_EQ:
  3897. s = S_ATTR_NOQUOT_VALUE;
  3898. start = p;
  3899. break;
  3900. case S_TAG_CLOSE:
  3901. throw new Error("elements closed character '/' and '>' must be connected to");
  3902. }
  3903. }
  3904. }//end outer switch
  3905. //console.log('p++',p)
  3906. p++;
  3907. }
  3908. }
  3909. /**
  3910. * @return true if has new namespace define
  3911. */
  3912. function appendElement(el,domBuilder,currentNSMap){
  3913. var tagName = el.tagName;
  3914. var localNSMap = null;
  3915. //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
  3916. var i = el.length;
  3917. while(i--){
  3918. var a = el[i];
  3919. var qName = a.qName;
  3920. var value = a.value;
  3921. var nsp = qName.indexOf(':');
  3922. if(nsp>0){
  3923. var prefix = a.prefix = qName.slice(0,nsp);
  3924. var localName = qName.slice(nsp+1);
  3925. var nsPrefix = prefix === 'xmlns' && localName
  3926. }else{
  3927. localName = qName;
  3928. prefix = null
  3929. nsPrefix = qName === 'xmlns' && ''
  3930. }
  3931. //can not set prefix,because prefix !== ''
  3932. a.localName = localName ;
  3933. //prefix == null for no ns prefix attribute
  3934. if(nsPrefix !== false){//hack!!
  3935. if(localNSMap == null){
  3936. localNSMap = {}
  3937. //console.log(currentNSMap,0)
  3938. _copy(currentNSMap,currentNSMap={})
  3939. //console.log(currentNSMap,1)
  3940. }
  3941. currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
  3942. a.uri = 'http://www.w3.org/2000/xmlns/'
  3943. domBuilder.startPrefixMapping(nsPrefix, value)
  3944. }
  3945. }
  3946. var i = el.length;
  3947. while(i--){
  3948. a = el[i];
  3949. var prefix = a.prefix;
  3950. if(prefix){//no prefix attribute has no namespace
  3951. if(prefix === 'xml'){
  3952. a.uri = 'http://www.w3.org/XML/1998/namespace';
  3953. }if(prefix !== 'xmlns'){
  3954. a.uri = currentNSMap[prefix || '']
  3955. //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
  3956. }
  3957. }
  3958. }
  3959. var nsp = tagName.indexOf(':');
  3960. if(nsp>0){
  3961. prefix = el.prefix = tagName.slice(0,nsp);
  3962. localName = el.localName = tagName.slice(nsp+1);
  3963. }else{
  3964. prefix = null;//important!!
  3965. localName = el.localName = tagName;
  3966. }
  3967. //no prefix element has default namespace
  3968. var ns = el.uri = currentNSMap[prefix || ''];
  3969. domBuilder.startElement(ns,localName,tagName,el);
  3970. //endPrefixMapping and startPrefixMapping have not any help for dom builder
  3971. //localNSMap = null
  3972. if(el.closed){
  3973. domBuilder.endElement(ns,localName,tagName);
  3974. if(localNSMap){
  3975. for(prefix in localNSMap){
  3976. domBuilder.endPrefixMapping(prefix)
  3977. }
  3978. }
  3979. }else{
  3980. el.currentNSMap = currentNSMap;
  3981. el.localNSMap = localNSMap;
  3982. //parseStack.push(el);
  3983. return true;
  3984. }
  3985. }
  3986. function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
  3987. if(/^(?:script|textarea)$/i.test(tagName)){
  3988. var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
  3989. var text = source.substring(elStartEnd+1,elEndStart);
  3990. if(/[&<]/.test(text)){
  3991. if(/^script$/i.test(tagName)){
  3992. //if(!/\]\]>/.test(text)){
  3993. //lexHandler.startCDATA();
  3994. domBuilder.characters(text,0,text.length);
  3995. //lexHandler.endCDATA();
  3996. return elEndStart;
  3997. //}
  3998. }//}else{//text area
  3999. text = text.replace(/&#?\w+;/g,entityReplacer);
  4000. domBuilder.characters(text,0,text.length);
  4001. return elEndStart;
  4002. //}
  4003. }
  4004. }
  4005. return elStartEnd+1;
  4006. }
  4007. function fixSelfClosed(source,elStartEnd,tagName,closeMap){
  4008. //if(tagName in closeMap){
  4009. var pos = closeMap[tagName];
  4010. if(pos == null){
  4011. //console.log(tagName)
  4012. pos = source.lastIndexOf('</'+tagName+'>')
  4013. if(pos<elStartEnd){//忘记闭合
  4014. pos = source.lastIndexOf('</'+tagName)
  4015. }
  4016. closeMap[tagName] =pos
  4017. }
  4018. return pos<elStartEnd;
  4019. //}
  4020. }
  4021. function _copy(source,target){
  4022. for(var n in source){target[n] = source[n]}
  4023. }
  4024. function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
  4025. var next= source.charAt(start+2)
  4026. switch(next){
  4027. case '-':
  4028. if(source.charAt(start + 3) === '-'){
  4029. var end = source.indexOf('-->',start+4);
  4030. //append comment source.substring(4,end)//<!--
  4031. if(end>start){
  4032. domBuilder.comment(source,start+4,end-start-4);
  4033. return end+3;
  4034. }else{
  4035. errorHandler.error("Unclosed comment");
  4036. return -1;
  4037. }
  4038. }else{
  4039. //error
  4040. return -1;
  4041. }
  4042. default:
  4043. if(source.substr(start+3,6) == 'CDATA['){
  4044. var end = source.indexOf(']]>',start+9);
  4045. domBuilder.startCDATA();
  4046. domBuilder.characters(source,start+9,end-start-9);
  4047. domBuilder.endCDATA()
  4048. return end+3;
  4049. }
  4050. //<!DOCTYPE
  4051. //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
  4052. var matchs = split(source,start);
  4053. var len = matchs.length;
  4054. if(len>1 && /!doctype/i.test(matchs[0][0])){
  4055. var name = matchs[1][0];
  4056. var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
  4057. var sysid = len>4 && matchs[4][0];
  4058. var lastMatch = matchs[len-1]
  4059. domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
  4060. sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
  4061. domBuilder.endDTD();
  4062. return lastMatch.index+lastMatch[0].length
  4063. }
  4064. }
  4065. return -1;
  4066. }
  4067. function parseInstruction(source,start,domBuilder){
  4068. var end = source.indexOf('?>',start);
  4069. if(end){
  4070. var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
  4071. if(match){
  4072. var len = match[0].length;
  4073. domBuilder.processingInstruction(match[1], match[2]) ;
  4074. return end+2;
  4075. }else{//error
  4076. return -1;
  4077. }
  4078. }
  4079. return -1;
  4080. }
  4081. /**
  4082. * @param source
  4083. */
  4084. function ElementAttributes(source){
  4085. }
  4086. ElementAttributes.prototype = {
  4087. setTagName:function(tagName){
  4088. if(!tagNamePattern.test(tagName)){
  4089. throw new Error('invalid tagName:'+tagName)
  4090. }
  4091. this.tagName = tagName
  4092. },
  4093. add:function(qName,value,offset){
  4094. if(!tagNamePattern.test(qName)){
  4095. throw new Error('invalid attribute:'+qName)
  4096. }
  4097. this[this.length++] = {qName:qName,value:value,offset:offset}
  4098. },
  4099. length:0,
  4100. getLocalName:function(i){return this[i].localName},
  4101. getLocator:function(i){return this[i].locator},
  4102. getQName:function(i){return this[i].qName},
  4103. getURI:function(i){return this[i].uri},
  4104. getValue:function(i){return this[i].value}
  4105. // ,getIndex:function(uri, localName)){
  4106. // if(localName){
  4107. //
  4108. // }else{
  4109. // var qName = uri
  4110. // }
  4111. // },
  4112. // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
  4113. // getType:function(uri,localName){}
  4114. // getType:function(i){},
  4115. }
  4116. function _set_proto_(thiz,parent){
  4117. thiz.__proto__ = parent;
  4118. return thiz;
  4119. }
  4120. if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
  4121. _set_proto_ = function(thiz,parent){
  4122. function p(){};
  4123. p.prototype = parent;
  4124. p = new p();
  4125. for(parent in thiz){
  4126. p[parent] = thiz[parent];
  4127. }
  4128. return p;
  4129. }
  4130. }
  4131. function split(source,start){
  4132. var match;
  4133. var buf = [];
  4134. var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
  4135. reg.lastIndex = start;
  4136. reg.exec(source);//skip <
  4137. while(match = reg.exec(source)){
  4138. buf.push(match);
  4139. if(match[1])return buf;
  4140. }
  4141. }
  4142. exports.XMLReader = XMLReader;
  4143. /***/ }),
  4144. /* 14 */
  4145. /***/ (function(module, exports) {
  4146. //copyright Ryan Day 2010 <http://ryanday.org>, Joscha Feth 2013 <http://www.feth.com> [MIT Licensed]
  4147. var element_start_char = "a-zA-Z_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FFF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";
  4148. var element_non_start_char = "\-.0-9\u00B7\u0300-\u036F\u203F\u2040";
  4149. var element_replace = new RegExp("^([^" + element_start_char + "])|^((x|X)(m|M)(l|L))|([^" + element_start_char + element_non_start_char + "])", "g");
  4150. var not_safe_in_xml = /[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm;
  4151. var objKeys = function (obj) {
  4152. var l = [];
  4153. if (obj instanceof Object) {
  4154. for (var k in obj) {
  4155. if (obj.hasOwnProperty(k)) {
  4156. l.push(k);
  4157. }
  4158. }
  4159. }
  4160. return l;
  4161. };
  4162. var process_to_xml = function (node_data, options) {
  4163. var makeNode = function (name, content, attributes, level, hasSubNodes) {
  4164. var indent_value = options.indent !== undefined ? options.indent : "\t";
  4165. var indent = options.prettyPrint ? '\n' + new Array(level).join(indent_value) : '';
  4166. if (options.removeIllegalNameCharacters) {
  4167. name = name.replace(element_replace, '_');
  4168. }
  4169. var node = [indent, '<', name, attributes || ''];
  4170. if (content && content.length > 0) {
  4171. node.push('>');
  4172. node.push(content);
  4173. hasSubNodes && node.push(indent);
  4174. node.push('</');
  4175. node.push(name);
  4176. node.push('>');
  4177. } else {
  4178. node.push('/>');
  4179. }
  4180. return node.join('');
  4181. };
  4182. return function fn(node_data, node_descriptor, level) {
  4183. var type = typeof node_data;
  4184. if (Array.isArray ? Array.isArray(node_data) : node_data instanceof Array) {
  4185. type = 'array';
  4186. } else if (node_data instanceof Date) {
  4187. type = 'date';
  4188. }
  4189. switch (type) {
  4190. //if value is an array create child nodes from values
  4191. case 'array':
  4192. var ret = [];
  4193. node_data.map(function (v) {
  4194. ret.push(fn(v, 1, level + 1));
  4195. //entries that are values of an array are the only ones that can be special node descriptors
  4196. });
  4197. options.prettyPrint && ret.push('\n');
  4198. return ret.join('');
  4199. break;
  4200. case 'date':
  4201. // cast dates to ISO 8601 date (soap likes it)
  4202. return node_data.toJSON ? node_data.toJSON() : node_data + '';
  4203. break;
  4204. case 'object':
  4205. var nodes = [];
  4206. for (var name in node_data) {
  4207. if (node_data.hasOwnProperty(name)) {
  4208. if (node_data[name] instanceof Array) {
  4209. for (var j = 0; j < node_data[name].length; j++) {
  4210. if (node_data[name].hasOwnProperty(j)) {
  4211. nodes.push(makeNode(name, fn(node_data[name][j], 0, level + 1), null, level + 1, objKeys(node_data[name][j]).length));
  4212. }
  4213. }
  4214. } else {
  4215. nodes.push(makeNode(name, fn(node_data[name], 0, level + 1), null, level + 1));
  4216. }
  4217. }
  4218. }
  4219. options.prettyPrint && nodes.length > 0 && nodes.push('\n');
  4220. return nodes.join('');
  4221. break;
  4222. case 'function':
  4223. return node_data();
  4224. break;
  4225. default:
  4226. return options.escape ? esc(node_data) : '' + node_data;
  4227. }
  4228. }(node_data, 0, 0);
  4229. };
  4230. var xml_header = function (standalone) {
  4231. var ret = ['<?xml version="1.0" encoding="UTF-8"'];
  4232. if (standalone) {
  4233. ret.push(' standalone="yes"');
  4234. }
  4235. ret.push('?>');
  4236. return ret.join('');
  4237. };
  4238. function esc(str) {
  4239. return ('' + str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&apos;').replace(/"/g, '&quot;').replace(not_safe_in_xml, '');
  4240. }
  4241. module.exports = function (obj, options) {
  4242. if (!options) {
  4243. options = {
  4244. xmlHeader: {
  4245. standalone: true
  4246. },
  4247. prettyPrint: true,
  4248. indent: " ",
  4249. escape: true
  4250. };
  4251. }
  4252. if (typeof obj == 'string') {
  4253. try {
  4254. obj = JSON.parse(obj.toString());
  4255. } catch (e) {
  4256. return false;
  4257. }
  4258. }
  4259. var xmlheader = '';
  4260. var docType = '';
  4261. if (options) {
  4262. if (typeof options == 'object') {
  4263. // our config is an object
  4264. if (options.xmlHeader) {
  4265. // the user wants an xml header
  4266. xmlheader = xml_header(!!options.xmlHeader.standalone);
  4267. }
  4268. if (typeof options.docType != 'undefined') {
  4269. docType = '<!DOCTYPE ' + options.docType + '>';
  4270. }
  4271. } else {
  4272. // our config is a boolean value, so just add xml header
  4273. xmlheader = xml_header();
  4274. }
  4275. }
  4276. options = options || {};
  4277. var ret = [xmlheader, options.prettyPrint && docType ? '\n' : '', docType, process_to_xml(obj, options)];
  4278. return ret.join('').replace(/\n{2,}/g, '\n').replace(/\s+$/g, '');
  4279. };
  4280. /***/ }),
  4281. /* 15 */
  4282. /***/ (function(module, exports, __webpack_require__) {
  4283. var session = __webpack_require__(4);
  4284. var util = __webpack_require__(0);
  4285. var originApiMap = {};
  4286. var transferToTaskMethod = function (apiMap, apiName) {
  4287. originApiMap[apiName] = apiMap[apiName];
  4288. apiMap[apiName] = function (params, callback) {
  4289. if (params.SkipTask) {
  4290. originApiMap[apiName].call(this, params, callback);
  4291. } else {
  4292. this._addTask(apiName, params, callback);
  4293. }
  4294. };
  4295. };
  4296. var initTask = function (cos) {
  4297. var queue = [];
  4298. var tasks = {};
  4299. var uploadingFileCount = 0;
  4300. var nextUploadIndex = 0;
  4301. // 接口返回简略的任务信息
  4302. var formatTask = function (task) {
  4303. var t = {
  4304. id: task.id,
  4305. Bucket: task.Bucket,
  4306. Region: task.Region,
  4307. Key: task.Key,
  4308. FilePath: task.FilePath,
  4309. state: task.state,
  4310. loaded: task.loaded,
  4311. size: task.size,
  4312. speed: task.speed,
  4313. percent: task.percent,
  4314. hashPercent: task.hashPercent,
  4315. error: task.error
  4316. };
  4317. if (task.FilePath) t.FilePath = task.FilePath;
  4318. if (task._custom) t._custom = task._custom; // 控制台使用
  4319. return t;
  4320. };
  4321. var emitListUpdate = function () {
  4322. var timer;
  4323. var emit = function () {
  4324. timer = 0;
  4325. cos.emit('task-list-update', { list: util.map(queue, formatTask) });
  4326. cos.emit('list-update', { list: util.map(queue, formatTask) });
  4327. };
  4328. return function () {
  4329. if (!timer) timer = setTimeout(emit);
  4330. };
  4331. }();
  4332. var clearQueue = function () {
  4333. if (queue.length <= cos.options.UploadQueueSize) return;
  4334. for (var i = 0; i < nextUploadIndex && // 小于当前操作的 index 才清理
  4335. i < queue.length && // 大于队列才清理
  4336. queue.length > cos.options.UploadQueueSize // 如果还太多,才继续清理
  4337. ;) {
  4338. var isActive = queue[i].state === 'waiting' || queue[i].state === 'checking' || queue[i].state === 'uploading';
  4339. if (!queue[i] || !isActive) {
  4340. tasks[queue[i].id] && delete tasks[queue[i].id];
  4341. queue.splice(i, 1);
  4342. nextUploadIndex--;
  4343. } else {
  4344. i++;
  4345. }
  4346. }
  4347. emitListUpdate();
  4348. };
  4349. var startNextTask = function () {
  4350. // 检查是否允许增加执行进程
  4351. if (uploadingFileCount >= cos.options.FileParallelLimit) return;
  4352. // 跳过不可执行的任务
  4353. while (queue[nextUploadIndex] && queue[nextUploadIndex].state !== 'waiting') nextUploadIndex++;
  4354. // 检查是否已遍历结束
  4355. if (nextUploadIndex >= queue.length) return;
  4356. // 上传该遍历到的任务
  4357. var task = queue[nextUploadIndex];
  4358. nextUploadIndex++;
  4359. uploadingFileCount++;
  4360. task.state = 'checking';
  4361. task.params.onTaskStart && task.params.onTaskStart(formatTask(task));
  4362. !task.params.UploadData && (task.params.UploadData = {});
  4363. var apiParams = util.formatParams(task.api, task.params);
  4364. originApiMap[task.api].call(cos, apiParams, function (err, data) {
  4365. if (!cos._isRunningTask(task.id)) return;
  4366. if (task.state === 'checking' || task.state === 'uploading') {
  4367. task.state = err ? 'error' : 'success';
  4368. err && (task.error = err);
  4369. uploadingFileCount--;
  4370. emitListUpdate();
  4371. startNextTask();
  4372. task.callback && task.callback(err, data);
  4373. if (task.state === 'success') {
  4374. if (task.params) {
  4375. delete task.params.UploadData;
  4376. delete task.params.Body;
  4377. delete task.params;
  4378. }
  4379. delete task.callback;
  4380. }
  4381. }
  4382. clearQueue();
  4383. });
  4384. emitListUpdate();
  4385. // 异步执行下一个任务
  4386. setTimeout(startNextTask);
  4387. };
  4388. var killTask = function (id, switchToState) {
  4389. var task = tasks[id];
  4390. if (!task) return;
  4391. var waiting = task && task.state === 'waiting';
  4392. var running = task && (task.state === 'checking' || task.state === 'uploading');
  4393. if (switchToState === 'canceled' && task.state !== 'canceled' || switchToState === 'paused' && waiting || switchToState === 'paused' && running) {
  4394. if (switchToState === 'paused' && task.params.Body && typeof task.params.Body.pipe === 'function') {
  4395. console.error('stream not support pause');
  4396. return;
  4397. }
  4398. task.state = switchToState;
  4399. cos.emit('inner-kill-task', { TaskId: id, toState: switchToState });
  4400. try {
  4401. var UploadId = task && task.params && task.params.UploadData.UploadId;
  4402. } catch (e) {}
  4403. if (switchToState === 'canceled' && UploadId) session.removeUsing(UploadId);
  4404. emitListUpdate();
  4405. if (running) {
  4406. uploadingFileCount--;
  4407. startNextTask();
  4408. }
  4409. if (switchToState === 'canceled') {
  4410. if (task.params) {
  4411. delete task.params.UploadData;
  4412. delete task.params.Body;
  4413. delete task.params;
  4414. }
  4415. delete task.callback;
  4416. }
  4417. }
  4418. clearQueue();
  4419. };
  4420. cos._addTasks = function (taskList) {
  4421. util.each(taskList, function (task) {
  4422. cos._addTask(task.api, task.params, task.callback, true);
  4423. });
  4424. emitListUpdate();
  4425. };
  4426. var isTaskReadyWarning = true;
  4427. cos._addTask = function (api, params, callback, ignoreAddEvent) {
  4428. // 复制参数对象
  4429. params = util.formatParams(api, params);
  4430. // 生成 id
  4431. var id = util.uuid();
  4432. params.TaskId = id;
  4433. params.onTaskReady && params.onTaskReady(id);
  4434. if (params.TaskReady) {
  4435. params.TaskReady(id);
  4436. isTaskReadyWarning && console.warn('warning: Param "TaskReady" has been deprecated. Please use "onTaskReady" instead.');
  4437. isTaskReadyWarning = false;
  4438. }
  4439. var task = {
  4440. // env
  4441. params: params,
  4442. callback: callback,
  4443. api: api,
  4444. index: queue.length,
  4445. // task
  4446. id: id,
  4447. Bucket: params.Bucket,
  4448. Region: params.Region,
  4449. Key: params.Key,
  4450. FilePath: params.FilePath || '',
  4451. state: 'waiting',
  4452. loaded: 0,
  4453. size: 0,
  4454. speed: 0,
  4455. percent: 0,
  4456. hashPercent: 0,
  4457. error: null,
  4458. _custom: params._custom
  4459. };
  4460. var onHashProgress = params.onHashProgress;
  4461. params.onHashProgress = function (info) {
  4462. if (!cos._isRunningTask(task.id)) return;
  4463. task.hashPercent = info.percent;
  4464. onHashProgress && onHashProgress(info);
  4465. emitListUpdate();
  4466. };
  4467. var onProgress = params.onProgress;
  4468. params.onProgress = function (info) {
  4469. if (!cos._isRunningTask(task.id)) return;
  4470. task.state === 'checking' && (task.state = 'uploading');
  4471. task.loaded = info.loaded;
  4472. task.speed = info.speed;
  4473. task.percent = info.percent;
  4474. onProgress && onProgress(info);
  4475. emitListUpdate();
  4476. };
  4477. // 异步获取 filesize
  4478. util.getFileSize(api, params, function (err, size) {
  4479. // 开始处理上传
  4480. if (err) return callback(util.error(err)); // 如果获取大小出错,不加入队列
  4481. // 获取完文件大小再把任务加入队列
  4482. tasks[id] = task;
  4483. queue.push(task);
  4484. task.size = size;
  4485. !ignoreAddEvent && emitListUpdate();
  4486. startNextTask();
  4487. clearQueue();
  4488. });
  4489. return id;
  4490. };
  4491. cos._isRunningTask = function (id) {
  4492. var task = tasks[id];
  4493. return !!(task && (task.state === 'checking' || task.state === 'uploading'));
  4494. };
  4495. cos.getTaskList = function () {
  4496. return util.map(queue, formatTask);
  4497. };
  4498. cos.cancelTask = function (id) {
  4499. killTask(id, 'canceled');
  4500. };
  4501. cos.pauseTask = function (id) {
  4502. killTask(id, 'paused');
  4503. };
  4504. cos.restartTask = function (id) {
  4505. var task = tasks[id];
  4506. if (task && (task.state === 'paused' || task.state === 'error')) {
  4507. task.state = 'waiting';
  4508. emitListUpdate();
  4509. nextUploadIndex = Math.min(nextUploadIndex, task.index);
  4510. startNextTask();
  4511. }
  4512. };
  4513. cos.isUploadRunning = function () {
  4514. return uploadingFileCount || nextUploadIndex < queue.length;
  4515. };
  4516. };
  4517. module.exports.transferToTaskMethod = transferToTaskMethod;
  4518. module.exports.init = initTask;
  4519. /***/ }),
  4520. /* 16 */
  4521. /***/ (function(module, exports, __webpack_require__) {
  4522. var REQUEST = __webpack_require__(17);
  4523. var util = __webpack_require__(0);
  4524. // Bucket 相关
  4525. /**
  4526. * 获取用户的 bucket 列表
  4527. * @param {Object} params 回调函数,必须,下面为参数列表
  4528. * 无特殊参数
  4529. * @param {Function} callback 回调函数,必须
  4530. */
  4531. function getService(params, callback) {
  4532. if (typeof params === 'function') {
  4533. callback = params;
  4534. params = {};
  4535. }
  4536. var protocol = this.options.Protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');
  4537. var domain = this.options.ServiceDomain;
  4538. var appId = params.AppId || this.options.appId;
  4539. var region = params.Region;
  4540. if (domain) {
  4541. domain = domain.replace(/\{\{AppId\}\}/ig, appId || '').replace(/\{\{Region\}\}/ig, region || '').replace(/\{\{.*?\}\}/ig, '');
  4542. if (!/^[a-zA-Z]+:\/\//.test(domain)) {
  4543. domain = protocol + '//' + domain;
  4544. }
  4545. if (domain.slice(-1) === '/') {
  4546. domain = domain.slice(0, -1);
  4547. }
  4548. } else if (region) {
  4549. domain = protocol + '//cos.' + region + '.myqcloud.com';
  4550. } else {
  4551. domain = protocol + '//service.cos.myqcloud.com';
  4552. }
  4553. submitRequest.call(this, {
  4554. Action: 'name/cos:GetService',
  4555. url: domain,
  4556. method: 'GET',
  4557. headers: params.Headers
  4558. }, function (err, data) {
  4559. if (err) return callback(err);
  4560. var buckets = data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Buckets && data.ListAllMyBucketsResult.Buckets.Bucket || [];
  4561. buckets = util.isArray(buckets) ? buckets : [buckets];
  4562. var owner = data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Owner || {};
  4563. callback(null, {
  4564. Buckets: buckets,
  4565. Owner: owner,
  4566. statusCode: data.statusCode,
  4567. headers: data.headers
  4568. });
  4569. });
  4570. }
  4571. /**
  4572. * 创建 Bucket,并初始化访问权限
  4573. * @param {Object} params 参数对象,必须
  4574. * @param {String} params.Bucket Bucket名称,必须
  4575. * @param {String} params.Region 地域名称,必须
  4576. * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须
  4577. * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=" ",uin=" ",非必须
  4578. * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=" ",uin=" ",非必须
  4579. * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=" ",uin=" ",非必须
  4580. * @param {Function} callback 回调函数,必须
  4581. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4582. * @return {Object} data 返回的数据
  4583. * @return {String} data.Location 操作地址
  4584. */
  4585. function putBucket(params, callback) {
  4586. var self = this;
  4587. var xml = '';
  4588. if (params['BucketAZConfig']) {
  4589. var CreateBucketConfiguration = {
  4590. BucketAZConfig: params.BucketAZConfig
  4591. };
  4592. xml = util.json2xml({ CreateBucketConfiguration: CreateBucketConfiguration });
  4593. }
  4594. submitRequest.call(this, {
  4595. Action: 'name/cos:PutBucket',
  4596. method: 'PUT',
  4597. Bucket: params.Bucket,
  4598. Region: params.Region,
  4599. headers: params.Headers,
  4600. body: xml
  4601. }, function (err, data) {
  4602. if (err) return callback(err);
  4603. var url = getUrl({
  4604. protocol: self.options.Protocol,
  4605. domain: self.options.Domain,
  4606. bucket: params.Bucket,
  4607. region: params.Region,
  4608. isLocation: true
  4609. });
  4610. callback(null, {
  4611. Location: url,
  4612. statusCode: data.statusCode,
  4613. headers: data.headers
  4614. });
  4615. });
  4616. }
  4617. /**
  4618. * 查看是否存在该Bucket,是否有权限访问
  4619. * @param {Object} params 参数对象,必须
  4620. * @param {String} params.Bucket Bucket名称,必须
  4621. * @param {String} params.Region 地域名称,必须
  4622. * @param {Function} callback 回调函数,必须
  4623. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4624. * @return {Object} data 返回的数据
  4625. * @return {Boolean} data.BucketExist Bucket是否存在
  4626. * @return {Boolean} data.BucketAuth 是否有 Bucket 的访问权限
  4627. */
  4628. function headBucket(params, callback) {
  4629. submitRequest.call(this, {
  4630. Action: 'name/cos:HeadBucket',
  4631. Bucket: params.Bucket,
  4632. Region: params.Region,
  4633. headers: params.Headers,
  4634. method: 'HEAD'
  4635. }, callback);
  4636. }
  4637. /**
  4638. * 获取 Bucket 下的 object 列表
  4639. * @param {Object} params 参数对象,必须
  4640. * @param {String} params.Bucket Bucket名称,必须
  4641. * @param {String} params.Region 地域名称,必须
  4642. * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须
  4643. * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,非必须
  4644. * @param {String} params.Marker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须
  4645. * @param {String} params.MaxKeys 单次返回最大的条目数量,默认1000,非必须
  4646. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  4647. * @param {Function} callback 回调函数,必须
  4648. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4649. * @return {Object} data 返回的数据
  4650. * @return {Object} data.ListBucketResult 返回的 object 列表信息
  4651. */
  4652. function getBucket(params, callback) {
  4653. var reqParams = {};
  4654. reqParams['prefix'] = params['Prefix'] || '';
  4655. reqParams['delimiter'] = params['Delimiter'];
  4656. reqParams['marker'] = params['Marker'];
  4657. reqParams['max-keys'] = params['MaxKeys'];
  4658. reqParams['encoding-type'] = params['EncodingType'];
  4659. submitRequest.call(this, {
  4660. Action: 'name/cos:GetBucket',
  4661. ResourceKey: reqParams['prefix'],
  4662. method: 'GET',
  4663. Bucket: params.Bucket,
  4664. Region: params.Region,
  4665. headers: params.Headers,
  4666. qs: reqParams
  4667. }, function (err, data) {
  4668. if (err) return callback(err);
  4669. var ListBucketResult = data.ListBucketResult || {};
  4670. var Contents = ListBucketResult.Contents || [];
  4671. var CommonPrefixes = ListBucketResult.CommonPrefixes || [];
  4672. Contents = util.isArray(Contents) ? Contents : [Contents];
  4673. CommonPrefixes = util.isArray(CommonPrefixes) ? CommonPrefixes : [CommonPrefixes];
  4674. var result = util.clone(ListBucketResult);
  4675. util.extend(result, {
  4676. Contents: Contents,
  4677. CommonPrefixes: CommonPrefixes,
  4678. statusCode: data.statusCode,
  4679. headers: data.headers
  4680. });
  4681. callback(null, result);
  4682. });
  4683. }
  4684. /**
  4685. * 删除 Bucket
  4686. * @param {Object} params 参数对象,必须
  4687. * @param {String} params.Bucket Bucket名称,必须
  4688. * @param {String} params.Region 地域名称,必须
  4689. * @param {Function} callback 回调函数,必须
  4690. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4691. * @return {Object} data 返回的数据
  4692. * @return {String} data.Location 操作地址
  4693. */
  4694. function deleteBucket(params, callback) {
  4695. submitRequest.call(this, {
  4696. Action: 'name/cos:DeleteBucket',
  4697. Bucket: params.Bucket,
  4698. Region: params.Region,
  4699. headers: params.Headers,
  4700. method: 'DELETE'
  4701. }, function (err, data) {
  4702. if (err && err.statusCode === 204) {
  4703. return callback(null, { statusCode: err.statusCode });
  4704. } else if (err) {
  4705. return callback(err);
  4706. }
  4707. callback(null, {
  4708. statusCode: data.statusCode,
  4709. headers: data.headers
  4710. });
  4711. });
  4712. }
  4713. /**
  4714. * 设置 Bucket 的 权限列表
  4715. * @param {Object} params 参数对象,必须
  4716. * @param {String} params.Bucket Bucket名称,必须
  4717. * @param {String} params.Region 地域名称,必须
  4718. * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须
  4719. * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=" ",uin=" ",非必须
  4720. * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=" ",uin=" ",非必须
  4721. * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=" ",uin=" ",非必须
  4722. * @param {Function} callback 回调函数,必须
  4723. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4724. * @return {Object} data 返回的数据
  4725. */
  4726. function putBucketAcl(params, callback) {
  4727. var headers = params.Headers;
  4728. var xml = '';
  4729. if (params['AccessControlPolicy']) {
  4730. var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});
  4731. var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;
  4732. Grants = util.isArray(Grants) ? Grants : [Grants];
  4733. delete AccessControlPolicy.Grant;
  4734. delete AccessControlPolicy.Grants;
  4735. AccessControlPolicy.AccessControlList = { Grant: Grants };
  4736. xml = util.json2xml({ AccessControlPolicy: AccessControlPolicy });
  4737. headers['Content-Type'] = 'application/xml';
  4738. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  4739. }
  4740. // Grant Header 去重
  4741. util.each(headers, function (val, key) {
  4742. if (key.indexOf('x-cos-grant-') === 0) {
  4743. headers[key] = uniqGrant(headers[key]);
  4744. }
  4745. });
  4746. submitRequest.call(this, {
  4747. Action: 'name/cos:PutBucketACL',
  4748. method: 'PUT',
  4749. Bucket: params.Bucket,
  4750. Region: params.Region,
  4751. headers: headers,
  4752. action: 'acl',
  4753. body: xml
  4754. }, function (err, data) {
  4755. if (err) return callback(err);
  4756. callback(null, {
  4757. statusCode: data.statusCode,
  4758. headers: data.headers
  4759. });
  4760. });
  4761. }
  4762. /**
  4763. * 获取 Bucket 的 权限列表
  4764. * @param {Object} params 参数对象,必须
  4765. * @param {String} params.Bucket Bucket名称,必须
  4766. * @param {String} params.Region 地域名称,必须
  4767. * @param {Function} callback 回调函数,必须
  4768. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4769. * @return {Object} data 返回的数据
  4770. * @return {Object} data.AccessControlPolicy 访问权限信息
  4771. */
  4772. function getBucketAcl(params, callback) {
  4773. submitRequest.call(this, {
  4774. Action: 'name/cos:GetBucketACL',
  4775. method: 'GET',
  4776. Bucket: params.Bucket,
  4777. Region: params.Region,
  4778. headers: params.Headers,
  4779. action: 'acl'
  4780. }, function (err, data) {
  4781. if (err) return callback(err);
  4782. var AccessControlPolicy = data.AccessControlPolicy || {};
  4783. var Owner = AccessControlPolicy.Owner || {};
  4784. var Grant = AccessControlPolicy.AccessControlList.Grant || [];
  4785. Grant = util.isArray(Grant) ? Grant : [Grant];
  4786. var result = decodeAcl(AccessControlPolicy);
  4787. if (data.headers && data.headers['x-cos-acl']) {
  4788. result.ACL = data.headers['x-cos-acl'];
  4789. }
  4790. result = util.extend(result, {
  4791. Owner: Owner,
  4792. Grants: Grant,
  4793. statusCode: data.statusCode,
  4794. headers: data.headers
  4795. });
  4796. callback(null, result);
  4797. });
  4798. }
  4799. /**
  4800. * 设置 Bucket 的 跨域设置
  4801. * @param {Object} params 参数对象,必须
  4802. * @param {String} params.Bucket Bucket名称,必须
  4803. * @param {String} params.Region 地域名称,必须
  4804. * @param {Object} params.CORSConfiguration 相关的跨域设置,必须
  4805. * @param {Array} params.CORSConfiguration.CORSRules 对应的跨域规则
  4806. * @param {Function} callback 回调函数,必须
  4807. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4808. * @return {Object} data 返回的数据
  4809. */
  4810. function putBucketCors(params, callback) {
  4811. var CORSConfiguration = params['CORSConfiguration'] || {};
  4812. var CORSRules = CORSConfiguration['CORSRules'] || params['CORSRules'] || [];
  4813. CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
  4814. util.each(CORSRules, function (rule) {
  4815. util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {
  4816. var sKey = key + 's';
  4817. var val = rule[sKey] || rule[key] || [];
  4818. delete rule[sKey];
  4819. rule[key] = util.isArray(val) ? val : [val];
  4820. });
  4821. });
  4822. var xml = util.json2xml({ CORSConfiguration: { CORSRule: CORSRules } });
  4823. var headers = params.Headers;
  4824. headers['Content-Type'] = 'application/xml';
  4825. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  4826. submitRequest.call(this, {
  4827. Action: 'name/cos:PutBucketCORS',
  4828. method: 'PUT',
  4829. Bucket: params.Bucket,
  4830. Region: params.Region,
  4831. body: xml,
  4832. action: 'cors',
  4833. headers: headers
  4834. }, function (err, data) {
  4835. if (err) return callback(err);
  4836. callback(null, {
  4837. statusCode: data.statusCode,
  4838. headers: data.headers
  4839. });
  4840. });
  4841. }
  4842. /**
  4843. * 获取 Bucket 的 跨域设置
  4844. * @param {Object} params 参数对象,必须
  4845. * @param {String} params.Bucket Bucket名称,必须
  4846. * @param {String} params.Region 地域名称,必须
  4847. * @param {Function} callback 回调函数,必须
  4848. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4849. * @return {Object} data 返回的数据
  4850. * @return {Object} data.CORSRules Bucket的跨域设置
  4851. */
  4852. function getBucketCors(params, callback) {
  4853. submitRequest.call(this, {
  4854. Action: 'name/cos:GetBucketCORS',
  4855. method: 'GET',
  4856. Bucket: params.Bucket,
  4857. Region: params.Region,
  4858. headers: params.Headers,
  4859. action: 'cors'
  4860. }, function (err, data) {
  4861. if (err) {
  4862. if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchCORSConfiguration') {
  4863. var result = {
  4864. CORSRules: [],
  4865. statusCode: err.statusCode
  4866. };
  4867. err.headers && (result.headers = err.headers);
  4868. callback(null, result);
  4869. } else {
  4870. callback(err);
  4871. }
  4872. return;
  4873. }
  4874. var CORSConfiguration = data.CORSConfiguration || {};
  4875. var CORSRules = CORSConfiguration.CORSRules || CORSConfiguration.CORSRule || [];
  4876. CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
  4877. util.each(CORSRules, function (rule) {
  4878. util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key) {
  4879. var sKey = key + 's';
  4880. var val = rule[sKey] || rule[key] || [];
  4881. delete rule[key];
  4882. rule[sKey] = util.isArray(val) ? val : [val];
  4883. });
  4884. });
  4885. callback(null, {
  4886. CORSRules: CORSRules,
  4887. statusCode: data.statusCode,
  4888. headers: data.headers
  4889. });
  4890. });
  4891. }
  4892. /**
  4893. * 删除 Bucket 的 跨域设置
  4894. * @param {Object} params 参数对象,必须
  4895. * @param {String} params.Bucket Bucket名称,必须
  4896. * @param {String} params.Region 地域名称,必须
  4897. * @param {Function} callback 回调函数,必须
  4898. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4899. * @return {Object} data 返回的数据
  4900. */
  4901. function deleteBucketCors(params, callback) {
  4902. submitRequest.call(this, {
  4903. Action: 'name/cos:DeleteBucketCORS',
  4904. method: 'DELETE',
  4905. Bucket: params.Bucket,
  4906. Region: params.Region,
  4907. headers: params.Headers,
  4908. action: 'cors'
  4909. }, function (err, data) {
  4910. if (err && err.statusCode === 204) {
  4911. return callback(null, { statusCode: err.statusCode });
  4912. } else if (err) {
  4913. return callback(err);
  4914. }
  4915. callback(null, {
  4916. statusCode: data.statusCode || err.statusCode,
  4917. headers: data.headers
  4918. });
  4919. });
  4920. }
  4921. /**
  4922. * 获取 Bucket 的 地域信息
  4923. * @param {Object} params 参数对象,必须
  4924. * @param {String} params.Bucket Bucket名称,必须
  4925. * @param {String} params.Region 地域名称,必须
  4926. * @param {Function} callback 回调函数,必须
  4927. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4928. * @return {Object} data 返回数据,包含地域信息 LocationConstraint
  4929. */
  4930. function getBucketLocation(params, callback) {
  4931. submitRequest.call(this, {
  4932. Action: 'name/cos:GetBucketLocation',
  4933. method: 'GET',
  4934. Bucket: params.Bucket,
  4935. Region: params.Region,
  4936. headers: params.Headers,
  4937. action: 'location'
  4938. }, callback);
  4939. }
  4940. function putBucketPolicy(params, callback) {
  4941. var Policy = params['Policy'];
  4942. try {
  4943. if (typeof Policy === 'string') Policy = JSON.parse(Policy);
  4944. } catch (e) {}
  4945. if (!Policy || typeof Policy === 'string') return callback(util.error(new Error('Policy format error')));
  4946. var PolicyStr = JSON.stringify(Policy);
  4947. if (!Policy.version) Policy.version = '2.0';
  4948. var headers = params.Headers;
  4949. headers['Content-Type'] = 'application/json';
  4950. headers['Content-MD5'] = util.binaryBase64(util.md5(PolicyStr));
  4951. submitRequest.call(this, {
  4952. Action: 'name/cos:PutBucketPolicy',
  4953. method: 'PUT',
  4954. Bucket: params.Bucket,
  4955. Region: params.Region,
  4956. action: 'policy',
  4957. body: PolicyStr,
  4958. headers: headers
  4959. }, function (err, data) {
  4960. if (err && err.statusCode === 204) {
  4961. return callback(null, { statusCode: err.statusCode });
  4962. } else if (err) {
  4963. return callback(err);
  4964. }
  4965. callback(null, {
  4966. statusCode: data.statusCode,
  4967. headers: data.headers
  4968. });
  4969. });
  4970. }
  4971. /**
  4972. * 获取 Bucket 的读取权限策略
  4973. * @param {Object} params 参数对象,必须
  4974. * @param {String} params.Bucket Bucket名称,必须
  4975. * @param {String} params.Region 地域名称,必须
  4976. * @param {Function} callback 回调函数,必须
  4977. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4978. * @return {Object} data 返回数据
  4979. */
  4980. function getBucketPolicy(params, callback) {
  4981. submitRequest.call(this, {
  4982. Action: 'name/cos:GetBucketPolicy',
  4983. method: 'GET',
  4984. Bucket: params.Bucket,
  4985. Region: params.Region,
  4986. headers: params.Headers,
  4987. action: 'policy',
  4988. rawBody: true
  4989. }, function (err, data) {
  4990. if (err) {
  4991. if (err.statusCode && err.statusCode === 403) {
  4992. return callback(util.error(err, { ErrorStatus: 'Access Denied' }));
  4993. }
  4994. if (err.statusCode && err.statusCode === 405) {
  4995. return callback(util.error(err, { ErrorStatus: 'Method Not Allowed' }));
  4996. }
  4997. if (err.statusCode && err.statusCode === 404) {
  4998. return callback(util.error(err, { ErrorStatus: 'Policy Not Found' }));
  4999. }
  5000. return callback(err);
  5001. }
  5002. var Policy = {};
  5003. try {
  5004. Policy = JSON.parse(data.body);
  5005. } catch (e) {}
  5006. callback(null, {
  5007. Policy: Policy,
  5008. statusCode: data.statusCode,
  5009. headers: data.headers
  5010. });
  5011. });
  5012. }
  5013. /**
  5014. * 删除 Bucket 的 跨域设置
  5015. * @param {Object} params 参数对象,必须
  5016. * @param {String} params.Bucket Bucket名称,必须
  5017. * @param {String} params.Region 地域名称,必须
  5018. * @param {Function} callback 回调函数,必须
  5019. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5020. * @return {Object} data 返回的数据
  5021. */
  5022. function deleteBucketPolicy(params, callback) {
  5023. submitRequest.call(this, {
  5024. Action: 'name/cos:DeleteBucketPolicy',
  5025. method: 'DELETE',
  5026. Bucket: params.Bucket,
  5027. Region: params.Region,
  5028. headers: params.Headers,
  5029. action: 'policy'
  5030. }, function (err, data) {
  5031. if (err && err.statusCode === 204) {
  5032. return callback(null, { statusCode: err.statusCode });
  5033. } else if (err) {
  5034. return callback(err);
  5035. }
  5036. callback(null, {
  5037. statusCode: data.statusCode || err.statusCode,
  5038. headers: data.headers
  5039. });
  5040. });
  5041. }
  5042. /**
  5043. * 设置 Bucket 的标签
  5044. * @param {Object} params 参数对象,必须
  5045. * @param {String} params.Bucket Bucket名称,必须
  5046. * @param {String} params.Region 地域名称,必须
  5047. * @param {Array} params.TagSet 标签设置,必须
  5048. * @param {Function} callback 回调函数,必须
  5049. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5050. * @return {Object} data 返回数据
  5051. */
  5052. function putBucketTagging(params, callback) {
  5053. var Tagging = params['Tagging'] || {};
  5054. var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];
  5055. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  5056. var xml = util.json2xml({ Tagging: { TagSet: { Tag: Tags } } });
  5057. var headers = params.Headers;
  5058. headers['Content-Type'] = 'application/xml';
  5059. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5060. submitRequest.call(this, {
  5061. Action: 'name/cos:PutBucketTagging',
  5062. method: 'PUT',
  5063. Bucket: params.Bucket,
  5064. Region: params.Region,
  5065. body: xml,
  5066. action: 'tagging',
  5067. headers: headers
  5068. }, function (err, data) {
  5069. if (err && err.statusCode === 204) {
  5070. return callback(null, { statusCode: err.statusCode });
  5071. } else if (err) {
  5072. return callback(err);
  5073. }
  5074. callback(null, {
  5075. statusCode: data.statusCode,
  5076. headers: data.headers
  5077. });
  5078. });
  5079. }
  5080. /**
  5081. * 获取 Bucket 的标签设置
  5082. * @param {Object} params 参数对象,必须
  5083. * @param {String} params.Bucket Bucket名称,必须
  5084. * @param {String} params.Region 地域名称,必须
  5085. * @param {Function} callback 回调函数,必须
  5086. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5087. * @return {Object} data 返回数据
  5088. */
  5089. function getBucketTagging(params, callback) {
  5090. submitRequest.call(this, {
  5091. Action: 'name/cos:GetBucketTagging',
  5092. method: 'GET',
  5093. Bucket: params.Bucket,
  5094. Region: params.Region,
  5095. headers: params.Headers,
  5096. action: 'tagging'
  5097. }, function (err, data) {
  5098. if (err) {
  5099. if (err.statusCode === 404 && err.error && (err.error === "Not Found" || err.error.Code === 'NoSuchTagSet')) {
  5100. var result = {
  5101. Tags: [],
  5102. statusCode: err.statusCode
  5103. };
  5104. err.headers && (result.headers = err.headers);
  5105. callback(null, result);
  5106. } else {
  5107. callback(err);
  5108. }
  5109. return;
  5110. }
  5111. var Tags = [];
  5112. try {
  5113. Tags = data.Tagging.TagSet.Tag || [];
  5114. } catch (e) {}
  5115. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  5116. callback(null, {
  5117. Tags: Tags,
  5118. statusCode: data.statusCode,
  5119. headers: data.headers
  5120. });
  5121. });
  5122. }
  5123. /**
  5124. * 删除 Bucket 的 标签设置
  5125. * @param {Object} params 参数对象,必须
  5126. * @param {String} params.Bucket Bucket名称,必须
  5127. * @param {String} params.Region 地域名称,必须
  5128. * @param {Function} callback 回调函数,必须
  5129. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5130. * @return {Object} data 返回的数据
  5131. */
  5132. function deleteBucketTagging(params, callback) {
  5133. submitRequest.call(this, {
  5134. Action: 'name/cos:DeleteBucketTagging',
  5135. method: 'DELETE',
  5136. Bucket: params.Bucket,
  5137. Region: params.Region,
  5138. headers: params.Headers,
  5139. action: 'tagging'
  5140. }, function (err, data) {
  5141. if (err && err.statusCode === 204) {
  5142. return callback(null, { statusCode: err.statusCode });
  5143. } else if (err) {
  5144. return callback(err);
  5145. }
  5146. callback(null, {
  5147. statusCode: data.statusCode,
  5148. headers: data.headers
  5149. });
  5150. });
  5151. }
  5152. function putBucketLifecycle(params, callback) {
  5153. var LifecycleConfiguration = params['LifecycleConfiguration'] || {};
  5154. var Rules = LifecycleConfiguration.Rules || params.Rules || [];
  5155. Rules = util.clone(Rules);
  5156. var xml = util.json2xml({ LifecycleConfiguration: { Rule: Rules } });
  5157. var headers = params.Headers;
  5158. headers['Content-Type'] = 'application/xml';
  5159. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5160. submitRequest.call(this, {
  5161. Action: 'name/cos:PutBucketLifecycle',
  5162. method: 'PUT',
  5163. Bucket: params.Bucket,
  5164. Region: params.Region,
  5165. body: xml,
  5166. action: 'lifecycle',
  5167. headers: headers
  5168. }, function (err, data) {
  5169. if (err && err.statusCode === 204) {
  5170. return callback(null, { statusCode: err.statusCode });
  5171. } else if (err) {
  5172. return callback(err);
  5173. }
  5174. callback(null, {
  5175. statusCode: data.statusCode,
  5176. headers: data.headers
  5177. });
  5178. });
  5179. }
  5180. function getBucketLifecycle(params, callback) {
  5181. submitRequest.call(this, {
  5182. Action: 'name/cos:GetBucketLifecycle',
  5183. method: 'GET',
  5184. Bucket: params.Bucket,
  5185. Region: params.Region,
  5186. headers: params.Headers,
  5187. action: 'lifecycle'
  5188. }, function (err, data) {
  5189. if (err) {
  5190. if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchLifecycleConfiguration') {
  5191. var result = {
  5192. Rules: [],
  5193. statusCode: err.statusCode
  5194. };
  5195. err.headers && (result.headers = err.headers);
  5196. callback(null, result);
  5197. } else {
  5198. callback(err);
  5199. }
  5200. return;
  5201. }
  5202. var Rules = [];
  5203. try {
  5204. Rules = data.LifecycleConfiguration.Rule || [];
  5205. } catch (e) {}
  5206. Rules = util.clone(util.isArray(Rules) ? Rules : [Rules]);
  5207. callback(null, {
  5208. Rules: Rules,
  5209. statusCode: data.statusCode,
  5210. headers: data.headers
  5211. });
  5212. });
  5213. }
  5214. function deleteBucketLifecycle(params, callback) {
  5215. submitRequest.call(this, {
  5216. Action: 'name/cos:DeleteBucketLifecycle',
  5217. method: 'DELETE',
  5218. Bucket: params.Bucket,
  5219. Region: params.Region,
  5220. headers: params.Headers,
  5221. action: 'lifecycle'
  5222. }, function (err, data) {
  5223. if (err && err.statusCode === 204) {
  5224. return callback(null, { statusCode: err.statusCode });
  5225. } else if (err) {
  5226. return callback(err);
  5227. }
  5228. callback(null, {
  5229. statusCode: data.statusCode,
  5230. headers: data.headers
  5231. });
  5232. });
  5233. }
  5234. function putBucketVersioning(params, callback) {
  5235. if (!params['VersioningConfiguration']) {
  5236. callback(util.error(new Error('missing param VersioningConfiguration')));
  5237. return;
  5238. }
  5239. var VersioningConfiguration = params['VersioningConfiguration'] || {};
  5240. var xml = util.json2xml({ VersioningConfiguration: VersioningConfiguration });
  5241. var headers = params.Headers;
  5242. headers['Content-Type'] = 'application/xml';
  5243. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5244. submitRequest.call(this, {
  5245. Action: 'name/cos:PutBucketVersioning',
  5246. method: 'PUT',
  5247. Bucket: params.Bucket,
  5248. Region: params.Region,
  5249. body: xml,
  5250. action: 'versioning',
  5251. headers: headers
  5252. }, function (err, data) {
  5253. if (err && err.statusCode === 204) {
  5254. return callback(null, { statusCode: err.statusCode });
  5255. } else if (err) {
  5256. return callback(err);
  5257. }
  5258. callback(null, {
  5259. statusCode: data.statusCode,
  5260. headers: data.headers
  5261. });
  5262. });
  5263. }
  5264. function getBucketVersioning(params, callback) {
  5265. submitRequest.call(this, {
  5266. Action: 'name/cos:GetBucketVersioning',
  5267. method: 'GET',
  5268. Bucket: params.Bucket,
  5269. Region: params.Region,
  5270. headers: params.Headers,
  5271. action: 'versioning'
  5272. }, function (err, data) {
  5273. if (!err) {
  5274. !data.VersioningConfiguration && (data.VersioningConfiguration = {});
  5275. }
  5276. callback(err, data);
  5277. });
  5278. }
  5279. function putBucketReplication(params, callback) {
  5280. var ReplicationConfiguration = util.clone(params.ReplicationConfiguration);
  5281. var xml = util.json2xml({ ReplicationConfiguration: ReplicationConfiguration });
  5282. xml = xml.replace(/<(\/?)Rules>/ig, '<$1Rule>');
  5283. xml = xml.replace(/<(\/?)Tags>/ig, '<$1Tag>');
  5284. var headers = params.Headers;
  5285. headers['Content-Type'] = 'application/xml';
  5286. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5287. submitRequest.call(this, {
  5288. Action: 'name/cos:PutBucketReplication',
  5289. method: 'PUT',
  5290. Bucket: params.Bucket,
  5291. Region: params.Region,
  5292. body: xml,
  5293. action: 'replication',
  5294. headers: headers
  5295. }, function (err, data) {
  5296. if (err && err.statusCode === 204) {
  5297. return callback(null, { statusCode: err.statusCode });
  5298. } else if (err) {
  5299. return callback(err);
  5300. }
  5301. callback(null, {
  5302. statusCode: data.statusCode,
  5303. headers: data.headers
  5304. });
  5305. });
  5306. }
  5307. function getBucketReplication(params, callback) {
  5308. submitRequest.call(this, {
  5309. Action: 'name/cos:GetBucketReplication',
  5310. method: 'GET',
  5311. Bucket: params.Bucket,
  5312. Region: params.Region,
  5313. headers: params.Headers,
  5314. action: 'replication'
  5315. }, function (err, data) {
  5316. if (err) {
  5317. if (err.statusCode === 404 && err.error && (err.error === 'Not Found' || err.error.Code === 'ReplicationConfigurationnotFoundError')) {
  5318. var result = {
  5319. ReplicationConfiguration: { Rules: [] },
  5320. statusCode: err.statusCode
  5321. };
  5322. err.headers && (result.headers = err.headers);
  5323. callback(null, result);
  5324. } else {
  5325. callback(err);
  5326. }
  5327. return;
  5328. }
  5329. !data.ReplicationConfiguration && (data.ReplicationConfiguration = {});
  5330. if (data.ReplicationConfiguration.Rule) {
  5331. data.ReplicationConfiguration.Rules = util.makeArray(data.ReplicationConfiguration.Rule);
  5332. delete data.ReplicationConfiguration.Rule;
  5333. }
  5334. callback(err, data);
  5335. });
  5336. }
  5337. function deleteBucketReplication(params, callback) {
  5338. submitRequest.call(this, {
  5339. Action: 'name/cos:DeleteBucketReplication',
  5340. method: 'DELETE',
  5341. Bucket: params.Bucket,
  5342. Region: params.Region,
  5343. headers: params.Headers,
  5344. action: 'replication'
  5345. }, function (err, data) {
  5346. if (err && err.statusCode === 204) {
  5347. return callback(null, { statusCode: err.statusCode });
  5348. } else if (err) {
  5349. return callback(err);
  5350. }
  5351. callback(null, {
  5352. statusCode: data.statusCode,
  5353. headers: data.headers
  5354. });
  5355. });
  5356. }
  5357. /**
  5358. * 设置 Bucket 静态网站配置信息
  5359. * @param {Object} params 参数对象,必须
  5360. * @param {String} params.Bucket Bucket名称,必须
  5361. * @param {String} params.Region 地域名称,必须
  5362. * @param {Object} params.WebsiteConfiguration 地域名称,必须
  5363. * @param {Object} WebsiteConfiguration.IndexDocument 索引文档,必须
  5364. * @param {Object} WebsiteConfiguration.ErrorDocument 错误文档,非必须
  5365. * @param {Object} WebsiteConfiguration.RedirectAllRequestsTo 重定向所有请求,非必须
  5366. * @param {Array} params.RoutingRules 重定向规则,非必须
  5367. * @param {Function} callback 回调函数,必须
  5368. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5369. * @return {Object} data 返回数据
  5370. */
  5371. function putBucketWebsite(params, callback) {
  5372. if (!params['WebsiteConfiguration']) {
  5373. callback(util.error(new Error('missing param WebsiteConfiguration')));
  5374. return;
  5375. }
  5376. var WebsiteConfiguration = util.clone(params['WebsiteConfiguration'] || {});
  5377. var RoutingRules = WebsiteConfiguration['RoutingRules'] || WebsiteConfiguration['RoutingRule'] || [];
  5378. RoutingRules = util.isArray(RoutingRules) ? RoutingRules : [RoutingRules];
  5379. delete WebsiteConfiguration.RoutingRule;
  5380. delete WebsiteConfiguration.RoutingRules;
  5381. if (RoutingRules.length) WebsiteConfiguration.RoutingRules = { RoutingRule: RoutingRules };
  5382. var xml = util.json2xml({ WebsiteConfiguration: WebsiteConfiguration });
  5383. var headers = params.Headers;
  5384. headers['Content-Type'] = 'application/xml';
  5385. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5386. submitRequest.call(this, {
  5387. Action: 'name/cos:PutBucketWebsite',
  5388. method: 'PUT',
  5389. Bucket: params.Bucket,
  5390. Region: params.Region,
  5391. body: xml,
  5392. action: 'website',
  5393. headers: headers
  5394. }, function (err, data) {
  5395. if (err && err.statusCode === 204) {
  5396. return callback(null, { statusCode: err.statusCode });
  5397. } else if (err) {
  5398. return callback(err);
  5399. }
  5400. callback(null, {
  5401. statusCode: data.statusCode,
  5402. headers: data.headers
  5403. });
  5404. });
  5405. }
  5406. /**
  5407. * 获取 Bucket 的静态网站配置信息
  5408. * @param {Object} params 参数对象,必须
  5409. * @param {String} params.Bucket Bucket名称,必须
  5410. * @param {String} params.Region 地域名称,必须
  5411. * @param {Function} callback 回调函数,必须
  5412. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5413. * @return {Object} data 返回数据
  5414. */
  5415. function getBucketWebsite(params, callback) {
  5416. submitRequest.call(this, {
  5417. Action: 'name/cos:GetBucketWebsite',
  5418. method: 'GET',
  5419. Bucket: params.Bucket,
  5420. Region: params.Region,
  5421. Key: params.Key,
  5422. headers: params.Headers,
  5423. action: 'website'
  5424. }, function (err, data) {
  5425. if (err) {
  5426. if (err.statusCode === 404 && err.error.Code === 'NoSuchWebsiteConfiguration') {
  5427. var result = {
  5428. WebsiteConfiguration: {},
  5429. statusCode: err.statusCode
  5430. };
  5431. err.headers && (result.headers = err.headers);
  5432. callback(null, result);
  5433. } else {
  5434. callback(err);
  5435. }
  5436. return;
  5437. }
  5438. var WebsiteConfiguration = data.WebsiteConfiguration || {};
  5439. if (WebsiteConfiguration['RoutingRules']) {
  5440. var RoutingRules = util.clone(WebsiteConfiguration['RoutingRules'].RoutingRule || []);
  5441. RoutingRules = util.makeArray(RoutingRules);
  5442. WebsiteConfiguration.RoutingRules = RoutingRules;
  5443. }
  5444. callback(null, {
  5445. WebsiteConfiguration: WebsiteConfiguration,
  5446. statusCode: data.statusCode,
  5447. headers: data.headers
  5448. });
  5449. });
  5450. }
  5451. /**
  5452. * 删除 Bucket 的静态网站配置
  5453. * @param {Object} params 参数对象,必须
  5454. * @param {String} params.Bucket Bucket名称,必须
  5455. * @param {String} params.Region 地域名称,必须
  5456. * @param {Function} callback 回调函数,必须
  5457. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5458. * @return {Object} data 返回数据
  5459. */
  5460. function deleteBucketWebsite(params, callback) {
  5461. submitRequest.call(this, {
  5462. Action: 'name/cos:DeleteBucketWebsite',
  5463. method: 'DELETE',
  5464. Bucket: params.Bucket,
  5465. Region: params.Region,
  5466. headers: params.Headers,
  5467. action: 'website'
  5468. }, function (err, data) {
  5469. if (err && err.statusCode === 204) {
  5470. return callback(null, { statusCode: err.statusCode });
  5471. } else if (err) {
  5472. return callback(err);
  5473. }
  5474. callback(null, {
  5475. statusCode: data.statusCode,
  5476. headers: data.headers
  5477. });
  5478. });
  5479. }
  5480. /**
  5481. * 设置 Bucket 的防盗链白名单或者黑名单
  5482. * @param {Object} params 参数对象,必须
  5483. * @param {String} params.Bucket Bucket名称,必须
  5484. * @param {String} params.Region 地域名称,必须
  5485. * @param {Object} params.RefererConfiguration 地域名称,必须
  5486. * @param {String} RefererConfiguration.Status 是否开启防盗链,枚举值:Enabled、Disabled
  5487. * @param {String} RefererConfiguration.RefererType 防盗链类型,枚举值:Black-List、White-List,必须
  5488. * @param {Array} RefererConfiguration.DomianList.Domain 生效域名,必须
  5489. * @param {String} RefererConfiguration.EmptyReferConfiguration ,非必须
  5490. * @param {Function} callback 回调函数,必须
  5491. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5492. * @return {Object} data 返回数据
  5493. */
  5494. function putBucketReferer(params, callback) {
  5495. if (!params['RefererConfiguration']) {
  5496. callback(util.error(new Error('missing param RefererConfiguration')));
  5497. return;
  5498. }
  5499. var RefererConfiguration = util.clone(params['RefererConfiguration'] || {});
  5500. var DomainList = RefererConfiguration['DomainList'] || {};
  5501. var Domains = DomainList['Domains'] || DomainList['Domain'] || [];
  5502. Domains = util.isArray(Domains) ? Domains : [Domains];
  5503. if (Domains.length) RefererConfiguration.DomainList = { Domain: Domains };
  5504. var xml = util.json2xml({ RefererConfiguration: RefererConfiguration });
  5505. var headers = params.Headers;
  5506. headers['Content-Type'] = 'application/xml';
  5507. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5508. submitRequest.call(this, {
  5509. Action: 'name/cos:PutBucketReferer',
  5510. method: 'PUT',
  5511. Bucket: params.Bucket,
  5512. Region: params.Region,
  5513. body: xml,
  5514. action: 'referer',
  5515. headers: headers
  5516. }, function (err, data) {
  5517. if (err && err.statusCode === 204) {
  5518. return callback(null, { statusCode: err.statusCode });
  5519. } else if (err) {
  5520. return callback(err);
  5521. }
  5522. callback(null, {
  5523. statusCode: data.statusCode,
  5524. headers: data.headers
  5525. });
  5526. });
  5527. }
  5528. /**
  5529. * 获取 Bucket 的防盗链白名单或者黑名单
  5530. * @param {Object} params 参数对象,必须
  5531. * @param {String} params.Bucket Bucket名称,必须
  5532. * @param {String} params.Region 地域名称,必须
  5533. * @param {Function} callback 回调函数,必须
  5534. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5535. * @return {Object} data 返回数据
  5536. */
  5537. function getBucketReferer(params, callback) {
  5538. submitRequest.call(this, {
  5539. Action: 'name/cos:GetBucketReferer',
  5540. method: 'GET',
  5541. Bucket: params.Bucket,
  5542. Region: params.Region,
  5543. Key: params.Key,
  5544. headers: params.Headers,
  5545. action: 'referer'
  5546. }, function (err, data) {
  5547. if (err) {
  5548. if (err.statusCode === 404 && err.error.Code === 'NoSuchRefererConfiguration') {
  5549. var result = {
  5550. WebsiteConfiguration: {},
  5551. statusCode: err.statusCode
  5552. };
  5553. err.headers && (result.headers = err.headers);
  5554. callback(null, result);
  5555. } else {
  5556. callback(err);
  5557. }
  5558. return;
  5559. }
  5560. var RefererConfiguration = data.RefererConfiguration || {};
  5561. if (RefererConfiguration['DomainList']) {
  5562. var Domains = util.makeArray(RefererConfiguration['DomainList'].Domain || []);
  5563. RefererConfiguration.DomainList = { Domains: Domains };
  5564. }
  5565. callback(null, {
  5566. RefererConfiguration: RefererConfiguration,
  5567. statusCode: data.statusCode,
  5568. headers: data.headers
  5569. });
  5570. });
  5571. }
  5572. /**
  5573. * 设置 Bucket 自定义域名
  5574. * @param {Object} params 参数对象,必须
  5575. * @param {String} params.Bucket Bucket名称,必须
  5576. * @param {String} params.Region 地域名称,必须
  5577. * @param {Function} callback 回调函数,必须
  5578. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5579. * @return {Object} data 返回数据
  5580. */
  5581. function putBucketDomain(params, callback) {
  5582. var DomainConfiguration = params['DomainConfiguration'] || {};
  5583. var DomainRule = DomainConfiguration.DomainRule || params.DomainRule || [];
  5584. DomainRule = util.clone(DomainRule);
  5585. var xml = util.json2xml({ DomainConfiguration: { DomainRule: DomainRule } });
  5586. var headers = params.Headers;
  5587. headers['Content-Type'] = 'application/xml';
  5588. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5589. submitRequest.call(this, {
  5590. Action: 'name/cos:PutBucketDomain',
  5591. method: 'PUT',
  5592. Bucket: params.Bucket,
  5593. Region: params.Region,
  5594. body: xml,
  5595. action: 'domain',
  5596. headers: headers
  5597. }, function (err, data) {
  5598. if (err && err.statusCode === 204) {
  5599. return callback(null, { statusCode: err.statusCode });
  5600. } else if (err) {
  5601. return callback(err);
  5602. }
  5603. callback(null, {
  5604. statusCode: data.statusCode,
  5605. headers: data.headers
  5606. });
  5607. });
  5608. }
  5609. /**
  5610. * 获取 Bucket 的自定义域名
  5611. * @param {Object} params 参数对象,必须
  5612. * @param {String} params.Bucket Bucket名称,必须
  5613. * @param {String} params.Region 地域名称,必须
  5614. * @param {Function} callback 回调函数,必须
  5615. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5616. * @return {Object} data 返回数据
  5617. */
  5618. function getBucketDomain(params, callback) {
  5619. submitRequest.call(this, {
  5620. Action: 'name/cos:GetBucketDomain',
  5621. method: 'GET',
  5622. Bucket: params.Bucket,
  5623. Region: params.Region,
  5624. headers: params.Headers,
  5625. action: 'domain'
  5626. }, function (err, data) {
  5627. if (err) return callback(err);
  5628. var DomainRule = [];
  5629. try {
  5630. DomainRule = data.DomainConfiguration.DomainRule || [];
  5631. } catch (e) {}
  5632. DomainRule = util.clone(util.isArray(DomainRule) ? DomainRule : [DomainRule]);
  5633. callback(null, {
  5634. DomainRule: DomainRule,
  5635. statusCode: data.statusCode,
  5636. headers: data.headers
  5637. });
  5638. });
  5639. }
  5640. /**
  5641. * 删除 Bucket 自定义域名
  5642. * @param {Object} params 参数对象,必须
  5643. * @param {String} params.Bucket Bucket名称,必须
  5644. * @param {String} params.Region 地域名称,必须
  5645. * @param {Function} callback 回调函数,必须
  5646. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5647. * @return {Object} data 返回数据
  5648. */
  5649. function deleteBucketDomain(params, callback) {
  5650. submitRequest.call(this, {
  5651. Action: 'name/cos:DeleteBucketDomain',
  5652. method: 'DELETE',
  5653. Bucket: params.Bucket,
  5654. Region: params.Region,
  5655. headers: params.Headers,
  5656. action: 'domain'
  5657. }, function (err, data) {
  5658. if (err && err.statusCode === 204) {
  5659. return callback(null, { statusCode: err.statusCode });
  5660. } else if (err) {
  5661. return callback(err);
  5662. }
  5663. callback(null, {
  5664. statusCode: data.statusCode,
  5665. headers: data.headers
  5666. });
  5667. });
  5668. }
  5669. /**
  5670. * 设置 Bucket 的回源
  5671. * @param {Object} params 参数对象,必须
  5672. * @param {String} params.Bucket Bucket名称,必须
  5673. * @param {String} params.Region 地域名称,必须
  5674. * @param {Function} callback 回调函数,必须
  5675. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5676. * @return {Object} data 返回数据
  5677. */
  5678. function putBucketOrigin(params, callback) {
  5679. var OriginConfiguration = params['OriginConfiguration'] || {};
  5680. var OriginRule = OriginConfiguration.OriginRule || params.OriginRule || [];
  5681. OriginRule = util.clone(OriginRule);
  5682. var xml = util.json2xml({ OriginConfiguration: { OriginRule: OriginRule } });
  5683. var headers = params.Headers;
  5684. headers['Content-Type'] = 'application/xml';
  5685. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5686. submitRequest.call(this, {
  5687. Action: 'name/cos:PutBucketOrigin',
  5688. method: 'PUT',
  5689. Bucket: params.Bucket,
  5690. Region: params.Region,
  5691. body: xml,
  5692. action: 'origin',
  5693. headers: headers
  5694. }, function (err, data) {
  5695. if (err && err.statusCode === 204) {
  5696. return callback(null, { statusCode: err.statusCode });
  5697. } else if (err) {
  5698. return callback(err);
  5699. }
  5700. callback(null, {
  5701. statusCode: data.statusCode,
  5702. headers: data.headers
  5703. });
  5704. });
  5705. }
  5706. /**
  5707. * 获取 Bucket 的回源
  5708. * @param {Object} params 参数对象,必须
  5709. * @param {String} params.Bucket Bucket名称,必须
  5710. * @param {String} params.Region 地域名称,必须
  5711. * @param {Function} callback 回调函数,必须
  5712. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5713. * @return {Object} data 返回数据
  5714. */
  5715. function getBucketOrigin(params, callback) {
  5716. submitRequest.call(this, {
  5717. Action: 'name/cos:GetBucketOrigin',
  5718. method: 'GET',
  5719. Bucket: params.Bucket,
  5720. Region: params.Region,
  5721. headers: params.Headers,
  5722. action: 'origin'
  5723. }, function (err, data) {
  5724. if (err) return callback(err);
  5725. var OriginRule = [];
  5726. try {
  5727. OriginRule = data.OriginConfiguration.OriginRule || [];
  5728. } catch (e) {}
  5729. OriginRule = util.clone(util.isArray(OriginRule) ? OriginRule : [OriginRule]);
  5730. callback(null, {
  5731. OriginRule: OriginRule,
  5732. statusCode: data.statusCode,
  5733. headers: data.headers
  5734. });
  5735. });
  5736. }
  5737. /**
  5738. * 删除 Bucket 的回源
  5739. * @param {Object} params 参数对象,必须
  5740. * @param {String} params.Bucket Bucket名称,必须
  5741. * @param {String} params.Region 地域名称,必须
  5742. * @param {Function} callback 回调函数,必须
  5743. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5744. * @return {Object} data 返回数据
  5745. */
  5746. function deleteBucketOrigin(params, callback) {
  5747. submitRequest.call(this, {
  5748. Action: 'name/cos:DeleteBucketOrigin',
  5749. method: 'DELETE',
  5750. Bucket: params.Bucket,
  5751. Region: params.Region,
  5752. headers: params.Headers,
  5753. action: 'origin'
  5754. }, function (err, data) {
  5755. if (err && err.statusCode === 204) {
  5756. return callback(null, { statusCode: err.statusCode });
  5757. } else if (err) {
  5758. return callback(err);
  5759. }
  5760. callback(null, {
  5761. statusCode: data.statusCode,
  5762. headers: data.headers
  5763. });
  5764. });
  5765. }
  5766. /**
  5767. * 设置 Bucket 的日志记录
  5768. * @param {Object} params 参数对象,必须
  5769. * @param {String} params.Bucket Bucket名称,必须
  5770. * @param {String} params.Region 地域名称,必须
  5771. * @param {(Object|String)} params.BucketLoggingStatus 说明日志记录配置的状态,如果无子节点信息则意为关闭日志记录,必须
  5772. * @param {Function} callback 回调函数,必须
  5773. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5774. * @return {Object} data 返回数据
  5775. */
  5776. function putBucketLogging(params, callback) {
  5777. var xml = util.json2xml({
  5778. BucketLoggingStatus: params['BucketLoggingStatus'] || ''
  5779. });
  5780. var headers = params.Headers;
  5781. headers['Content-Type'] = 'application/xml';
  5782. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5783. submitRequest.call(this, {
  5784. Action: 'name/cos:PutBucketLogging',
  5785. method: 'PUT',
  5786. Bucket: params.Bucket,
  5787. Region: params.Region,
  5788. body: xml,
  5789. action: 'logging',
  5790. headers: headers
  5791. }, function (err, data) {
  5792. if (err && err.statusCode === 204) {
  5793. return callback(null, { statusCode: err.statusCode });
  5794. } else if (err) {
  5795. return callback(err);
  5796. }
  5797. callback(null, {
  5798. statusCode: data.statusCode,
  5799. headers: data.headers
  5800. });
  5801. });
  5802. }
  5803. /**
  5804. * 获取 Bucket 的日志记录
  5805. * @param {Object} params 参数对象,必须
  5806. * @param {String} params.Bucket Bucket名称,必须
  5807. * @param {String} params.Region 地域名称,必须
  5808. * @param {Function} callback 回调函数,必须
  5809. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5810. * @return {Object} data 返回数据
  5811. */
  5812. function getBucketLogging(params, callback) {
  5813. submitRequest.call(this, {
  5814. Action: 'name/cos:GetBucketLogging',
  5815. method: 'GET',
  5816. Bucket: params.Bucket,
  5817. Region: params.Region,
  5818. headers: params.Headers,
  5819. action: 'logging'
  5820. }, function (err, data) {
  5821. if (err) return callback(err);
  5822. callback(null, {
  5823. BucketLoggingStatus: data.BucketLoggingStatus,
  5824. statusCode: data.statusCode,
  5825. headers: data.headers
  5826. });
  5827. });
  5828. }
  5829. /**
  5830. * 创建/编辑 Bucket 的清单任务
  5831. * @param {Object} params 参数对象,必须
  5832. * @param {String} params.Bucket Bucket名称,必须
  5833. * @param {String} params.Region 地域名称,必须
  5834. * @param {String} params.Id 清单任务的名称,必须
  5835. * @param {Object} params.InventoryConfiguration 包含清单的配置参数,必须
  5836. * @param {Function} callback 回调函数,必须
  5837. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5838. * @return {Object} data 返回数据
  5839. */
  5840. function putBucketInventory(params, callback) {
  5841. var InventoryConfiguration = util.clone(params['InventoryConfiguration']);
  5842. if (InventoryConfiguration.OptionalFields) {
  5843. var Field = InventoryConfiguration.OptionalFields || [];
  5844. InventoryConfiguration.OptionalFields = {
  5845. Field: Field
  5846. };
  5847. }
  5848. if (InventoryConfiguration.Destination && InventoryConfiguration.Destination.COSBucketDestination && InventoryConfiguration.Destination.COSBucketDestination.Encryption) {
  5849. var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;
  5850. if (Object.keys(Encryption).indexOf('SSECOS') > -1) {
  5851. Encryption['SSE-COS'] = Encryption['SSECOS'];
  5852. delete Encryption['SSECOS'];
  5853. }
  5854. }
  5855. var xml = util.json2xml({
  5856. InventoryConfiguration: InventoryConfiguration
  5857. });
  5858. var headers = params.Headers;
  5859. headers['Content-Type'] = 'application/xml';
  5860. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5861. submitRequest.call(this, {
  5862. Action: 'name/cos:PutBucketInventory',
  5863. method: 'PUT',
  5864. Bucket: params.Bucket,
  5865. Region: params.Region,
  5866. body: xml,
  5867. action: 'inventory',
  5868. qs: {
  5869. id: params['Id']
  5870. },
  5871. headers: headers
  5872. }, function (err, data) {
  5873. if (err && err.statusCode === 204) {
  5874. return callback(null, { statusCode: err.statusCode });
  5875. } else if (err) {
  5876. return callback(err);
  5877. }
  5878. callback(null, {
  5879. statusCode: data.statusCode,
  5880. headers: data.headers
  5881. });
  5882. });
  5883. }
  5884. /**
  5885. * 获取 Bucket 的清单任务信息
  5886. * @param {Object} params 参数对象,必须
  5887. * @param {String} params.Bucket Bucket名称,必须
  5888. * @param {String} params.Region 地域名称,必须
  5889. * @param {String} params.Id 清单任务的名称,必须
  5890. * @param {Function} callback 回调函数,必须
  5891. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5892. * @return {Object} data 返回数据
  5893. */
  5894. function getBucketInventory(params, callback) {
  5895. submitRequest.call(this, {
  5896. Action: 'name/cos:GetBucketInventory',
  5897. method: 'GET',
  5898. Bucket: params.Bucket,
  5899. Region: params.Region,
  5900. headers: params.Headers,
  5901. action: 'inventory',
  5902. qs: {
  5903. id: params['Id']
  5904. }
  5905. }, function (err, data) {
  5906. if (err) return callback(err);
  5907. var InventoryConfiguration = data['InventoryConfiguration'];
  5908. if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {
  5909. var Field = InventoryConfiguration.OptionalFields.Field;
  5910. if (!util.isArray(Field)) {
  5911. Field = [Field];
  5912. }
  5913. InventoryConfiguration.OptionalFields = Field;
  5914. }
  5915. if (InventoryConfiguration.Destination && InventoryConfiguration.Destination.COSBucketDestination && InventoryConfiguration.Destination.COSBucketDestination.Encryption) {
  5916. var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;
  5917. if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {
  5918. Encryption['SSECOS'] = Encryption['SSE-COS'];
  5919. delete Encryption['SSE-COS'];
  5920. }
  5921. }
  5922. callback(null, {
  5923. InventoryConfiguration: InventoryConfiguration,
  5924. statusCode: data.statusCode,
  5925. headers: data.headers
  5926. });
  5927. });
  5928. }
  5929. /**
  5930. * 获取 Bucket 的清单任务信息
  5931. * @param {Object} params 参数对象,必须
  5932. * @param {String} params.Bucket Bucket名称,必须
  5933. * @param {String} params.Region 地域名称,必须
  5934. * @param {String} params.ContinuationToken 当 COS 响应体中 IsTruncated 为 true,且 NextContinuationToken 节点中存在参数值时,您可以将这个参数作为 continuation-token 参数值,以获取下一页的清单任务信息,非必须
  5935. * @param {Function} callback 回调函数,必须
  5936. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5937. * @return {Object} data 返回数据
  5938. */
  5939. function listBucketInventory(params, callback) {
  5940. submitRequest.call(this, {
  5941. Action: 'name/cos:ListBucketInventory',
  5942. method: 'GET',
  5943. Bucket: params.Bucket,
  5944. Region: params.Region,
  5945. headers: params.Headers,
  5946. action: 'inventory',
  5947. qs: {
  5948. 'continuation-token': params['ContinuationToken']
  5949. }
  5950. }, function (err, data) {
  5951. if (err) return callback(err);
  5952. var ListInventoryConfigurationResult = data['ListInventoryConfigurationResult'];
  5953. var InventoryConfigurations = ListInventoryConfigurationResult.InventoryConfiguration || [];
  5954. InventoryConfigurations = util.isArray(InventoryConfigurations) ? InventoryConfigurations : [InventoryConfigurations];
  5955. delete ListInventoryConfigurationResult['InventoryConfiguration'];
  5956. util.each(InventoryConfigurations, function (InventoryConfiguration) {
  5957. if (InventoryConfiguration && InventoryConfiguration.OptionalFields && InventoryConfiguration.OptionalFields.Field) {
  5958. var Field = InventoryConfiguration.OptionalFields.Field;
  5959. if (!util.isArray(Field)) {
  5960. Field = [Field];
  5961. }
  5962. InventoryConfiguration.OptionalFields = Field;
  5963. }
  5964. if (InventoryConfiguration.Destination && InventoryConfiguration.Destination.COSBucketDestination && InventoryConfiguration.Destination.COSBucketDestination.Encryption) {
  5965. var Encryption = InventoryConfiguration.Destination.COSBucketDestination.Encryption;
  5966. if (Object.keys(Encryption).indexOf('SSE-COS') > -1) {
  5967. Encryption['SSECOS'] = Encryption['SSE-COS'];
  5968. delete Encryption['SSE-COS'];
  5969. }
  5970. }
  5971. });
  5972. ListInventoryConfigurationResult.InventoryConfigurations = InventoryConfigurations;
  5973. util.extend(ListInventoryConfigurationResult, {
  5974. statusCode: data.statusCode,
  5975. headers: data.headers
  5976. });
  5977. callback(null, ListInventoryConfigurationResult);
  5978. });
  5979. }
  5980. /**
  5981. * 删除 Bucket 的清单任务
  5982. * @param {Object} params 参数对象,必须
  5983. * @param {String} params.Bucket Bucket名称,必须
  5984. * @param {String} params.Region 地域名称,必须
  5985. * @param {String} params.Id 清单任务的名称,必须
  5986. * @param {Function} callback 回调函数,必须
  5987. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5988. * @return {Object} data 返回数据
  5989. */
  5990. function deleteBucketInventory(params, callback) {
  5991. submitRequest.call(this, {
  5992. Action: 'name/cos:DeleteBucketInventory',
  5993. method: 'DELETE',
  5994. Bucket: params.Bucket,
  5995. Region: params.Region,
  5996. headers: params.Headers,
  5997. action: 'inventory',
  5998. qs: {
  5999. id: params['Id']
  6000. }
  6001. }, function (err, data) {
  6002. if (err && err.statusCode === 204) {
  6003. return callback(null, { statusCode: err.statusCode });
  6004. } else if (err) {
  6005. return callback(err);
  6006. }
  6007. callback(null, {
  6008. statusCode: data.statusCode,
  6009. headers: data.headers
  6010. });
  6011. });
  6012. }
  6013. /* 全球加速 */
  6014. function putBucketAccelerate(params, callback) {
  6015. if (!params['AccelerateConfiguration']) {
  6016. callback(util.error(new Error('missing param AccelerateConfiguration')));
  6017. return;
  6018. }
  6019. var configuration = { AccelerateConfiguration: params.AccelerateConfiguration || {} };
  6020. var xml = util.json2xml(configuration);
  6021. var headers = {};
  6022. headers['Content-Type'] = 'application/xml';
  6023. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6024. submitRequest.call(this, {
  6025. Action: 'name/cos:PutBucketAccelerate',
  6026. method: 'PUT',
  6027. Bucket: params.Bucket,
  6028. Region: params.Region,
  6029. body: xml,
  6030. action: 'accelerate',
  6031. headers: headers
  6032. }, function (err, data) {
  6033. if (err) return callback(err);
  6034. callback(null, {
  6035. statusCode: data.statusCode,
  6036. headers: data.headers
  6037. });
  6038. });
  6039. }
  6040. function getBucketAccelerate(params, callback) {
  6041. submitRequest.call(this, {
  6042. Action: 'name/cos:GetBucketAccelerate',
  6043. method: 'GET',
  6044. Bucket: params.Bucket,
  6045. Region: params.Region,
  6046. action: 'accelerate'
  6047. }, function (err, data) {
  6048. if (!err) {
  6049. !data.AccelerateConfiguration && (data.AccelerateConfiguration = {});
  6050. }
  6051. callback(err, data);
  6052. });
  6053. }
  6054. function putBucketEncryption(params, callback) {
  6055. var conf = params.ServerSideEncryptionConfiguration || {};
  6056. var Rules = conf.Rule || conf.Rules || [];
  6057. var xml = util.json2xml({ ServerSideEncryptionConfiguration: { Rule: Rules } });
  6058. var headers = params.Headers;
  6059. headers['Content-Type'] = 'application/xml';
  6060. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6061. submitRequest.call(this, {
  6062. Action: 'name/cos:PutBucketEncryption',
  6063. method: 'PUT',
  6064. Bucket: params.Bucket,
  6065. Region: params.Region,
  6066. body: xml,
  6067. action: 'encryption',
  6068. headers: headers
  6069. }, function (err, data) {
  6070. if (err && err.statusCode === 204) {
  6071. return callback(null, { statusCode: err.statusCode });
  6072. } else if (err) {
  6073. return callback(err);
  6074. }
  6075. callback(null, {
  6076. statusCode: data.statusCode,
  6077. headers: data.headers
  6078. });
  6079. });
  6080. }
  6081. function getBucketEncryption(params, callback) {
  6082. submitRequest.call(this, {
  6083. Action: 'name/cos:GetBucketEncryption',
  6084. method: 'GET',
  6085. Bucket: params.Bucket,
  6086. Region: params.Region,
  6087. headers: params.Headers,
  6088. action: 'encryption'
  6089. }, function (err, data) {
  6090. if (err) {
  6091. if (err.statusCode === 404 && err.code === 'NoSuchEncryptionConfiguration') {
  6092. var result = {
  6093. EncryptionConfiguration: { Rules: [] },
  6094. statusCode: err.statusCode
  6095. };
  6096. err.headers && (result.headers = err.headers);
  6097. callback(null, result);
  6098. } else {
  6099. callback(err);
  6100. }
  6101. return;
  6102. }
  6103. var Rules = util.makeArray(data.EncryptionConfiguration && data.EncryptionConfiguration.Rule || []);
  6104. data.EncryptionConfiguration = { Rules: Rules };
  6105. callback(err, data);
  6106. });
  6107. }
  6108. function deleteBucketEncryption(params, callback) {
  6109. submitRequest.call(this, {
  6110. Action: 'name/cos:DeleteBucketReplication',
  6111. method: 'DELETE',
  6112. Bucket: params.Bucket,
  6113. Region: params.Region,
  6114. headers: params.Headers,
  6115. action: 'encryption'
  6116. }, function (err, data) {
  6117. if (err && err.statusCode === 204) {
  6118. return callback(null, { statusCode: err.statusCode });
  6119. } else if (err) {
  6120. return callback(err);
  6121. }
  6122. callback(null, {
  6123. statusCode: data.statusCode,
  6124. headers: data.headers
  6125. });
  6126. });
  6127. }
  6128. // Object 相关
  6129. /**
  6130. * 取回对应Object的元数据,Head的权限与Get的权限一致
  6131. * @param {Object} params 参数对象,必须
  6132. * @param {String} params.Bucket Bucket名称,必须
  6133. * @param {String} params.Region 地域名称,必须
  6134. * @param {String} params.Key 文件名称,必须
  6135. * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须
  6136. * @param {Function} callback 回调函数,必须
  6137. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6138. * @return {Object} data 为指定 object 的元数据,如果设置了 IfModifiedSince ,且文件未修改,则返回一个对象,NotModified 属性为 true
  6139. * @return {Boolean} data.NotModified 是否在 IfModifiedSince 时间点之后未修改该 object,则为 true
  6140. */
  6141. function headObject(params, callback) {
  6142. submitRequest.call(this, {
  6143. Action: 'name/cos:HeadObject',
  6144. method: 'HEAD',
  6145. Bucket: params.Bucket,
  6146. Region: params.Region,
  6147. Key: params.Key,
  6148. VersionId: params.VersionId,
  6149. headers: params.Headers
  6150. }, function (err, data) {
  6151. if (err) {
  6152. var statusCode = err.statusCode;
  6153. if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {
  6154. return callback(null, {
  6155. NotModified: true,
  6156. statusCode: statusCode
  6157. });
  6158. }
  6159. return callback(err);
  6160. }
  6161. data.ETag = util.attr(data.headers, 'etag', '');
  6162. callback(null, data);
  6163. });
  6164. }
  6165. function listObjectVersions(params, callback) {
  6166. var reqParams = {};
  6167. reqParams['prefix'] = params['Prefix'] || '';
  6168. reqParams['delimiter'] = params['Delimiter'];
  6169. reqParams['key-marker'] = params['KeyMarker'];
  6170. reqParams['version-id-marker'] = params['VersionIdMarker'];
  6171. reqParams['max-keys'] = params['MaxKeys'];
  6172. reqParams['encoding-type'] = params['EncodingType'];
  6173. submitRequest.call(this, {
  6174. Action: 'name/cos:GetBucketObjectVersions',
  6175. ResourceKey: reqParams['prefix'],
  6176. method: 'GET',
  6177. Bucket: params.Bucket,
  6178. Region: params.Region,
  6179. headers: params.Headers,
  6180. qs: reqParams,
  6181. action: 'versions'
  6182. }, function (err, data) {
  6183. if (err) return callback(err);
  6184. var ListVersionsResult = data.ListVersionsResult || {};
  6185. var DeleteMarkers = ListVersionsResult.DeleteMarker || [];
  6186. DeleteMarkers = util.isArray(DeleteMarkers) ? DeleteMarkers : [DeleteMarkers];
  6187. var Versions = ListVersionsResult.Version || [];
  6188. Versions = util.isArray(Versions) ? Versions : [Versions];
  6189. var result = util.clone(ListVersionsResult);
  6190. delete result.DeleteMarker;
  6191. delete result.Version;
  6192. util.extend(result, {
  6193. DeleteMarkers: DeleteMarkers,
  6194. Versions: Versions,
  6195. statusCode: data.statusCode,
  6196. headers: data.headers
  6197. });
  6198. callback(null, result);
  6199. });
  6200. }
  6201. /**
  6202. * 下载 object
  6203. * @param {Object} params 参数对象,必须
  6204. * @param {String} params.Bucket Bucket名称,必须
  6205. * @param {String} params.Region 地域名称,必须
  6206. * @param {String} params.Key 文件名称,必须
  6207. * @param {WriteStream} params.Output 文件写入流,非必须
  6208. * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须
  6209. * @param {String} params.IfUnmodifiedSince 如果文件修改时间早于或等于指定时间,才返回文件内容。否则返回 412 (precondition failed),非必须
  6210. * @param {String} params.IfMatch 当 ETag 与指定的内容一致,才返回文件。否则返回 412 (precondition failed),非必须
  6211. * @param {String} params.IfNoneMatch 当 ETag 与指定的内容不一致,才返回文件。否则返回304 (not modified),非必须
  6212. * @param {String} params.ResponseContentType 设置返回头部中的 Content-Type 参数,非必须
  6213. * @param {String} params.ResponseContentLanguage 设置返回头部中的 Content-Language 参数,非必须
  6214. * @param {String} params.ResponseExpires 设置返回头部中的 Content-Expires 参数,非必须
  6215. * @param {String} params.ResponseCacheControl 设置返回头部中的 Cache-Control 参数,非必须
  6216. * @param {String} params.ResponseContentDisposition 设置返回头部中的 Content-Disposition 参数,非必须
  6217. * @param {String} params.ResponseContentEncoding 设置返回头部中的 Content-Encoding 参数,非必须
  6218. * @param {Function} callback 回调函数,必须
  6219. * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6220. * @param {Object} data 为对应的 object 数据,包括 body 和 headers
  6221. */
  6222. function getObject(params, callback) {
  6223. var reqParams = params.Query || {};
  6224. var reqParamsStr = params.QueryString || '';
  6225. var onProgress = util.throttleOnProgress.call(this, 0, params.onProgress);
  6226. reqParams['response-content-type'] = params['ResponseContentType'];
  6227. reqParams['response-content-language'] = params['ResponseContentLanguage'];
  6228. reqParams['response-expires'] = params['ResponseExpires'];
  6229. reqParams['response-cache-control'] = params['ResponseCacheControl'];
  6230. reqParams['response-content-disposition'] = params['ResponseContentDisposition'];
  6231. reqParams['response-content-encoding'] = params['ResponseContentEncoding'];
  6232. // 如果用户自己传入了 output
  6233. submitRequest.call(this, {
  6234. Action: 'name/cos:GetObject',
  6235. method: 'GET',
  6236. Bucket: params.Bucket,
  6237. Region: params.Region,
  6238. Key: params.Key,
  6239. VersionId: params.VersionId,
  6240. DataType: params.DataType,
  6241. headers: params.Headers,
  6242. qs: reqParams,
  6243. qsStr: reqParamsStr,
  6244. rawBody: true,
  6245. onDownloadProgress: onProgress
  6246. }, function (err, data) {
  6247. onProgress(null, true);
  6248. if (err) {
  6249. var statusCode = err.statusCode;
  6250. if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {
  6251. return callback(null, {
  6252. NotModified: true
  6253. });
  6254. }
  6255. return callback(err);
  6256. }
  6257. callback(null, {
  6258. Body: data.body,
  6259. ETag: util.attr(data.headers, 'etag', ''),
  6260. statusCode: data.statusCode,
  6261. headers: data.headers
  6262. });
  6263. });
  6264. }
  6265. /**
  6266. * 上传 object
  6267. * @param {Object} params 参数对象,必须
  6268. * @param {String} params.Bucket Bucket名称,必须
  6269. * @param {String} params.Region 地域名称,必须
  6270. * @param {String} params.Key 文件名称,必须
  6271. * @param {File || Blob || String} params.Body 上传文件对象或字符串,必须
  6272. * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须
  6273. * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须
  6274. * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须
  6275. * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须
  6276. * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须
  6277. * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须
  6278. * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须
  6279. * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须
  6280. * @param {String} params.GrantRead 赋予被授权者读取对象的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  6281. * @param {String} params.GrantReadAcp 赋予被授权者读取对象的访问控制列表(ACL)的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  6282. * @param {String} params.GrantWriteAcp 赋予被授权者写入对象的访问控制列表(ACL)的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  6283. * @param {String} params.GrantFullControl 赋予被授权者操作对象的所有权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  6284. * @param {String} params.StorageClass 设置对象的存储级别,枚举值:STANDARD、STANDARD_IA、ARCHIVE,默认值:STANDARD,非必须
  6285. * @param {String} params.x-cos-meta-* 允许用户自定义的头部信息,将作为对象的元数据保存。大小限制2KB,非必须
  6286. * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须
  6287. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  6288. * @param {Function} params.onProgress 上传进度回调函数
  6289. * @param {Function} callback 回调函数,必须
  6290. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6291. * @return {Object} data 为对应的 object 数据
  6292. * @return {String} data.ETag 为对应上传文件的 ETag 值
  6293. */
  6294. function putObject(params, callback) {
  6295. var self = this;
  6296. var FileSize = params.ContentLength;
  6297. var onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
  6298. // 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里
  6299. var headers = params.Headers;
  6300. if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
  6301. if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';
  6302. var needCalcMd5 = params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5 || self.options.UploadCheckContentMd5;
  6303. util.getBodyMd5(needCalcMd5, params.Body, function (md5) {
  6304. if (md5) {
  6305. if (self.options.UploadCheckContentMd5) headers['Content-MD5'] = util.binaryBase64(md5);
  6306. if (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5) headers['x-cos-meta-md5'] = md5;
  6307. }
  6308. if (params.ContentLength !== undefined) headers['Content-Length'] = params.ContentLength;
  6309. onProgress(null, true); // 任务状态开始 uploading
  6310. submitRequest.call(self, {
  6311. Action: 'name/cos:PutObject',
  6312. TaskId: params.TaskId,
  6313. method: 'PUT',
  6314. Bucket: params.Bucket,
  6315. Region: params.Region,
  6316. Key: params.Key,
  6317. headers: params.Headers,
  6318. qs: params.Query,
  6319. body: params.Body,
  6320. onProgress: onProgress
  6321. }, function (err, data) {
  6322. if (err) {
  6323. onProgress(null, true);
  6324. return callback(err);
  6325. }
  6326. onProgress({ loaded: FileSize, total: FileSize }, true);
  6327. var url = getUrl({
  6328. ForcePathStyle: self.options.ForcePathStyle,
  6329. protocol: self.options.Protocol,
  6330. domain: self.options.Domain,
  6331. bucket: params.Bucket,
  6332. region: !self.options.UseAccelerate ? params.Region : 'accelerate',
  6333. object: params.Key
  6334. });
  6335. url = url.substr(url.indexOf('://') + 3);
  6336. data.Location = url;
  6337. data.ETag = util.attr(data.headers, 'etag', '');
  6338. callback(null, data);
  6339. });
  6340. }, params.onHashProgress);
  6341. }
  6342. /**
  6343. * 删除 object
  6344. * @param {Object} params 参数对象,必须
  6345. * @param {String} params.Bucket Bucket名称,必须
  6346. * @param {String} params.Region 地域名称,必须
  6347. * @param {String} params.Key object名称,必须
  6348. * @param {Function} callback 回调函数,必须
  6349. * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6350. * @param {Object} data 删除操作成功之后返回的数据
  6351. */
  6352. function deleteObject(params, callback) {
  6353. submitRequest.call(this, {
  6354. Action: 'name/cos:DeleteObject',
  6355. method: 'DELETE',
  6356. Bucket: params.Bucket,
  6357. Region: params.Region,
  6358. Key: params.Key,
  6359. headers: params.Headers,
  6360. VersionId: params.VersionId,
  6361. action: params.Recursive ? 'recursive' : ''
  6362. }, function (err, data) {
  6363. if (err) {
  6364. var statusCode = err.statusCode;
  6365. if (statusCode && statusCode === 404) {
  6366. return callback(null, { BucketNotFound: true, statusCode: statusCode });
  6367. } else {
  6368. return callback(err);
  6369. }
  6370. }
  6371. callback(null, {
  6372. statusCode: data.statusCode,
  6373. headers: data.headers
  6374. });
  6375. });
  6376. }
  6377. /**
  6378. * 获取 object 的 权限列表
  6379. * @param {Object} params 参数对象,必须
  6380. * @param {String} params.Bucket Bucket名称,必须
  6381. * @param {String} params.Region 地域名称,必须
  6382. * @param {String} params.Key object名称,必须
  6383. * @param {Function} callback 回调函数,必须
  6384. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6385. * @return {Object} data 返回的数据
  6386. * @return {Object} data.AccessControlPolicy 权限列表
  6387. */
  6388. function getObjectAcl(params, callback) {
  6389. submitRequest.call(this, {
  6390. Action: 'name/cos:GetObjectACL',
  6391. method: 'GET',
  6392. Bucket: params.Bucket,
  6393. Region: params.Region,
  6394. Key: params.Key,
  6395. headers: params.Headers,
  6396. action: 'acl'
  6397. }, function (err, data) {
  6398. if (err) return callback(err);
  6399. var AccessControlPolicy = data.AccessControlPolicy || {};
  6400. var Owner = AccessControlPolicy.Owner || {};
  6401. var Grant = AccessControlPolicy.AccessControlList && AccessControlPolicy.AccessControlList.Grant || [];
  6402. Grant = util.isArray(Grant) ? Grant : [Grant];
  6403. var result = decodeAcl(AccessControlPolicy);
  6404. delete result.GrantWrite;
  6405. if (data.headers && data.headers['x-cos-acl']) {
  6406. result.ACL = data.headers['x-cos-acl'];
  6407. }
  6408. result = util.extend(result, {
  6409. Owner: Owner,
  6410. Grants: Grant,
  6411. statusCode: data.statusCode,
  6412. headers: data.headers
  6413. });
  6414. callback(null, result);
  6415. });
  6416. }
  6417. /**
  6418. * 设置 object 的 权限列表
  6419. * @param {Object} params 参数对象,必须
  6420. * @param {String} params.Bucket Bucket名称,必须
  6421. * @param {String} params.Region 地域名称,必须
  6422. * @param {String} params.Key object名称,必须
  6423. * @param {Function} callback 回调函数,必须
  6424. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6425. * @return {Object} data 返回的数据
  6426. */
  6427. function putObjectAcl(params, callback) {
  6428. var headers = params.Headers;
  6429. var xml = '';
  6430. if (params['AccessControlPolicy']) {
  6431. var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});
  6432. var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;
  6433. Grants = util.isArray(Grants) ? Grants : [Grants];
  6434. delete AccessControlPolicy.Grant;
  6435. delete AccessControlPolicy.Grants;
  6436. AccessControlPolicy.AccessControlList = { Grant: Grants };
  6437. xml = util.json2xml({ AccessControlPolicy: AccessControlPolicy });
  6438. headers['Content-Type'] = 'application/xml';
  6439. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6440. }
  6441. // Grant Header 去重
  6442. util.each(headers, function (val, key) {
  6443. if (key.indexOf('x-cos-grant-') === 0) {
  6444. headers[key] = uniqGrant(headers[key]);
  6445. }
  6446. });
  6447. submitRequest.call(this, {
  6448. Action: 'name/cos:PutObjectACL',
  6449. method: 'PUT',
  6450. Bucket: params.Bucket,
  6451. Region: params.Region,
  6452. Key: params.Key,
  6453. action: 'acl',
  6454. headers: headers,
  6455. body: xml
  6456. }, function (err, data) {
  6457. if (err) return callback(err);
  6458. callback(null, {
  6459. statusCode: data.statusCode,
  6460. headers: data.headers
  6461. });
  6462. });
  6463. }
  6464. /**
  6465. * Options Object请求实现跨域访问的预请求。即发出一个 OPTIONS 请求给服务器以确认是否可以进行跨域操作。
  6466. * @param {Object} params 参数对象,必须
  6467. * @param {String} params.Bucket Bucket名称,必须
  6468. * @param {String} params.Region 地域名称,必须
  6469. * @param {String} params.Key object名称,必须
  6470. * @param {Function} callback 回调函数,必须
  6471. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6472. * @return {Object} data 返回的数据
  6473. */
  6474. function optionsObject(params, callback) {
  6475. var headers = params.Headers;
  6476. headers['Origin'] = params['Origin'];
  6477. headers['Access-Control-Request-Method'] = params['AccessControlRequestMethod'];
  6478. headers['Access-Control-Request-Headers'] = params['AccessControlRequestHeaders'];
  6479. submitRequest.call(this, {
  6480. Action: 'name/cos:OptionsObject',
  6481. method: 'OPTIONS',
  6482. Bucket: params.Bucket,
  6483. Region: params.Region,
  6484. Key: params.Key,
  6485. headers: headers
  6486. }, function (err, data) {
  6487. if (err) {
  6488. if (err.statusCode && err.statusCode === 403) {
  6489. return callback(null, {
  6490. OptionsForbidden: true,
  6491. statusCode: err.statusCode
  6492. });
  6493. }
  6494. return callback(err);
  6495. }
  6496. var headers = data.headers || {};
  6497. callback(null, {
  6498. AccessControlAllowOrigin: headers['access-control-allow-origin'],
  6499. AccessControlAllowMethods: headers['access-control-allow-methods'],
  6500. AccessControlAllowHeaders: headers['access-control-allow-headers'],
  6501. AccessControlExposeHeaders: headers['access-control-expose-headers'],
  6502. AccessControlMaxAge: headers['access-control-max-age'],
  6503. statusCode: data.statusCode,
  6504. headers: data.headers
  6505. });
  6506. });
  6507. }
  6508. /**
  6509. * @param {Object} 参数列表
  6510. * @param {String} Bucket Bucket 名称
  6511. * @param {String} Region 地域名称
  6512. * @param {String} Key 文件名称
  6513. * @param {String} CopySource 源文件URL绝对路径,可以通过versionid子资源指定历史版本
  6514. * @param {String} ACL 允许用户自定义文件权限。有效值:private,public-read默认值:private。
  6515. * @param {String} GrantRead 赋予被授权者读的权限,格式 x-cos-grant-read: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  6516. * @param {String} GrantWrite 赋予被授权者写的权限,格式 x-cos-grant-write: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  6517. * @param {String} GrantFullControl 赋予被授权者读写权限,格式 x-cos-grant-full-control: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  6518. * @param {String} MetadataDirective 是否拷贝元数据,枚举值:Copy, Replaced,默认值Copy。假如标记为Copy,忽略Header中的用户元数据信息直接复制;假如标记为Replaced,按Header信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为Replaced
  6519. * @param {String} CopySourceIfModifiedSince 当Object在指定时间后被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-None-Match一起使用,与其他条件联合使用返回冲突。
  6520. * @param {String} CopySourceIfUnmodifiedSince 当Object在指定时间后未被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-Match一起使用,与其他条件联合使用返回冲突。
  6521. * @param {String} CopySourceIfMatch 当Object的ETag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。
  6522. * @param {String} CopySourceIfNoneMatch 当Object的ETag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。
  6523. * @param {String} StorageClass 存储级别,枚举值:存储级别,枚举值:Standard, Standard_IA,Archive;默认值:Standard
  6524. * @param {String} CacheControl 指定所有缓存机制在整个请求/响应链中必须服从的指令。
  6525. * @param {String} ContentDisposition MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
  6526. * @param {String} ContentEncoding HTTP 中用来对「采用何种编码格式传输正文」进行协定的一对头部字段
  6527. * @param {String} ContentLength 设置响应消息的实体内容的大小,单位为字节
  6528. * @param {String} ContentType RFC 2616 中定义的 HTTP 请求内容类型(MIME),例如text/plain
  6529. * @param {String} Expect 请求的特定的服务器行为
  6530. * @param {String} Expires 响应过期的日期和时间
  6531. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  6532. * @param {String} ContentLanguage 指定内容语言
  6533. * @param {String} x-cos-meta-* 允许用户自定义的头部信息,将作为 Object 元数据返回。大小限制2K。
  6534. */
  6535. function putObjectCopy(params, callback) {
  6536. // 特殊处理 Cache-Control
  6537. var self = this;
  6538. var headers = params.Headers;
  6539. if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
  6540. var CopySource = params.CopySource || '';
  6541. var m = util.getSourceParams.call(this, CopySource);
  6542. if (!m) {
  6543. callback(util.error(new Error('CopySource format error')));
  6544. return;
  6545. }
  6546. var SourceBucket = m[1];
  6547. var SourceRegion = m[3];
  6548. var SourceKey = decodeURIComponent(m[4]);
  6549. submitRequest.call(this, {
  6550. Scope: [{
  6551. action: 'name/cos:GetObject',
  6552. bucket: SourceBucket,
  6553. region: SourceRegion,
  6554. prefix: SourceKey
  6555. }, {
  6556. action: 'name/cos:PutObject',
  6557. bucket: params.Bucket,
  6558. region: params.Region,
  6559. prefix: params.Key
  6560. }],
  6561. method: 'PUT',
  6562. Bucket: params.Bucket,
  6563. Region: params.Region,
  6564. Key: params.Key,
  6565. VersionId: params.VersionId,
  6566. headers: params.Headers
  6567. }, function (err, data) {
  6568. if (err) return callback(err);
  6569. var result = util.clone(data.CopyObjectResult || {});
  6570. var url = getUrl({
  6571. ForcePathStyle: self.options.ForcePathStyle,
  6572. protocol: self.options.Protocol,
  6573. domain: self.options.Domain,
  6574. bucket: params.Bucket,
  6575. region: params.Region,
  6576. object: params.Key,
  6577. isLocation: true
  6578. });
  6579. util.extend(result, {
  6580. Location: url,
  6581. statusCode: data.statusCode,
  6582. headers: data.headers
  6583. });
  6584. callback(null, result);
  6585. });
  6586. }
  6587. function uploadPartCopy(params, callback) {
  6588. var CopySource = params.CopySource || '';
  6589. var m = util.getSourceParams.call(this, CopySource);
  6590. if (!m) {
  6591. callback(util.error(new Error('CopySource format error')));
  6592. return;
  6593. }
  6594. var SourceBucket = m[1];
  6595. var SourceRegion = m[3];
  6596. var SourceKey = decodeURIComponent(m[4]);
  6597. submitRequest.call(this, {
  6598. Scope: [{
  6599. action: 'name/cos:GetObject',
  6600. bucket: SourceBucket,
  6601. region: SourceRegion,
  6602. prefix: SourceKey
  6603. }, {
  6604. action: 'name/cos:PutObject',
  6605. bucket: params.Bucket,
  6606. region: params.Region,
  6607. prefix: params.Key
  6608. }],
  6609. method: 'PUT',
  6610. Bucket: params.Bucket,
  6611. Region: params.Region,
  6612. Key: params.Key,
  6613. VersionId: params.VersionId,
  6614. qs: {
  6615. partNumber: params['PartNumber'],
  6616. uploadId: params['UploadId']
  6617. },
  6618. headers: params.Headers
  6619. }, function (err, data) {
  6620. if (err) return callback(err);
  6621. var result = util.clone(data.CopyPartResult || {});
  6622. util.extend(result, {
  6623. statusCode: data.statusCode,
  6624. headers: data.headers
  6625. });
  6626. callback(null, result);
  6627. });
  6628. }
  6629. function deleteMultipleObject(params, callback) {
  6630. var Objects = params.Objects || [];
  6631. var Quiet = params.Quiet;
  6632. Objects = util.isArray(Objects) ? Objects : [Objects];
  6633. var xml = util.json2xml({ Delete: { Object: Objects, Quiet: Quiet || false } });
  6634. var headers = params.Headers;
  6635. headers['Content-Type'] = 'application/xml';
  6636. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6637. var Scope = util.map(Objects, function (v) {
  6638. return {
  6639. action: 'name/cos:DeleteObject',
  6640. bucket: params.Bucket,
  6641. region: params.Region,
  6642. prefix: v.Key
  6643. };
  6644. });
  6645. submitRequest.call(this, {
  6646. Scope: Scope,
  6647. method: 'POST',
  6648. Bucket: params.Bucket,
  6649. Region: params.Region,
  6650. body: xml,
  6651. action: 'delete',
  6652. headers: headers
  6653. }, function (err, data) {
  6654. if (err) return callback(err);
  6655. var DeleteResult = data.DeleteResult || {};
  6656. var Deleted = DeleteResult.Deleted || [];
  6657. var Errors = DeleteResult.Error || [];
  6658. Deleted = util.isArray(Deleted) ? Deleted : [Deleted];
  6659. Errors = util.isArray(Errors) ? Errors : [Errors];
  6660. var result = util.clone(DeleteResult);
  6661. util.extend(result, {
  6662. Error: Errors,
  6663. Deleted: Deleted,
  6664. statusCode: data.statusCode,
  6665. headers: data.headers
  6666. });
  6667. callback(null, result);
  6668. });
  6669. }
  6670. function restoreObject(params, callback) {
  6671. var headers = params.Headers;
  6672. if (!params['RestoreRequest']) {
  6673. callback(util.error(new Error('missing param RestoreRequest')));
  6674. return;
  6675. }
  6676. var RestoreRequest = params.RestoreRequest || {};
  6677. var xml = util.json2xml({ RestoreRequest: RestoreRequest });
  6678. headers['Content-Type'] = 'application/xml';
  6679. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6680. submitRequest.call(this, {
  6681. Action: 'name/cos:RestoreObject',
  6682. method: 'POST',
  6683. Bucket: params.Bucket,
  6684. Region: params.Region,
  6685. Key: params.Key,
  6686. VersionId: params.VersionId,
  6687. body: xml,
  6688. action: 'restore',
  6689. headers: headers
  6690. }, callback);
  6691. }
  6692. /**
  6693. * 设置 Object 的标签
  6694. * @param {Object} params 参数对象,必须
  6695. * @param {String} params.Bucket Object名称,必须
  6696. * @param {String} params.Region 地域名称,必须
  6697. * @param {Array} params.TagSet 标签设置,必须
  6698. * @param {Function} callback 回调函数,必须
  6699. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998
  6700. * @return {Object} data 返回数据
  6701. */
  6702. function putObjectTagging(params, callback) {
  6703. var Tagging = params['Tagging'] || {};
  6704. var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];
  6705. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  6706. var xml = util.json2xml({ Tagging: { TagSet: { Tag: Tags } } });
  6707. var headers = params.Headers;
  6708. headers['Content-Type'] = 'application/xml';
  6709. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6710. submitRequest.call(this, {
  6711. Action: 'name/cos:PutObjectTagging',
  6712. method: 'PUT',
  6713. Bucket: params.Bucket,
  6714. Key: params.Key,
  6715. Region: params.Region,
  6716. body: xml,
  6717. action: 'tagging',
  6718. headers: headers,
  6719. VersionId: params.VersionId
  6720. }, function (err, data) {
  6721. if (err && err.statusCode === 204) {
  6722. return callback(null, { statusCode: err.statusCode });
  6723. } else if (err) {
  6724. return callback(err);
  6725. }
  6726. callback(null, {
  6727. statusCode: data.statusCode,
  6728. headers: data.headers
  6729. });
  6730. });
  6731. }
  6732. /**
  6733. * 获取 Object 的标签设置
  6734. * @param {Object} params 参数对象,必须
  6735. * @param {String} params.Bucket Bucket名称,必须
  6736. * @param {String} params.Region 地域名称,必须
  6737. * @param {Function} callback 回调函数,必须
  6738. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998
  6739. * @return {Object} data 返回数据
  6740. */
  6741. function getObjectTagging(params, callback) {
  6742. submitRequest.call(this, {
  6743. Action: 'name/cos:GetObjectTagging',
  6744. method: 'GET',
  6745. Key: params.Key,
  6746. Bucket: params.Bucket,
  6747. Region: params.Region,
  6748. headers: params.Headers,
  6749. action: 'tagging',
  6750. VersionId: params.VersionId
  6751. }, function (err, data) {
  6752. if (err) {
  6753. if (err.statusCode === 404 && err.error && (err.error === "Not Found" || err.error.Code === 'NoSuchTagSet')) {
  6754. var result = {
  6755. Tags: [],
  6756. statusCode: err.statusCode
  6757. };
  6758. err.headers && (result.headers = err.headers);
  6759. callback(null, result);
  6760. } else {
  6761. callback(err);
  6762. }
  6763. return;
  6764. }
  6765. var Tags = [];
  6766. try {
  6767. Tags = data.Tagging.TagSet.Tag || [];
  6768. } catch (e) {}
  6769. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  6770. callback(null, {
  6771. Tags: Tags,
  6772. statusCode: data.statusCode,
  6773. headers: data.headers
  6774. });
  6775. });
  6776. }
  6777. /**
  6778. * 删除 Object 的 标签设置
  6779. * @param {Object} params 参数对象,必须
  6780. * @param {String} params.Bucket Object名称,必须
  6781. * @param {String} params.Region 地域名称,必须
  6782. * @param {Function} callback 回调函数,必须
  6783. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998
  6784. * @return {Object} data 返回的数据
  6785. */
  6786. function deleteObjectTagging(params, callback) {
  6787. submitRequest.call(this, {
  6788. Action: 'name/cos:DeleteObjectTagging',
  6789. method: 'DELETE',
  6790. Bucket: params.Bucket,
  6791. Region: params.Region,
  6792. Key: params.Key,
  6793. headers: params.Headers,
  6794. action: 'tagging',
  6795. VersionId: params.VersionId
  6796. }, function (err, data) {
  6797. if (err && err.statusCode === 204) {
  6798. return callback(null, { statusCode: err.statusCode });
  6799. } else if (err) {
  6800. return callback(err);
  6801. }
  6802. callback(null, {
  6803. statusCode: data.statusCode,
  6804. headers: data.headers
  6805. });
  6806. });
  6807. }
  6808. /**
  6809. * 使用 SQL 语句从指定对象(CSV 格式或者 JSON 格式)中检索内容
  6810. * @param {Object} params 参数对象,必须
  6811. * @param {String} params.Bucket Object名称,必须
  6812. * @param {String} params.Region 地域名称,必须
  6813. * @param {Object} params.SelectRequest 地域名称,必须
  6814. * @param {Function} callback 回调函数,必须
  6815. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/42998
  6816. * @return {Object} data 返回的数据
  6817. */
  6818. function selectObjectContent(params, callback) {
  6819. var SelectType = params['SelectType'];
  6820. if (!SelectType) return callback(util.error(new Error('missing param SelectType')));
  6821. var SelectRequest = params['SelectRequest'] || {};
  6822. var xml = util.json2xml({ SelectRequest: SelectRequest });
  6823. var headers = params.Headers;
  6824. headers['Content-Type'] = 'application/xml';
  6825. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6826. submitRequest.call(this, {
  6827. Action: 'name/cos:GetObject',
  6828. method: 'POST',
  6829. Bucket: params.Bucket,
  6830. Region: params.Region,
  6831. Key: params.Key,
  6832. headers: params.Headers,
  6833. action: 'select',
  6834. qs: {
  6835. 'select-type': params['SelectType']
  6836. },
  6837. VersionId: params.VersionId,
  6838. body: xml,
  6839. DataType: 'arraybuffer',
  6840. rawBody: true
  6841. }, function (err, data) {
  6842. if (err && err.statusCode === 204) {
  6843. return callback(null, { statusCode: err.statusCode });
  6844. } else if (err) {
  6845. return callback(err);
  6846. }
  6847. var result = util.parseSelectPayload(data.body);
  6848. callback(null, {
  6849. statusCode: data.statusCode,
  6850. headers: data.headers,
  6851. Body: result.body,
  6852. Payload: result.payload
  6853. });
  6854. });
  6855. }
  6856. // 分块上传
  6857. /**
  6858. * 初始化分块上传
  6859. * @param {Object} params 参数对象,必须
  6860. * @param {String} params.Bucket Bucket名称,必须
  6861. * @param {String} params.Region 地域名称,必须
  6862. * @param {String} params.Key object名称,必须
  6863. * @param {String} params.UploadId object名称,必须
  6864. * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须
  6865. * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存 ,非必须
  6866. * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须
  6867. * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须
  6868. * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须
  6869. * @param {String} params.ACL 允许用户自定义文件权限,非必须
  6870. * @param {String} params.GrantRead 赋予被授权者读的权限 ,非必须
  6871. * @param {String} params.GrantWrite 赋予被授权者写的权限 ,非必须
  6872. * @param {String} params.GrantFullControl 赋予被授权者读写权限 ,非必须
  6873. * @param {String} params.StorageClass 设置Object的存储级别,枚举值:Standard,Standard_IA,Archive,非必须
  6874. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  6875. * @param {Function} callback 回调函数,必须
  6876. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6877. * @return {Object} data 返回的数据
  6878. */
  6879. function multipartInit(params, callback) {
  6880. var self = this;
  6881. // 特殊处理 Cache-Control
  6882. var headers = params.Headers;
  6883. // 特殊处理 Cache-Control、Content-Type
  6884. if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
  6885. if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';
  6886. util.getBodyMd5(params.Body && (params.UploadAddMetaMd5 || self.options.UploadAddMetaMd5), params.Body, function (md5) {
  6887. if (md5) params.Headers['x-cos-meta-md5'] = md5;
  6888. submitRequest.call(self, {
  6889. Action: 'name/cos:InitiateMultipartUpload',
  6890. method: 'POST',
  6891. Bucket: params.Bucket,
  6892. Region: params.Region,
  6893. Key: params.Key,
  6894. action: 'uploads',
  6895. headers: params.Headers,
  6896. qs: params.Query
  6897. }, function (err, data) {
  6898. if (err) return callback(err);
  6899. data = util.clone(data || {});
  6900. if (data && data.InitiateMultipartUploadResult) {
  6901. return callback(null, util.extend(data.InitiateMultipartUploadResult, {
  6902. statusCode: data.statusCode,
  6903. headers: data.headers
  6904. }));
  6905. }
  6906. callback(null, data);
  6907. });
  6908. }, params.onHashProgress);
  6909. }
  6910. /**
  6911. * 分块上传
  6912. * @param {Object} params 参数对象,必须
  6913. * @param {String} params.Bucket Bucket名称,必须
  6914. * @param {String} params.Region 地域名称,必须
  6915. * @param {String} params.Key object名称,必须
  6916. * @param {File || Blob || String} params.Body 上传文件对象或字符串
  6917. * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),非必须
  6918. * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须
  6919. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  6920. * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验值,非必须
  6921. * @param {Function} callback 回调函数,必须
  6922. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6923. * @return {Object} data 返回的数据
  6924. * @return {Object} data.ETag 返回的文件分块 sha1 值
  6925. */
  6926. function multipartUpload(params, callback) {
  6927. var self = this;
  6928. util.getFileSize('multipartUpload', params, function () {
  6929. util.getBodyMd5(self.options.UploadCheckContentMd5, params.Body, function (md5) {
  6930. if (md5) params.Headers['Content-MD5'] = util.binaryBase64(md5);
  6931. submitRequest.call(self, {
  6932. Action: 'name/cos:UploadPart',
  6933. TaskId: params.TaskId,
  6934. method: 'PUT',
  6935. Bucket: params.Bucket,
  6936. Region: params.Region,
  6937. Key: params.Key,
  6938. qs: {
  6939. partNumber: params['PartNumber'],
  6940. uploadId: params['UploadId']
  6941. },
  6942. headers: params.Headers,
  6943. onProgress: params.onProgress,
  6944. body: params.Body || null
  6945. }, function (err, data) {
  6946. if (err) return callback(err);
  6947. callback(null, {
  6948. ETag: util.attr(data.headers, 'etag', ''),
  6949. statusCode: data.statusCode,
  6950. headers: data.headers
  6951. });
  6952. });
  6953. });
  6954. });
  6955. }
  6956. /**
  6957. * 完成分块上传
  6958. * @param {Object} params 参数对象,必须
  6959. * @param {String} params.Bucket Bucket名称,必须
  6960. * @param {String} params.Region 地域名称,必须
  6961. * @param {String} params.Key object名称,必须
  6962. * @param {Array} params.Parts 分块信息列表,必须
  6963. * @param {String} params.Parts[i].PartNumber 块编号,必须
  6964. * @param {String} params.Parts[i].ETag 分块的 sha1 校验值
  6965. * @param {Function} callback 回调函数,必须
  6966. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6967. * @return {Object} data 返回的数据
  6968. * @return {Object} data.CompleteMultipartUpload 完成分块上传后的文件信息,包括Location, Bucket, Key 和 ETag
  6969. */
  6970. function multipartComplete(params, callback) {
  6971. var self = this;
  6972. var UploadId = params.UploadId;
  6973. var Parts = params['Parts'];
  6974. for (var i = 0, len = Parts.length; i < len; i++) {
  6975. if (Parts[i]['ETag'] && Parts[i]['ETag'].indexOf('"') === 0) {
  6976. continue;
  6977. }
  6978. Parts[i]['ETag'] = '"' + Parts[i]['ETag'] + '"';
  6979. }
  6980. var xml = util.json2xml({ CompleteMultipartUpload: { Part: Parts } });
  6981. // CSP/ceph CompleteMultipartUpload 接口 body 写死了限制 1MB,这里醉倒 10000 片时,xml 字符串去掉空格853KB
  6982. xml = xml.replace(/\n\s*/g, '');
  6983. var headers = params.Headers;
  6984. headers['Content-Type'] = 'application/xml';
  6985. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  6986. submitRequest.call(this, {
  6987. Action: 'name/cos:CompleteMultipartUpload',
  6988. method: 'POST',
  6989. Bucket: params.Bucket,
  6990. Region: params.Region,
  6991. Key: params.Key,
  6992. qs: {
  6993. uploadId: UploadId
  6994. },
  6995. body: xml,
  6996. headers: headers
  6997. }, function (err, data) {
  6998. if (err) return callback(err);
  6999. var url = getUrl({
  7000. ForcePathStyle: self.options.ForcePathStyle,
  7001. protocol: self.options.Protocol,
  7002. domain: self.options.Domain,
  7003. bucket: params.Bucket,
  7004. region: params.Region,
  7005. object: params.Key,
  7006. isLocation: true
  7007. });
  7008. var res = data.CompleteMultipartUploadResult || {};
  7009. if (res.ProcessResults) {
  7010. if (res && res.ProcessResults) {
  7011. res.UploadResult = {
  7012. OriginalInfo: {
  7013. Key: res.Key,
  7014. Location: url,
  7015. ETag: res.ETag,
  7016. ImageInfo: res.ImageInfo
  7017. },
  7018. ProcessResults: res.ProcessResults
  7019. };
  7020. delete res.ImageInfo;
  7021. delete res.ProcessResults;
  7022. }
  7023. }
  7024. var result = util.extend(res, {
  7025. Location: url,
  7026. statusCode: data.statusCode,
  7027. headers: data.headers
  7028. });
  7029. callback(null, result);
  7030. });
  7031. }
  7032. /**
  7033. * 分块上传任务列表查询
  7034. * @param {Object} params 参数对象,必须
  7035. * @param {String} params.Bucket Bucket名称,必须
  7036. * @param {String} params.Region 地域名称,必须
  7037. * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,定义为Common Prefix,然后列出所有Common Prefix。如果没有Prefix,则从路径起点开始,非必须
  7038. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  7039. * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须
  7040. * @param {String} params.MaxUploads 单次返回最大的条目数量,默认1000,非必须
  7041. * @param {String} params.KeyMarker 与upload-id-marker一起使用 </Br>当upload-id-marker未被指定时,ObjectName字母顺序大于key-marker的条目将被列出 </Br>当upload-id-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须
  7042. * @param {String} params.UploadIdMarker 与key-marker一起使用 </Br>当key-marker未被指定时,upload-id-marker将被忽略 </Br>当key-marker被指定时,ObjectName字母顺序大于key-marker的条目被列出,ObjectName字母顺序等于key-marker同时UploadId大于upload-id-marker的条目将被列出,非必须
  7043. * @param {Function} callback 回调函数,必须
  7044. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7045. * @return {Object} data 返回的数据
  7046. * @return {Object} data.ListMultipartUploadsResult 分块上传任务信息
  7047. */
  7048. function multipartList(params, callback) {
  7049. var reqParams = {};
  7050. reqParams['delimiter'] = params['Delimiter'];
  7051. reqParams['encoding-type'] = params['EncodingType'];
  7052. reqParams['prefix'] = params['Prefix'] || '';
  7053. reqParams['max-uploads'] = params['MaxUploads'];
  7054. reqParams['key-marker'] = params['KeyMarker'];
  7055. reqParams['upload-id-marker'] = params['UploadIdMarker'];
  7056. reqParams = util.clearKey(reqParams);
  7057. submitRequest.call(this, {
  7058. Action: 'name/cos:ListMultipartUploads',
  7059. ResourceKey: reqParams['prefix'],
  7060. method: 'GET',
  7061. Bucket: params.Bucket,
  7062. Region: params.Region,
  7063. headers: params.Headers,
  7064. qs: reqParams,
  7065. action: 'uploads'
  7066. }, function (err, data) {
  7067. if (err) return callback(err);
  7068. if (data && data.ListMultipartUploadsResult) {
  7069. var Upload = data.ListMultipartUploadsResult.Upload || [];
  7070. Upload = util.isArray(Upload) ? Upload : [Upload];
  7071. data.ListMultipartUploadsResult.Upload = Upload;
  7072. }
  7073. var result = util.clone(data.ListMultipartUploadsResult || {});
  7074. util.extend(result, {
  7075. statusCode: data.statusCode,
  7076. headers: data.headers
  7077. });
  7078. callback(null, result);
  7079. });
  7080. }
  7081. /**
  7082. * 上传的分块列表查询
  7083. * @param {Object} params 参数对象,必须
  7084. * @param {String} params.Bucket Bucket名称,必须
  7085. * @param {String} params.Region 地域名称,必须
  7086. * @param {String} params.Key object名称,必须
  7087. * @param {String} params.UploadId 标示本次分块上传的ID,必须
  7088. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  7089. * @param {String} params.MaxParts 单次返回最大的条目数量,默认1000,非必须
  7090. * @param {String} params.PartNumberMarker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须
  7091. * @param {Function} callback 回调函数,必须
  7092. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7093. * @return {Object} data 返回的数据
  7094. * @return {Object} data.ListMultipartUploadsResult 分块信息
  7095. */
  7096. function multipartListPart(params, callback) {
  7097. var reqParams = {};
  7098. reqParams['uploadId'] = params['UploadId'];
  7099. reqParams['encoding-type'] = params['EncodingType'];
  7100. reqParams['max-parts'] = params['MaxParts'];
  7101. reqParams['part-number-marker'] = params['PartNumberMarker'];
  7102. submitRequest.call(this, {
  7103. Action: 'name/cos:ListParts',
  7104. method: 'GET',
  7105. Bucket: params.Bucket,
  7106. Region: params.Region,
  7107. Key: params.Key,
  7108. headers: params.Headers,
  7109. qs: reqParams
  7110. }, function (err, data) {
  7111. if (err) return callback(err);
  7112. var ListPartsResult = data.ListPartsResult || {};
  7113. var Part = ListPartsResult.Part || [];
  7114. Part = util.isArray(Part) ? Part : [Part];
  7115. ListPartsResult.Part = Part;
  7116. var result = util.clone(ListPartsResult);
  7117. util.extend(result, {
  7118. statusCode: data.statusCode,
  7119. headers: data.headers
  7120. });
  7121. callback(null, result);
  7122. });
  7123. }
  7124. /**
  7125. * 抛弃分块上传
  7126. * @param {Object} params 参数对象,必须
  7127. * @param {String} params.Bucket Bucket名称,必须
  7128. * @param {String} params.Region 地域名称,必须
  7129. * @param {String} params.Key object名称,必须
  7130. * @param {String} params.UploadId 标示本次分块上传的ID,必须
  7131. * @param {Function} callback 回调函数,必须
  7132. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7133. * @return {Object} data 返回的数据
  7134. */
  7135. function multipartAbort(params, callback) {
  7136. var reqParams = {};
  7137. reqParams['uploadId'] = params['UploadId'];
  7138. submitRequest.call(this, {
  7139. Action: 'name/cos:AbortMultipartUpload',
  7140. method: 'DELETE',
  7141. Bucket: params.Bucket,
  7142. Region: params.Region,
  7143. Key: params.Key,
  7144. headers: params.Headers,
  7145. qs: reqParams
  7146. }, function (err, data) {
  7147. if (err) return callback(err);
  7148. callback(null, {
  7149. statusCode: data.statusCode,
  7150. headers: data.headers
  7151. });
  7152. });
  7153. }
  7154. /**
  7155. * 抛弃分块上传
  7156. * @param {Object} params 参数对象,必须
  7157. * @param {String} params.Bucket Bucket名称,必须
  7158. * @param {String} params.Region 地域名称,必须
  7159. * @param {String} params.Key object名称,必须
  7160. * @param {String} params.UploadId 标示本次分块上传的ID,必须
  7161. * @param {Function} callback 回调函数,必须
  7162. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7163. * @return {Object} data 返回的数据
  7164. */
  7165. function request(params, callback) {
  7166. submitRequest.call(this, {
  7167. method: params.Method,
  7168. Bucket: params.Bucket,
  7169. Region: params.Region,
  7170. Key: params.Key,
  7171. action: params.Action,
  7172. headers: params.Headers,
  7173. qs: params.Query,
  7174. body: params.Body,
  7175. Url: params.Url,
  7176. rawBody: params.RawBody
  7177. }, function (err, data) {
  7178. if (err) return callback(err);
  7179. if (data && data.body) {
  7180. data.Body = data.body;
  7181. delete data.body;
  7182. }
  7183. callback(err, data);
  7184. });
  7185. }
  7186. /**
  7187. * 追加上传
  7188. * @param {Object} params 参数对象,必须
  7189. * @param {String} params.Bucket Bucket名称,必须
  7190. * @param {String} params.Region 地域名称,必须
  7191. * @param {String} params.Key object名称,必须
  7192. * @param {File || Blob || String} params.Body 上传文件对象或字符串
  7193. * @param {Number} params.Position 追加操作的起始点,单位为字节,必须
  7194. * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须
  7195. * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须
  7196. * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须
  7197. * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须
  7198. * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须
  7199. * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须
  7200. * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须
  7201. * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须
  7202. * @param {String} params.GrantRead 赋予被授权者读取对象的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  7203. * @param {String} params.GrantReadAcp 赋予被授权者读取对象的访问控制列表(ACL)的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  7204. * @param {String} params.GrantWriteAcp 赋予被授权者写入对象的访问控制列表(ACL)的权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  7205. * @param {String} params.GrantFullControl 赋予被授权者操作对象的所有权限,格式:id="[OwnerUin]",可使用半角逗号(,)分隔多组被授权者,非必须
  7206. * @param {String} params.StorageClass 设置对象的存储级别,枚举值:STANDARD、STANDARD_IA、ARCHIVE,默认值:STANDARD,非必须
  7207. * @param {String} params.x-cos-meta-* 允许用户自定义的头部信息,将作为对象的元数据保存。大小限制2KB,非必须
  7208. * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须
  7209. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  7210. * @param {Function} callback 回调函数,必须
  7211. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7212. * @return {Object} data 返回的数据
  7213. */
  7214. function appendObject(params, callback) {
  7215. // 特殊处理 Cache-Control、Content-Type,避免代理更改这两个字段导致写入到 Object 属性里
  7216. var headers = params.Headers;
  7217. if (!headers['Cache-Control'] && !headers['cache-control']) headers['Cache-Control'] = '';
  7218. if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = params.Body && params.Body.type || '';
  7219. submitRequest.call(this, {
  7220. Action: 'name/cos:AppendObject',
  7221. method: 'POST',
  7222. Bucket: params.Bucket,
  7223. Region: params.Region,
  7224. action: 'append',
  7225. Key: params.Key,
  7226. body: params.Body,
  7227. qs: {
  7228. position: params.Position
  7229. },
  7230. headers: params.Headers
  7231. }, function (err, data) {
  7232. if (err) return callback(err);
  7233. callback(null, data);
  7234. });
  7235. }
  7236. /**
  7237. * 获取签名
  7238. * @param {Object} params 参数对象,必须
  7239. * @param {String} params.Method 请求方法,必须
  7240. * @param {String} params.Key object名称,必须
  7241. * @param {String} params.Expires 名超时时间,单位秒,可选
  7242. * @return {String} data 返回签名字符串
  7243. */
  7244. function getAuth(params) {
  7245. var self = this;
  7246. return util.getAuth({
  7247. SecretId: params.SecretId || this.options.SecretId || '',
  7248. SecretKey: params.SecretKey || this.options.SecretKey || '',
  7249. Method: params.Method,
  7250. Key: params.Key,
  7251. Query: params.Query,
  7252. Headers: params.Headers,
  7253. Expires: params.Expires,
  7254. UseRawKey: self.options.UseRawKey,
  7255. SystemClockOffset: self.options.SystemClockOffset
  7256. });
  7257. }
  7258. /**
  7259. * 获取文件下载链接
  7260. * @param {Object} params 参数对象,必须
  7261. * @param {String} params.Bucket Bucket名称,必须
  7262. * @param {String} params.Region 地域名称,必须
  7263. * @param {String} params.Key object名称,必须
  7264. * @param {String} params.Method 请求的方法,可选
  7265. * @param {String} params.Expires 签名超时时间,单位秒,可选
  7266. * @param {Function} callback 回调函数,必须
  7267. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  7268. * @return {Object} data 返回的数据
  7269. */
  7270. function getObjectUrl(params, callback) {
  7271. var self = this;
  7272. var url = getUrl({
  7273. ForcePathStyle: self.options.ForcePathStyle,
  7274. protocol: params.Protocol || self.options.Protocol,
  7275. domain: params.Domain || self.options.Domain,
  7276. bucket: params.Bucket,
  7277. region: params.Region,
  7278. object: params.Key
  7279. });
  7280. var queryParamsStr = '';
  7281. if (params.Query) {
  7282. queryParamsStr += util.obj2str(params.Query);
  7283. }
  7284. if (params.QueryString) {
  7285. queryParamsStr += (queryParamsStr ? '&' : '') + params.QueryString;
  7286. }
  7287. var syncUrl = url;
  7288. if (params.Sign !== undefined && !params.Sign) {
  7289. queryParamsStr && (syncUrl += '?' + queryParamsStr);
  7290. callback(null, { Url: syncUrl });
  7291. return syncUrl;
  7292. }
  7293. var AuthData = getAuthorizationAsync.call(this, {
  7294. Action: (params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject',
  7295. Bucket: params.Bucket || '',
  7296. Region: params.Region || '',
  7297. Method: params.Method || 'get',
  7298. Key: params.Key,
  7299. Expires: params.Expires,
  7300. Headers: params.Headers,
  7301. Query: params.Query
  7302. }, function (err, AuthData) {
  7303. if (!callback) return;
  7304. if (err) {
  7305. callback(err);
  7306. return;
  7307. }
  7308. var signUrl = url;
  7309. signUrl += '?' + (AuthData.Authorization.indexOf('q-signature') > -1 ? AuthData.Authorization : 'sign=' + encodeURIComponent(AuthData.Authorization));
  7310. AuthData.SecurityToken && (signUrl += '&x-cos-security-token=' + AuthData.SecurityToken);
  7311. AuthData.ClientIP && (signUrl += '&clientIP=' + AuthData.ClientIP);
  7312. AuthData.ClientUA && (signUrl += '&clientUA=' + AuthData.ClientUA);
  7313. AuthData.Token && (signUrl += '&token=' + AuthData.Token);
  7314. queryParamsStr && (signUrl += '&' + queryParamsStr);
  7315. setTimeout(function () {
  7316. callback(null, { Url: signUrl });
  7317. });
  7318. });
  7319. if (AuthData) {
  7320. syncUrl += '?' + AuthData.Authorization + (AuthData.SecurityToken ? '&x-cos-security-token=' + AuthData.SecurityToken : '');
  7321. queryParamsStr && (syncUrl += '&' + queryParamsStr);
  7322. } else {
  7323. queryParamsStr && (syncUrl += '?' + queryParamsStr);
  7324. }
  7325. return syncUrl;
  7326. }
  7327. /**
  7328. * 私有方法
  7329. */
  7330. function decodeAcl(AccessControlPolicy) {
  7331. var result = {
  7332. GrantFullControl: [],
  7333. GrantWrite: [],
  7334. GrantRead: [],
  7335. GrantReadAcp: [],
  7336. GrantWriteAcp: [],
  7337. ACL: ''
  7338. };
  7339. var GrantMap = {
  7340. 'FULL_CONTROL': 'GrantFullControl',
  7341. 'WRITE': 'GrantWrite',
  7342. 'READ': 'GrantRead',
  7343. 'READ_ACP': 'GrantReadAcp',
  7344. 'WRITE_ACP': 'GrantWriteAcp'
  7345. };
  7346. var AccessControlList = AccessControlPolicy && AccessControlPolicy.AccessControlList || {};
  7347. var Grant = AccessControlList.Grant;
  7348. if (Grant) {
  7349. Grant = util.isArray(Grant) ? Grant : [Grant];
  7350. }
  7351. var PublicAcl = { READ: 0, WRITE: 0, FULL_CONTROL: 0 };
  7352. Grant && Grant.length && util.each(Grant, function (item) {
  7353. if (item.Grantee.ID === 'qcs::cam::anyone:anyone' || item.Grantee.URI === 'http://cam.qcloud.com/groups/global/AllUsers') {
  7354. PublicAcl[item.Permission] = 1;
  7355. } else if (item.Grantee.ID !== AccessControlPolicy.Owner.ID) {
  7356. result[GrantMap[item.Permission]].push('id="' + item.Grantee.ID + '"');
  7357. }
  7358. });
  7359. if (PublicAcl.FULL_CONTROL || PublicAcl.WRITE && PublicAcl.READ) {
  7360. result.ACL = 'public-read-write';
  7361. } else if (PublicAcl.READ) {
  7362. result.ACL = 'public-read';
  7363. } else {
  7364. result.ACL = 'private';
  7365. }
  7366. util.each(GrantMap, function (item) {
  7367. result[item] = uniqGrant(result[item].join(','));
  7368. });
  7369. return result;
  7370. }
  7371. // Grant 去重
  7372. function uniqGrant(str) {
  7373. var arr = str.split(',');
  7374. var exist = {};
  7375. var i, item;
  7376. for (i = 0; i < arr.length;) {
  7377. item = arr[i].trim();
  7378. if (exist[item]) {
  7379. arr.splice(i, 1);
  7380. } else {
  7381. exist[item] = true;
  7382. arr[i] = item;
  7383. i++;
  7384. }
  7385. }
  7386. return arr.join(',');
  7387. }
  7388. // 生成操作 url
  7389. function getUrl(params) {
  7390. var region = params.region || '';
  7391. var longBucket = params.bucket || '';
  7392. var shortBucket = longBucket.substr(0, longBucket.lastIndexOf('-'));
  7393. var appId = longBucket.substr(longBucket.lastIndexOf('-') + 1);
  7394. var domain = params.domain;
  7395. var object = params.object;
  7396. if (typeof domain === 'function') {
  7397. domain = domain({ Bucket: longBucket, Region: region });
  7398. }
  7399. var protocol = params.protocol || (util.isBrowser && location.protocol === 'http:' ? 'http:' : 'https:');
  7400. if (!domain) {
  7401. if (['cn-south', 'cn-south-2', 'cn-north', 'cn-east', 'cn-southwest', 'sg'].indexOf(region) > -1) {
  7402. domain = '{Region}.myqcloud.com';
  7403. } else {
  7404. domain = 'cos.{Region}.myqcloud.com';
  7405. }
  7406. if (!params.ForcePathStyle) {
  7407. domain = '{Bucket}.' + domain;
  7408. }
  7409. }
  7410. domain = domain.replace(/\{\{AppId\}\}/ig, appId).replace(/\{\{Bucket\}\}/ig, shortBucket).replace(/\{\{Region\}\}/ig, region).replace(/\{\{.*?\}\}/ig, '');
  7411. domain = domain.replace(/\{AppId\}/ig, appId).replace(/\{BucketName\}/ig, shortBucket).replace(/\{Bucket\}/ig, longBucket).replace(/\{Region\}/ig, region).replace(/\{.*?\}/ig, '');
  7412. if (!/^[a-zA-Z]+:\/\//.test(domain)) {
  7413. domain = protocol + '//' + domain;
  7414. }
  7415. // 去掉域名最后的斜杆
  7416. if (domain.slice(-1) === '/') {
  7417. domain = domain.slice(0, -1);
  7418. }
  7419. var url = domain;
  7420. if (params.ForcePathStyle) {
  7421. url += '/' + longBucket;
  7422. }
  7423. url += '/';
  7424. if (object) {
  7425. url += util.camSafeUrlEncode(object).replace(/%2F/g, '/');
  7426. }
  7427. if (params.isLocation) {
  7428. url = url.replace(/^https?:\/\//, '');
  7429. }
  7430. return url;
  7431. }
  7432. // 异步获取签名
  7433. function getAuthorizationAsync(params, callback) {
  7434. var headers = util.clone(params.Headers);
  7435. util.each(headers, function (v, k) {
  7436. (v === '' || ['content-type', 'cache-control', 'expires'].indexOf(k.toLowerCase()) > -1) && delete headers[k];
  7437. });
  7438. // 获取凭证的回调,避免用户 callback 多次
  7439. var cbDone = false;
  7440. var cb = function (err, AuthData) {
  7441. if (cbDone) return;
  7442. cbDone = true;
  7443. if (AuthData && AuthData.XCosSecurityToken && !AuthData.SecurityToken) {
  7444. AuthData = util.clone(AuthData);
  7445. AuthData.SecurityToken = AuthData.XCosSecurityToken;
  7446. delete AuthData.XCosSecurityToken;
  7447. }
  7448. callback && callback(err, AuthData);
  7449. };
  7450. var self = this;
  7451. var Bucket = params.Bucket || '';
  7452. var Region = params.Region || '';
  7453. // PathName
  7454. var KeyName = params.Key || '';
  7455. if (self.options.ForcePathStyle && Bucket) {
  7456. KeyName = Bucket + '/' + KeyName;
  7457. }
  7458. var Pathname = '/' + KeyName;
  7459. // Action、ResourceKey
  7460. var StsData = {};
  7461. var Scope = params.Scope;
  7462. if (!Scope) {
  7463. var Action = params.Action || '';
  7464. var ResourceKey = params.ResourceKey || params.Key || '';
  7465. Scope = params.Scope || [{
  7466. action: Action,
  7467. bucket: Bucket,
  7468. region: Region,
  7469. prefix: ResourceKey
  7470. }];
  7471. }
  7472. var ScopeKey = util.md5(JSON.stringify(Scope));
  7473. // STS
  7474. self._StsCache = self._StsCache || [];
  7475. (function () {
  7476. var i, AuthData;
  7477. for (i = self._StsCache.length - 1; i >= 0; i--) {
  7478. AuthData = self._StsCache[i];
  7479. var compareTime = Math.round(util.getSkewTime(self.options.SystemClockOffset) / 1000) + 30;
  7480. if (AuthData.StartTime && compareTime < AuthData.StartTime || compareTime >= AuthData.ExpiredTime) {
  7481. self._StsCache.splice(i, 1);
  7482. continue;
  7483. }
  7484. if (!AuthData.ScopeLimit || AuthData.ScopeLimit && AuthData.ScopeKey === ScopeKey) {
  7485. StsData = AuthData;
  7486. break;
  7487. }
  7488. }
  7489. })();
  7490. var calcAuthByTmpKey = function () {
  7491. var KeyTime = StsData.StartTime && StsData.ExpiredTime ? StsData.StartTime + ';' + StsData.ExpiredTime : '';
  7492. var Authorization = util.getAuth({
  7493. SecretId: StsData.TmpSecretId,
  7494. SecretKey: StsData.TmpSecretKey,
  7495. Method: params.Method,
  7496. Pathname: Pathname,
  7497. Query: params.Query,
  7498. Headers: headers,
  7499. Expires: params.Expires,
  7500. UseRawKey: self.options.UseRawKey,
  7501. SystemClockOffset: self.options.SystemClockOffset,
  7502. KeyTime: KeyTime
  7503. });
  7504. var AuthData = {
  7505. Authorization: Authorization,
  7506. SecurityToken: StsData.SecurityToken || StsData.XCosSecurityToken || '',
  7507. Token: StsData.Token || '',
  7508. ClientIP: StsData.ClientIP || '',
  7509. ClientUA: StsData.ClientUA || ''
  7510. };
  7511. cb(null, AuthData);
  7512. };
  7513. var checkAuthError = function (AuthData) {
  7514. if (AuthData.Authorization) {
  7515. // 检查签名格式
  7516. var formatAllow = false;
  7517. var auth = AuthData.Authorization;
  7518. if (auth) {
  7519. if (auth.indexOf(' ') > -1) {
  7520. formatAllow = false;
  7521. } else if (auth.indexOf('q-sign-algorithm=') > -1 && auth.indexOf('q-ak=') > -1 && auth.indexOf('q-sign-time=') > -1 && auth.indexOf('q-key-time=') > -1 && auth.indexOf('q-url-param-list=') > -1) {
  7522. formatAllow = true;
  7523. } else {
  7524. try {
  7525. auth = atob(auth);
  7526. if (auth.indexOf('a=') > -1 && auth.indexOf('k=') > -1 && auth.indexOf('t=') > -1 && auth.indexOf('r=') > -1 && auth.indexOf('b=') > -1) {
  7527. formatAllow = true;
  7528. }
  7529. } catch (e) {}
  7530. }
  7531. }
  7532. if (!formatAllow) return util.error(new Error('getAuthorization callback params format error'));
  7533. } else {
  7534. if (!AuthData.TmpSecretId) return util.error(new Error('getAuthorization callback params missing "TmpSecretId"'));
  7535. if (!AuthData.TmpSecretKey) return util.error(new Error('getAuthorization callback params missing "TmpSecretKey"'));
  7536. if (!AuthData.SecurityToken && !AuthData.XCosSecurityToken) return util.error(new Error('getAuthorization callback params missing "SecurityToken"'));
  7537. if (!AuthData.ExpiredTime) return util.error(new Error('getAuthorization callback params missing "ExpiredTime"'));
  7538. if (AuthData.ExpiredTime && AuthData.ExpiredTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params "ExpiredTime" should be 10 digits'));
  7539. if (AuthData.StartTime && AuthData.StartTime.toString().length !== 10) return util.error(new Error('getAuthorization callback params "StartTime" should be 10 StartTime'));
  7540. }
  7541. return false;
  7542. };
  7543. // 先判断是否有临时密钥
  7544. if (StsData.ExpiredTime && StsData.ExpiredTime - util.getSkewTime(self.options.SystemClockOffset) / 1000 > 60) {
  7545. // 如果缓存的临时密钥有效,并还有超过60秒有效期就直接使用
  7546. calcAuthByTmpKey();
  7547. } else if (self.options.getAuthorization) {
  7548. // 外部计算签名或获取临时密钥
  7549. self.options.getAuthorization.call(self, {
  7550. Bucket: Bucket,
  7551. Region: Region,
  7552. Method: params.Method,
  7553. Key: KeyName,
  7554. Pathname: Pathname,
  7555. Query: params.Query,
  7556. Headers: headers,
  7557. Scope: Scope,
  7558. SystemClockOffset: self.options.SystemClockOffset
  7559. }, function (AuthData) {
  7560. if (typeof AuthData === 'string') AuthData = { Authorization: AuthData };
  7561. var AuthError = checkAuthError(AuthData);
  7562. if (AuthError) return cb(AuthError);
  7563. if (AuthData.Authorization) {
  7564. cb(null, AuthData);
  7565. } else {
  7566. StsData = AuthData || {};
  7567. StsData.Scope = Scope;
  7568. StsData.ScopeKey = ScopeKey;
  7569. self._StsCache.push(StsData);
  7570. calcAuthByTmpKey();
  7571. }
  7572. });
  7573. } else if (self.options.getSTS) {
  7574. // 外部获取临时密钥
  7575. self.options.getSTS.call(self, {
  7576. Bucket: Bucket,
  7577. Region: Region
  7578. }, function (data) {
  7579. StsData = data || {};
  7580. StsData.Scope = Scope;
  7581. StsData.ScopeKey = ScopeKey;
  7582. if (!StsData.TmpSecretId) StsData.TmpSecretId = StsData.SecretId;
  7583. if (!StsData.TmpSecretKey) StsData.TmpSecretKey = StsData.SecretKey;
  7584. var AuthError = checkAuthError(StsData);
  7585. if (AuthError) return cb(AuthError);
  7586. self._StsCache.push(StsData);
  7587. calcAuthByTmpKey();
  7588. });
  7589. } else {
  7590. // 内部计算获取签名
  7591. return function () {
  7592. var Authorization = util.getAuth({
  7593. SecretId: params.SecretId || self.options.SecretId,
  7594. SecretKey: params.SecretKey || self.options.SecretKey,
  7595. Method: params.Method,
  7596. Pathname: Pathname,
  7597. Query: params.Query,
  7598. Headers: headers,
  7599. Expires: params.Expires,
  7600. UseRawKey: self.options.UseRawKey,
  7601. SystemClockOffset: self.options.SystemClockOffset
  7602. });
  7603. var AuthData = {
  7604. Authorization: Authorization,
  7605. SecurityToken: self.options.SecurityToken || self.options.XCosSecurityToken
  7606. };
  7607. cb(null, AuthData);
  7608. return AuthData;
  7609. }();
  7610. }
  7611. return '';
  7612. }
  7613. // 调整时间偏差
  7614. function allowRetry(err) {
  7615. var allowRetry = false;
  7616. var isTimeError = false;
  7617. var serverDate = err.headers && (err.headers.date || err.headers.Date) || err.error && err.error.ServerTime;
  7618. try {
  7619. var errorCode = err.error.Code;
  7620. var errorMessage = err.error.Message;
  7621. if (errorCode === 'RequestTimeTooSkewed' || errorCode === 'AccessDenied' && errorMessage === 'Request has expired') {
  7622. isTimeError = true;
  7623. }
  7624. } catch (e) {}
  7625. if (err) {
  7626. if (isTimeError && serverDate) {
  7627. var serverTime = Date.parse(serverDate);
  7628. if (this.options.CorrectClockSkew && Math.abs(util.getSkewTime(this.options.SystemClockOffset) - serverTime) >= 30000) {
  7629. console.error('error: Local time is too skewed.');
  7630. this.options.SystemClockOffset = serverTime - Date.now();
  7631. allowRetry = true;
  7632. }
  7633. } else if (Math.floor(err.statusCode / 100) === 5) {
  7634. allowRetry = true;
  7635. }
  7636. }
  7637. return allowRetry;
  7638. }
  7639. // 获取签名并发起请求
  7640. function submitRequest(params, callback) {
  7641. var self = this;
  7642. // 处理 headers
  7643. !params.headers && (params.headers = {});
  7644. // 处理 query
  7645. !params.qs && (params.qs = {});
  7646. params.VersionId && (params.qs.versionId = params.VersionId);
  7647. params.qs = util.clearKey(params.qs);
  7648. // 清理 undefined 和 null 字段
  7649. params.headers && (params.headers = util.clearKey(params.headers));
  7650. params.qs && (params.qs = util.clearKey(params.qs));
  7651. var Query = util.clone(params.qs);
  7652. params.action && (Query[params.action] = '');
  7653. var next = function (tryTimes) {
  7654. var oldClockOffset = self.options.SystemClockOffset;
  7655. getAuthorizationAsync.call(self, {
  7656. Bucket: params.Bucket || '',
  7657. Region: params.Region || '',
  7658. Method: params.method,
  7659. Key: params.Key,
  7660. Query: Query,
  7661. Headers: params.headers,
  7662. Action: params.Action,
  7663. ResourceKey: params.ResourceKey,
  7664. Scope: params.Scope
  7665. }, function (err, AuthData) {
  7666. if (err) {
  7667. callback(err);
  7668. return;
  7669. }
  7670. params.AuthData = AuthData;
  7671. _submitRequest.call(self, params, function (err, data) {
  7672. if (err && tryTimes < 2 && (oldClockOffset !== self.options.SystemClockOffset || allowRetry.call(self, err))) {
  7673. if (params.headers) {
  7674. delete params.headers.Authorization;
  7675. delete params.headers['token'];
  7676. delete params.headers['clientIP'];
  7677. delete params.headers['clientUA'];
  7678. params.headers['x-cos-security-token'] && delete params.headers['x-cos-security-token'];
  7679. params.headers['x-ci-security-token'] && delete params.headers['x-ci-security-token'];
  7680. }
  7681. next(tryTimes + 1);
  7682. } else {
  7683. callback(err, data);
  7684. }
  7685. });
  7686. });
  7687. };
  7688. next(1);
  7689. }
  7690. // 发起请求
  7691. function _submitRequest(params, callback) {
  7692. var self = this;
  7693. var TaskId = params.TaskId;
  7694. if (TaskId && !self._isRunningTask(TaskId)) return;
  7695. var bucket = params.Bucket;
  7696. var region = params.Region;
  7697. var object = params.Key;
  7698. var method = params.method || 'GET';
  7699. var url = params.Url || params.url;
  7700. var body = params.body;
  7701. var rawBody = params.rawBody;
  7702. // url
  7703. if (self.options.UseAccelerate) {
  7704. region = 'accelerate';
  7705. }
  7706. url = url || getUrl({
  7707. ForcePathStyle: self.options.ForcePathStyle,
  7708. protocol: self.options.Protocol,
  7709. domain: self.options.Domain,
  7710. bucket: bucket,
  7711. region: region,
  7712. object: object
  7713. });
  7714. if (params.action) {
  7715. url = url + '?' + params.action;
  7716. }
  7717. if (params.qsStr) {
  7718. if (url.indexOf('?') > -1) {
  7719. url = url + '&' + params.qsStr;
  7720. } else {
  7721. url = url + '?' + params.qsStr;
  7722. }
  7723. }
  7724. var opt = {
  7725. method: method,
  7726. url: url,
  7727. headers: params.headers,
  7728. qs: params.qs,
  7729. body: body
  7730. };
  7731. // 兼容ci接口
  7732. var token = 'x-cos-security-token';
  7733. if (util.isCIHost(url)) {
  7734. token = 'x-ci-security-token';
  7735. }
  7736. // 获取签名
  7737. opt.headers.Authorization = params.AuthData.Authorization;
  7738. params.AuthData.Token && (opt.headers['token'] = params.AuthData.Token);
  7739. params.AuthData.ClientIP && (opt.headers['clientIP'] = params.AuthData.ClientIP);
  7740. params.AuthData.ClientUA && (opt.headers['clientUA'] = params.AuthData.ClientUA);
  7741. params.AuthData.SecurityToken && (opt.headers[token] = params.AuthData.SecurityToken);
  7742. // 清理 undefined 和 null 字段
  7743. opt.headers && (opt.headers = util.clearKey(opt.headers));
  7744. opt = util.clearKey(opt);
  7745. // progress
  7746. if (params.onProgress && typeof params.onProgress === 'function') {
  7747. var contentLength = body && (body.size || body.length) || 0;
  7748. opt.onProgress = function (e) {
  7749. if (TaskId && !self._isRunningTask(TaskId)) return;
  7750. var loaded = e ? e.loaded : 0;
  7751. params.onProgress({ loaded: loaded, total: contentLength });
  7752. };
  7753. }
  7754. if (params.onDownloadProgress) {
  7755. opt.onDownloadProgress = params.onDownloadProgress;
  7756. }
  7757. if (params.DataType) {
  7758. opt.dataType = params.DataType;
  7759. }
  7760. if (this.options.Timeout) {
  7761. opt.timeout = this.options.Timeout;
  7762. }
  7763. self.options.ForcePathStyle && (opt.pathStyle = self.options.ForcePathStyle);
  7764. self.emit('before-send', opt);
  7765. var sender = (self.options.Request || REQUEST)(opt, function (r) {
  7766. if (r.error === 'abort') return;
  7767. var receive = {
  7768. options: opt,
  7769. error: err,
  7770. statusCode: response && response.statusCode || 0,
  7771. headers: response && response.headers || {},
  7772. body: body
  7773. };
  7774. self.emit('after-receive', receive);
  7775. err = receive.error;
  7776. body = receive.body;
  7777. response = {
  7778. statusCode: receive.statusCode,
  7779. headers: receive.headers
  7780. };
  7781. // 抛出事件,允许修改返回值的 error、statusCode、statusMessage、body
  7782. self.emit('after-receive', r);
  7783. var response = { statusCode: r.statusCode, statusMessage: r.statusMessage, headers: r.headers };
  7784. var err = r.error;
  7785. var body = r.body;
  7786. // 返回内容添加 状态码 和 headers
  7787. var hasReturned;
  7788. var cb = function (err, data) {
  7789. TaskId && self.off('inner-kill-task', killTask);
  7790. if (hasReturned) return;
  7791. hasReturned = true;
  7792. var attrs = {};
  7793. response && response.statusCode && (attrs.statusCode = response.statusCode);
  7794. response && response.headers && (attrs.headers = response.headers);
  7795. if (err) {
  7796. err = util.extend(err || {}, attrs);
  7797. callback(err, null);
  7798. } else {
  7799. data = util.extend(data || {}, attrs);
  7800. callback(null, data);
  7801. }
  7802. sender = null;
  7803. };
  7804. // 请求错误,发生网络错误
  7805. if (err) return cb(util.error(err));
  7806. // 请求返回码不为 200
  7807. var statusCode = response.statusCode;
  7808. var statusSuccess = Math.floor(statusCode / 100) === 2; // 200 202 204 206
  7809. // 不对 body 进行转换,body 直接挂载返回
  7810. if (rawBody && statusSuccess) return cb(null, { body: body });
  7811. // 解析 xml body
  7812. var json;
  7813. try {
  7814. json = body && body.indexOf('<') > -1 && body.indexOf('>') > -1 && util.xml2json(body) || {};
  7815. } catch (e) {
  7816. json = {};
  7817. }
  7818. // 处理返回值
  7819. var xmlError = json && json.Error;
  7820. if (statusSuccess) {
  7821. // 正确返回,状态码 2xx 时,body 不会有 Error
  7822. cb(null, json);
  7823. } else if (xmlError) {
  7824. // 正常返回了 xml body,且有 Error 节点
  7825. cb(util.error(new Error(xmlError.Message), { code: xmlError.Code, error: xmlError }));
  7826. } else if (statusCode) {
  7827. // 有错误的状态码
  7828. cb(util.error(new Error(response.statusMessage), { code: '' + statusCode }));
  7829. } else if (statusCode) {
  7830. // 无状态码,或者获取不到状态码
  7831. cb(util.error(new Error('statusCode error')));
  7832. }
  7833. });
  7834. // kill task
  7835. var killTask = function (data) {
  7836. if (data.TaskId === TaskId) {
  7837. sender && sender.abort && sender.abort();
  7838. self.off('inner-kill-task', killTask);
  7839. }
  7840. };
  7841. TaskId && self.on('inner-kill-task', killTask);
  7842. }
  7843. var API_MAP = {
  7844. // Bucket 相关方法
  7845. getService: getService, // Bucket
  7846. putBucket: putBucket,
  7847. headBucket: headBucket, // Bucket
  7848. getBucket: getBucket,
  7849. deleteBucket: deleteBucket,
  7850. putBucketAcl: putBucketAcl, // BucketACL
  7851. getBucketAcl: getBucketAcl,
  7852. putBucketCors: putBucketCors, // BucketCors
  7853. getBucketCors: getBucketCors,
  7854. deleteBucketCors: deleteBucketCors,
  7855. getBucketLocation: getBucketLocation, // BucketLocation
  7856. getBucketPolicy: getBucketPolicy, // BucketPolicy
  7857. putBucketPolicy: putBucketPolicy,
  7858. deleteBucketPolicy: deleteBucketPolicy,
  7859. putBucketTagging: putBucketTagging, // BucketTagging
  7860. getBucketTagging: getBucketTagging,
  7861. deleteBucketTagging: deleteBucketTagging,
  7862. putBucketLifecycle: putBucketLifecycle, // BucketLifecycle
  7863. getBucketLifecycle: getBucketLifecycle,
  7864. deleteBucketLifecycle: deleteBucketLifecycle,
  7865. putBucketVersioning: putBucketVersioning, // BucketVersioning
  7866. getBucketVersioning: getBucketVersioning,
  7867. putBucketReplication: putBucketReplication, // BucketReplication
  7868. getBucketReplication: getBucketReplication,
  7869. deleteBucketReplication: deleteBucketReplication,
  7870. putBucketWebsite: putBucketWebsite, // BucketWebsite
  7871. getBucketWebsite: getBucketWebsite,
  7872. deleteBucketWebsite: deleteBucketWebsite,
  7873. putBucketReferer: putBucketReferer, // BucketReferer
  7874. getBucketReferer: getBucketReferer,
  7875. putBucketDomain: putBucketDomain, // BucketDomain
  7876. getBucketDomain: getBucketDomain,
  7877. deleteBucketDomain: deleteBucketDomain,
  7878. putBucketOrigin: putBucketOrigin, // BucketOrigin
  7879. getBucketOrigin: getBucketOrigin,
  7880. deleteBucketOrigin: deleteBucketOrigin,
  7881. putBucketLogging: putBucketLogging, // BucketLogging
  7882. getBucketLogging: getBucketLogging,
  7883. putBucketInventory: putBucketInventory, // BucketInventory
  7884. getBucketInventory: getBucketInventory,
  7885. listBucketInventory: listBucketInventory,
  7886. deleteBucketInventory: deleteBucketInventory,
  7887. putBucketAccelerate: putBucketAccelerate,
  7888. getBucketAccelerate: getBucketAccelerate,
  7889. putBucketEncryption: putBucketEncryption,
  7890. getBucketEncryption: getBucketEncryption,
  7891. deleteBucketEncryption: deleteBucketEncryption,
  7892. // Object 相关方法
  7893. getObject: getObject,
  7894. headObject: headObject,
  7895. listObjectVersions: listObjectVersions,
  7896. putObject: putObject,
  7897. deleteObject: deleteObject,
  7898. getObjectAcl: getObjectAcl,
  7899. putObjectAcl: putObjectAcl,
  7900. optionsObject: optionsObject,
  7901. putObjectCopy: putObjectCopy,
  7902. deleteMultipleObject: deleteMultipleObject,
  7903. restoreObject: restoreObject,
  7904. putObjectTagging: putObjectTagging,
  7905. getObjectTagging: getObjectTagging,
  7906. deleteObjectTagging: deleteObjectTagging,
  7907. selectObjectContent: selectObjectContent,
  7908. appendObject: appendObject,
  7909. // 分块上传相关方法
  7910. uploadPartCopy: uploadPartCopy,
  7911. multipartInit: multipartInit,
  7912. multipartUpload: multipartUpload,
  7913. multipartComplete: multipartComplete,
  7914. multipartList: multipartList,
  7915. multipartListPart: multipartListPart,
  7916. multipartAbort: multipartAbort,
  7917. // 工具方法
  7918. request: request,
  7919. getObjectUrl: getObjectUrl,
  7920. getAuth: getAuth
  7921. };
  7922. function warnOldApi(apiName, fn, proto) {
  7923. util.each(['Cors', 'Acl'], function (suffix) {
  7924. if (apiName.slice(-suffix.length) === suffix) {
  7925. var oldName = apiName.slice(0, -suffix.length) + suffix.toUpperCase();
  7926. var apiFn = util.apiWrapper(apiName, fn);
  7927. var warned = false;
  7928. proto[oldName] = function () {
  7929. !warned && console.warn('warning: cos.' + oldName + ' has been deprecated. Please Use cos.' + apiName + ' instead.');
  7930. warned = true;
  7931. apiFn.apply(this, arguments);
  7932. };
  7933. }
  7934. });
  7935. }
  7936. module.exports.init = function (COS, task) {
  7937. task.transferToTaskMethod(API_MAP, 'putObject');
  7938. util.each(API_MAP, function (fn, apiName) {
  7939. COS.prototype[apiName] = util.apiWrapper(apiName, fn);
  7940. warnOldApi(apiName, fn, COS.prototype);
  7941. });
  7942. };
  7943. /***/ }),
  7944. /* 17 */
  7945. /***/ (function(module, exports) {
  7946. var stringifyPrimitive = function (v) {
  7947. switch (typeof v) {
  7948. case 'string':
  7949. return v;
  7950. case 'boolean':
  7951. return v ? 'true' : 'false';
  7952. case 'number':
  7953. return isFinite(v) ? v : '';
  7954. default:
  7955. return '';
  7956. }
  7957. };
  7958. var queryStringify = function (obj, sep, eq, name) {
  7959. sep = sep || '&';
  7960. eq = eq || '=';
  7961. if (obj === null) {
  7962. obj = undefined;
  7963. }
  7964. if (typeof obj === 'object') {
  7965. return Object.keys(obj).map(function (k) {
  7966. var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
  7967. if (Array.isArray(obj[k])) {
  7968. return obj[k].map(function (v) {
  7969. return ks + encodeURIComponent(stringifyPrimitive(v));
  7970. }).join(sep);
  7971. } else {
  7972. return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
  7973. }
  7974. }).filter(Boolean).join(sep);
  7975. }
  7976. if (!name) return '';
  7977. return encodeURIComponent(stringifyPrimitive(name)) + eq + encodeURIComponent(stringifyPrimitive(obj));
  7978. };
  7979. var xhrRes = function (err, xhr, body) {
  7980. var headers = {};
  7981. xhr.getAllResponseHeaders().trim().split('\n').forEach(function (item) {
  7982. if (item) {
  7983. var index = item.indexOf(':');
  7984. var key = item.substr(0, index).trim().toLowerCase();
  7985. var val = item.substr(index + 1).trim();
  7986. headers[key] = val;
  7987. }
  7988. });
  7989. return {
  7990. error: err,
  7991. statusCode: xhr.status,
  7992. statusMessage: xhr.statusText,
  7993. headers: headers,
  7994. body: body
  7995. };
  7996. };
  7997. var xhrBody = function (xhr, dataType) {
  7998. return !dataType && dataType === 'text' ? xhr.responseText : xhr.response;
  7999. };
  8000. var request = function (opt, callback) {
  8001. // method
  8002. var method = (opt.method || 'GET').toUpperCase();
  8003. // url、qs
  8004. var url = opt.url;
  8005. if (opt.qs) {
  8006. var qsStr = queryStringify(opt.qs);
  8007. if (qsStr) {
  8008. url += (url.indexOf('?') === -1 ? '?' : '&') + qsStr;
  8009. }
  8010. }
  8011. // 创建 ajax 实例
  8012. var xhr = new XMLHttpRequest();
  8013. xhr.open(method, url, true);
  8014. xhr.responseType = opt.dataType || 'text';
  8015. // 处理 xhrFields 属性
  8016. if (opt.xhrFields) {
  8017. for (var xhrField in opt.xhrFields) {
  8018. xhr[xhrField] = opt.xhrFields[xhrField];
  8019. }
  8020. }
  8021. // 处理 headers
  8022. var headers = opt.headers;
  8023. if (headers) {
  8024. for (var key in headers) {
  8025. if (headers.hasOwnProperty(key) && key.toLowerCase() !== 'content-length' && key.toLowerCase() !== 'user-agent' && key.toLowerCase() !== 'origin' && key.toLowerCase() !== 'host') {
  8026. xhr.setRequestHeader(key, headers[key]);
  8027. }
  8028. }
  8029. }
  8030. // onprogress
  8031. if (opt.onProgress && xhr.upload) xhr.upload.onprogress = opt.onProgress;
  8032. if (opt.onDownloadProgress) xhr.onprogress = opt.onDownloadProgress;
  8033. // timeout
  8034. if (opt.timeout) xhr.timeout = opt.timeout;
  8035. xhr.ontimeout = function (event) {
  8036. var error = new Error('timeout');
  8037. callback(xhrRes(error, xhr));
  8038. };
  8039. // success 2xx/3xx/4xx
  8040. xhr.onload = function () {
  8041. callback(xhrRes(null, xhr, xhrBody(xhr, opt.dataType)));
  8042. };
  8043. // error 5xx/0 (网络错误、跨域报错、Https connect-src 限制的报错时 statusCode 为 0)
  8044. xhr.onerror = function (err) {
  8045. var body = xhrBody(xhr, opt.dataType);
  8046. if (body) {
  8047. // 5xx
  8048. callback(xhrRes(null, xhr, body));
  8049. } else {
  8050. // 0
  8051. var error = xhr.statusText;
  8052. if (!error && xhr.status === 0) error = new Error('CORS blocked or network error');
  8053. callback(xhrRes(error, xhr, body));
  8054. }
  8055. };
  8056. // send
  8057. xhr.send(opt.body || '');
  8058. // 返回 ajax 实例,用于外部调用 xhr.abort
  8059. return xhr;
  8060. };
  8061. module.exports = request;
  8062. /***/ }),
  8063. /* 18 */
  8064. /***/ (function(module, exports, __webpack_require__) {
  8065. var session = __webpack_require__(4);
  8066. var Async = __webpack_require__(19);
  8067. var EventProxy = __webpack_require__(3).EventProxy;
  8068. var util = __webpack_require__(0);
  8069. // 文件分块上传全过程,暴露的分块上传接口
  8070. function sliceUploadFile(params, callback) {
  8071. var self = this;
  8072. var ep = new EventProxy();
  8073. var TaskId = params.TaskId;
  8074. var Bucket = params.Bucket;
  8075. var Region = params.Region;
  8076. var Key = params.Key;
  8077. var Body = params.Body;
  8078. var ChunkSize = params.ChunkSize || params.SliceSize || self.options.ChunkSize;
  8079. var AsyncLimit = params.AsyncLimit;
  8080. var StorageClass = params.StorageClass;
  8081. var ServerSideEncryption = params.ServerSideEncryption;
  8082. var FileSize;
  8083. var onProgress;
  8084. var onHashProgress = params.onHashProgress;
  8085. // 上传过程中出现错误,返回错误
  8086. ep.on('error', function (err) {
  8087. if (!self._isRunningTask(TaskId)) return;
  8088. err.UploadId = params.UploadData.UploadId || '';
  8089. return callback(err);
  8090. });
  8091. // 上传分块完成,开始 uploadSliceComplete 操作
  8092. ep.on('upload_complete', function (UploadCompleteData) {
  8093. var _UploadCompleteData = util.extend({
  8094. UploadId: params.UploadData.UploadId || ''
  8095. }, UploadCompleteData);
  8096. callback(null, _UploadCompleteData);
  8097. });
  8098. // 上传分块完成,开始 uploadSliceComplete 操作
  8099. ep.on('upload_slice_complete', function (UploadData) {
  8100. var metaHeaders = {};
  8101. util.each(params.Headers, function (val, k) {
  8102. var shortKey = k.toLowerCase();
  8103. if (shortKey.indexOf('x-cos-meta-') === 0 || shortKey === 'pic-operations') metaHeaders[k] = val;
  8104. });
  8105. uploadSliceComplete.call(self, {
  8106. Bucket: Bucket,
  8107. Region: Region,
  8108. Key: Key,
  8109. UploadId: UploadData.UploadId,
  8110. SliceList: UploadData.SliceList,
  8111. Headers: metaHeaders
  8112. }, function (err, data) {
  8113. if (!self._isRunningTask(TaskId)) return;
  8114. session.removeUsing(UploadData.UploadId);
  8115. if (err) {
  8116. onProgress(null, true);
  8117. return ep.emit('error', err);
  8118. }
  8119. session.removeUploadId.call(self, UploadData.UploadId);
  8120. onProgress({ loaded: FileSize, total: FileSize }, true);
  8121. ep.emit('upload_complete', data);
  8122. });
  8123. });
  8124. // 获取 UploadId 完成,开始上传每个分片
  8125. ep.on('get_upload_data_finish', function (UploadData) {
  8126. // 处理 UploadId 缓存
  8127. var uuid = session.getFileId(Body, params.ChunkSize, Bucket, Key);
  8128. uuid && session.saveUploadId.call(self, uuid, UploadData.UploadId, self.options.UploadIdCacheLimit); // 缓存 UploadId
  8129. session.setUsing(UploadData.UploadId); // 标记 UploadId 为正在使用
  8130. // 获取 UploadId
  8131. onProgress(null, true); // 任务状态开始 uploading
  8132. uploadSliceList.call(self, {
  8133. TaskId: TaskId,
  8134. Bucket: Bucket,
  8135. Region: Region,
  8136. Key: Key,
  8137. Body: Body,
  8138. FileSize: FileSize,
  8139. SliceSize: ChunkSize,
  8140. AsyncLimit: AsyncLimit,
  8141. ServerSideEncryption: ServerSideEncryption,
  8142. UploadData: UploadData,
  8143. Headers: params.Headers,
  8144. onProgress: onProgress
  8145. }, function (err, data) {
  8146. if (!self._isRunningTask(TaskId)) return;
  8147. if (err) {
  8148. onProgress(null, true);
  8149. return ep.emit('error', err);
  8150. }
  8151. ep.emit('upload_slice_complete', data);
  8152. });
  8153. });
  8154. // 开始获取文件 UploadId,里面会视情况计算 ETag,并比对,保证文件一致性,也优化上传
  8155. ep.on('get_file_size_finish', function () {
  8156. onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
  8157. if (params.UploadData.UploadId) {
  8158. ep.emit('get_upload_data_finish', params.UploadData);
  8159. } else {
  8160. var _params = util.extend({
  8161. TaskId: TaskId,
  8162. Bucket: Bucket,
  8163. Region: Region,
  8164. Key: Key,
  8165. Headers: params.Headers,
  8166. StorageClass: StorageClass,
  8167. Body: Body,
  8168. FileSize: FileSize,
  8169. SliceSize: ChunkSize,
  8170. onHashProgress: onHashProgress
  8171. }, params);
  8172. getUploadIdAndPartList.call(self, _params, function (err, UploadData) {
  8173. if (!self._isRunningTask(TaskId)) return;
  8174. if (err) return ep.emit('error', err);
  8175. params.UploadData.UploadId = UploadData.UploadId;
  8176. params.UploadData.PartList = UploadData.PartList;
  8177. ep.emit('get_upload_data_finish', params.UploadData);
  8178. });
  8179. }
  8180. });
  8181. // 获取上传文件大小
  8182. FileSize = params.ContentLength;
  8183. delete params.ContentLength;
  8184. !params.Headers && (params.Headers = {});
  8185. util.each(params.Headers, function (item, key) {
  8186. if (key.toLowerCase() === 'content-length') {
  8187. delete params.Headers[key];
  8188. }
  8189. });
  8190. // 控制分片大小
  8191. (function () {
  8192. var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];
  8193. var AutoChunkSize = 1024 * 1024;
  8194. for (var i = 0; i < SIZE.length; i++) {
  8195. AutoChunkSize = SIZE[i] * 1024 * 1024;
  8196. if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;
  8197. }
  8198. params.ChunkSize = params.SliceSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);
  8199. })();
  8200. // 开始上传
  8201. if (FileSize === 0) {
  8202. params.Body = '';
  8203. params.ContentLength = 0;
  8204. params.SkipTask = true;
  8205. self.putObject(params, callback);
  8206. } else {
  8207. ep.emit('get_file_size_finish');
  8208. }
  8209. }
  8210. // 获取上传任务的 UploadId
  8211. function getUploadIdAndPartList(params, callback) {
  8212. var TaskId = params.TaskId;
  8213. var Bucket = params.Bucket;
  8214. var Region = params.Region;
  8215. var Key = params.Key;
  8216. var StorageClass = params.StorageClass;
  8217. var self = this;
  8218. // 计算 ETag
  8219. var ETagMap = {};
  8220. var FileSize = params.FileSize;
  8221. var SliceSize = params.SliceSize;
  8222. var SliceCount = Math.ceil(FileSize / SliceSize);
  8223. var FinishSliceCount = 0;
  8224. var FinishSize = 0;
  8225. var onHashProgress = util.throttleOnProgress.call(self, FileSize, params.onHashProgress);
  8226. var getChunkETag = function (PartNumber, callback) {
  8227. var start = SliceSize * (PartNumber - 1);
  8228. var end = Math.min(start + SliceSize, FileSize);
  8229. var ChunkSize = end - start;
  8230. if (ETagMap[PartNumber]) {
  8231. callback(null, {
  8232. PartNumber: PartNumber,
  8233. ETag: ETagMap[PartNumber],
  8234. Size: ChunkSize
  8235. });
  8236. } else {
  8237. util.fileSlice(params.Body, start, end, false, function (chunkItem) {
  8238. util.getFileMd5(chunkItem, function (err, md5) {
  8239. if (err) return callback(util.error(err));
  8240. var ETag = '"' + md5 + '"';
  8241. ETagMap[PartNumber] = ETag;
  8242. FinishSliceCount += 1;
  8243. FinishSize += ChunkSize;
  8244. onHashProgress({ loaded: FinishSize, total: FileSize });
  8245. callback(null, {
  8246. PartNumber: PartNumber,
  8247. ETag: ETag,
  8248. Size: ChunkSize
  8249. });
  8250. });
  8251. });
  8252. }
  8253. };
  8254. // 通过和文件的 md5 对比,判断 UploadId 是否可用
  8255. var isAvailableUploadList = function (PartList, callback) {
  8256. var PartCount = PartList.length;
  8257. // 如果没有分片,通过
  8258. if (PartCount === 0) {
  8259. return callback(null, true);
  8260. }
  8261. // 检查分片数量
  8262. if (PartCount > SliceCount) {
  8263. return callback(null, false);
  8264. }
  8265. // 检查分片大小
  8266. if (PartCount > 1) {
  8267. var PartSliceSize = Math.max(PartList[0].Size, PartList[1].Size);
  8268. if (PartSliceSize !== SliceSize) {
  8269. return callback(null, false);
  8270. }
  8271. }
  8272. // 逐个分片计算并检查 ETag 是否一致
  8273. var next = function (index) {
  8274. if (index < PartCount) {
  8275. var Part = PartList[index];
  8276. getChunkETag(Part.PartNumber, function (err, chunk) {
  8277. if (chunk && chunk.ETag === Part.ETag && chunk.Size === Part.Size) {
  8278. next(index + 1);
  8279. } else {
  8280. callback(null, false);
  8281. }
  8282. });
  8283. } else {
  8284. callback(null, true);
  8285. }
  8286. };
  8287. next(0);
  8288. };
  8289. var ep = new EventProxy();
  8290. ep.on('error', function (errData) {
  8291. if (!self._isRunningTask(TaskId)) return;
  8292. return callback(errData);
  8293. });
  8294. // 存在 UploadId
  8295. ep.on('upload_id_available', function (UploadData) {
  8296. // 转换成 map
  8297. var map = {};
  8298. var list = [];
  8299. util.each(UploadData.PartList, function (item) {
  8300. map[item.PartNumber] = item;
  8301. });
  8302. for (var PartNumber = 1; PartNumber <= SliceCount; PartNumber++) {
  8303. var item = map[PartNumber];
  8304. if (item) {
  8305. item.PartNumber = PartNumber;
  8306. item.Uploaded = true;
  8307. } else {
  8308. item = {
  8309. PartNumber: PartNumber,
  8310. ETag: null,
  8311. Uploaded: false
  8312. };
  8313. }
  8314. list.push(item);
  8315. }
  8316. UploadData.PartList = list;
  8317. callback(null, UploadData);
  8318. });
  8319. // 不存在 UploadId, 初始化生成 UploadId
  8320. ep.on('no_available_upload_id', function () {
  8321. if (!self._isRunningTask(TaskId)) return;
  8322. var _params = util.extend({
  8323. Bucket: Bucket,
  8324. Region: Region,
  8325. Key: Key,
  8326. Query: util.clone(params.Query),
  8327. StorageClass: StorageClass,
  8328. Body: params.Body
  8329. }, params);
  8330. var headers = util.clone(params.Headers);
  8331. delete headers['x-cos-mime-limit'];
  8332. _params.Headers = headers;
  8333. self.multipartInit(_params, function (err, data) {
  8334. if (!self._isRunningTask(TaskId)) return;
  8335. if (err) return ep.emit('error', err);
  8336. var UploadId = data.UploadId;
  8337. if (!UploadId) {
  8338. return callback(util.error(new Error('no such upload id')));
  8339. }
  8340. ep.emit('upload_id_available', { UploadId: UploadId, PartList: [] });
  8341. });
  8342. });
  8343. // 如果已存在 UploadId,找一个可以用的 UploadId
  8344. ep.on('has_and_check_upload_id', function (UploadIdList) {
  8345. // 串行地,找一个内容一致的 UploadId
  8346. UploadIdList = UploadIdList.reverse();
  8347. Async.eachLimit(UploadIdList, 1, function (UploadId, asyncCallback) {
  8348. if (!self._isRunningTask(TaskId)) return;
  8349. // 如果正在上传,跳过
  8350. if (session.using[UploadId]) {
  8351. asyncCallback(); // 检查下一个 UploadId
  8352. return;
  8353. }
  8354. // 判断 UploadId 是否可用
  8355. wholeMultipartListPart.call(self, {
  8356. Bucket: Bucket,
  8357. Region: Region,
  8358. Key: Key,
  8359. UploadId: UploadId
  8360. }, function (err, PartListData) {
  8361. if (!self._isRunningTask(TaskId)) return;
  8362. if (err) {
  8363. session.removeUsing(UploadId);
  8364. return ep.emit('error', err);
  8365. }
  8366. var PartList = PartListData.PartList;
  8367. PartList.forEach(function (item) {
  8368. item.PartNumber *= 1;
  8369. item.Size *= 1;
  8370. item.ETag = item.ETag || '';
  8371. });
  8372. isAvailableUploadList(PartList, function (err, isAvailable) {
  8373. if (!self._isRunningTask(TaskId)) return;
  8374. if (err) return ep.emit('error', err);
  8375. if (isAvailable) {
  8376. asyncCallback({
  8377. UploadId: UploadId,
  8378. PartList: PartList
  8379. }); // 马上结束
  8380. } else {
  8381. asyncCallback(); // 检查下一个 UploadId
  8382. }
  8383. });
  8384. });
  8385. }, function (AvailableUploadData) {
  8386. if (!self._isRunningTask(TaskId)) return;
  8387. onHashProgress(null, true);
  8388. if (AvailableUploadData && AvailableUploadData.UploadId) {
  8389. ep.emit('upload_id_available', AvailableUploadData);
  8390. } else {
  8391. ep.emit('no_available_upload_id');
  8392. }
  8393. });
  8394. });
  8395. // 在本地缓存找可用的 UploadId
  8396. ep.on('seek_local_avail_upload_id', function (RemoteUploadIdList) {
  8397. // 在本地找可用的 UploadId
  8398. var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key);
  8399. var LocalUploadIdList = session.getUploadIdList.call(self, uuid);
  8400. if (!uuid || !LocalUploadIdList) {
  8401. ep.emit('has_and_check_upload_id', RemoteUploadIdList);
  8402. return;
  8403. }
  8404. var next = function (index) {
  8405. // 如果本地找不到可用 UploadId,再一个个遍历校验远端
  8406. if (index >= LocalUploadIdList.length) {
  8407. ep.emit('has_and_check_upload_id', RemoteUploadIdList);
  8408. return;
  8409. }
  8410. var UploadId = LocalUploadIdList[index];
  8411. // 如果不在远端 UploadId 列表里,跳过并删除
  8412. if (!util.isInArray(RemoteUploadIdList, UploadId)) {
  8413. session.removeUploadId.call(self, UploadId);
  8414. next(index + 1);
  8415. return;
  8416. }
  8417. // 如果正在上传,跳过
  8418. if (session.using[UploadId]) {
  8419. next(index + 1);
  8420. return;
  8421. }
  8422. // 判断 UploadId 是否存在线上
  8423. wholeMultipartListPart.call(self, {
  8424. Bucket: Bucket,
  8425. Region: Region,
  8426. Key: Key,
  8427. UploadId: UploadId
  8428. }, function (err, PartListData) {
  8429. if (!self._isRunningTask(TaskId)) return;
  8430. if (err) {
  8431. // 如果 UploadId 获取会出错,跳过并删除
  8432. session.removeUploadId.call(self, UploadId);
  8433. next(index + 1);
  8434. } else {
  8435. // 找到可用 UploadId
  8436. ep.emit('upload_id_available', {
  8437. UploadId: UploadId,
  8438. PartList: PartListData.PartList
  8439. });
  8440. }
  8441. });
  8442. };
  8443. next(0);
  8444. });
  8445. // 获取线上 UploadId 列表
  8446. ep.on('get_remote_upload_id_list', function () {
  8447. // 获取符合条件的 UploadId 列表,因为同一个文件可以有多个上传任务。
  8448. wholeMultipartList.call(self, {
  8449. Bucket: Bucket,
  8450. Region: Region,
  8451. Key: Key
  8452. }, function (err, data) {
  8453. if (!self._isRunningTask(TaskId)) return;
  8454. if (err) return ep.emit('error', err);
  8455. // 整理远端 UploadId 列表
  8456. var RemoteUploadIdList = util.filter(data.UploadList, function (item) {
  8457. return item.Key === Key && (!StorageClass || item.StorageClass.toUpperCase() === StorageClass.toUpperCase());
  8458. }).reverse().map(function (item) {
  8459. return item.UploadId || item.UploadID;
  8460. });
  8461. if (RemoteUploadIdList.length) {
  8462. ep.emit('seek_local_avail_upload_id', RemoteUploadIdList);
  8463. } else {
  8464. // 远端没有 UploadId,清理缓存的 UploadId
  8465. var uuid = session.getFileId(params.Body, params.ChunkSize, Bucket, Key),
  8466. LocalUploadIdList;
  8467. if (uuid && (LocalUploadIdList = session.getUploadIdList.call(self, uuid))) {
  8468. util.each(LocalUploadIdList, function (UploadId) {
  8469. session.removeUploadId.call(self, UploadId);
  8470. });
  8471. }
  8472. ep.emit('no_available_upload_id');
  8473. }
  8474. });
  8475. });
  8476. // 开始找可用 UploadId
  8477. ep.emit('get_remote_upload_id_list');
  8478. }
  8479. // 获取符合条件的全部上传任务 (条件包括 Bucket, Region, Prefix)
  8480. function wholeMultipartList(params, callback) {
  8481. var self = this;
  8482. var UploadList = [];
  8483. var sendParams = {
  8484. Bucket: params.Bucket,
  8485. Region: params.Region,
  8486. Prefix: params.Key
  8487. };
  8488. var next = function () {
  8489. self.multipartList(sendParams, function (err, data) {
  8490. if (err) return callback(err);
  8491. UploadList.push.apply(UploadList, data.Upload || []);
  8492. if (data.IsTruncated === 'true') {
  8493. // 列表不完整
  8494. sendParams.KeyMarker = data.NextKeyMarker;
  8495. sendParams.UploadIdMarker = data.NextUploadIdMarker;
  8496. next();
  8497. } else {
  8498. callback(null, { UploadList: UploadList });
  8499. }
  8500. });
  8501. };
  8502. next();
  8503. }
  8504. // 获取指定上传任务的分块列表
  8505. function wholeMultipartListPart(params, callback) {
  8506. var self = this;
  8507. var PartList = [];
  8508. var sendParams = {
  8509. Bucket: params.Bucket,
  8510. Region: params.Region,
  8511. Key: params.Key,
  8512. UploadId: params.UploadId
  8513. };
  8514. var next = function () {
  8515. self.multipartListPart(sendParams, function (err, data) {
  8516. if (err) return callback(err);
  8517. PartList.push.apply(PartList, data.Part || []);
  8518. if (data.IsTruncated === 'true') {
  8519. // 列表不完整
  8520. sendParams.PartNumberMarker = data.NextPartNumberMarker;
  8521. next();
  8522. } else {
  8523. callback(null, { PartList: PartList });
  8524. }
  8525. });
  8526. };
  8527. next();
  8528. }
  8529. // 上传文件分块,包括
  8530. /*
  8531. UploadId (上传任务编号)
  8532. AsyncLimit (并发量),
  8533. SliceList (上传的分块数组),
  8534. FilePath (本地文件的位置),
  8535. SliceSize (文件分块大小)
  8536. FileSize (文件大小)
  8537. onProgress (上传成功之后的回调函数)
  8538. */
  8539. function uploadSliceList(params, cb) {
  8540. var self = this;
  8541. var TaskId = params.TaskId;
  8542. var Bucket = params.Bucket;
  8543. var Region = params.Region;
  8544. var Key = params.Key;
  8545. var UploadData = params.UploadData;
  8546. var FileSize = params.FileSize;
  8547. var SliceSize = params.SliceSize;
  8548. var ChunkParallel = Math.min(params.AsyncLimit || self.options.ChunkParallelLimit || 1, 256);
  8549. var Body = params.Body;
  8550. var SliceCount = Math.ceil(FileSize / SliceSize);
  8551. var FinishSize = 0;
  8552. var ServerSideEncryption = params.ServerSideEncryption;
  8553. var Headers = params.Headers;
  8554. var needUploadSlices = util.filter(UploadData.PartList, function (SliceItem) {
  8555. if (SliceItem['Uploaded']) {
  8556. FinishSize += SliceItem['PartNumber'] >= SliceCount ? FileSize % SliceSize || SliceSize : SliceSize;
  8557. }
  8558. return !SliceItem['Uploaded'];
  8559. });
  8560. var onProgress = params.onProgress;
  8561. Async.eachLimit(needUploadSlices, ChunkParallel, function (SliceItem, asyncCallback) {
  8562. if (!self._isRunningTask(TaskId)) return;
  8563. var PartNumber = SliceItem['PartNumber'];
  8564. var currentSize = Math.min(FileSize, SliceItem['PartNumber'] * SliceSize) - (SliceItem['PartNumber'] - 1) * SliceSize;
  8565. var preAddSize = 0;
  8566. uploadSliceItem.call(self, {
  8567. TaskId: TaskId,
  8568. Bucket: Bucket,
  8569. Region: Region,
  8570. Key: Key,
  8571. SliceSize: SliceSize,
  8572. FileSize: FileSize,
  8573. PartNumber: PartNumber,
  8574. ServerSideEncryption: ServerSideEncryption,
  8575. Body: Body,
  8576. UploadData: UploadData,
  8577. Headers: Headers,
  8578. onProgress: function (data) {
  8579. FinishSize += data.loaded - preAddSize;
  8580. preAddSize = data.loaded;
  8581. onProgress({ loaded: FinishSize, total: FileSize });
  8582. }
  8583. }, function (err, data) {
  8584. if (!self._isRunningTask(TaskId)) return;
  8585. if (!err && !data.ETag) err = 'get ETag error, please add "ETag" to CORS ExposeHeader setting.( 获取ETag失败,请在CORS ExposeHeader设置中添加ETag,请参考文档:https://cloud.tencent.com/document/product/436/13318 )';
  8586. if (err) {
  8587. FinishSize -= preAddSize;
  8588. } else {
  8589. FinishSize += currentSize - preAddSize;
  8590. SliceItem.ETag = data.ETag;
  8591. }
  8592. onProgress({ loaded: FinishSize, total: FileSize });
  8593. asyncCallback(err || null, data);
  8594. });
  8595. }, function (err) {
  8596. if (!self._isRunningTask(TaskId)) return;
  8597. if (err) return cb(err);
  8598. cb(null, {
  8599. UploadId: UploadData.UploadId,
  8600. SliceList: UploadData.PartList
  8601. });
  8602. });
  8603. }
  8604. // 上传指定分片
  8605. function uploadSliceItem(params, callback) {
  8606. var self = this;
  8607. var TaskId = params.TaskId;
  8608. var Bucket = params.Bucket;
  8609. var Region = params.Region;
  8610. var Key = params.Key;
  8611. var FileSize = params.FileSize;
  8612. var FileBody = params.Body;
  8613. var PartNumber = params.PartNumber * 1;
  8614. var SliceSize = params.SliceSize;
  8615. var ServerSideEncryption = params.ServerSideEncryption;
  8616. var UploadData = params.UploadData;
  8617. var Headers = params.Headers || {};
  8618. var ChunkRetryTimes = self.options.ChunkRetryTimes + 1;
  8619. var start = SliceSize * (PartNumber - 1);
  8620. var ContentLength = SliceSize;
  8621. var end = start + SliceSize;
  8622. if (end > FileSize) {
  8623. end = FileSize;
  8624. ContentLength = end - start;
  8625. }
  8626. var headersWhiteList = ['x-cos-traffic-limit', 'x-cos-mime-limit'];
  8627. var headers = {};
  8628. util.each(Headers, function (v, k) {
  8629. if (headersWhiteList.indexOf(k) > -1) {
  8630. headers[k] = v;
  8631. }
  8632. });
  8633. var PartItem = UploadData.PartList[PartNumber - 1];
  8634. Async.retry(ChunkRetryTimes, function (tryCallback) {
  8635. if (!self._isRunningTask(TaskId)) return;
  8636. util.fileSlice(FileBody, start, end, true, function (Body) {
  8637. self.multipartUpload({
  8638. TaskId: TaskId,
  8639. Bucket: Bucket,
  8640. Region: Region,
  8641. Key: Key,
  8642. ContentLength: ContentLength,
  8643. PartNumber: PartNumber,
  8644. UploadId: UploadData.UploadId,
  8645. ServerSideEncryption: ServerSideEncryption,
  8646. Body: Body,
  8647. Headers: headers,
  8648. onProgress: params.onProgress
  8649. }, function (err, data) {
  8650. if (!self._isRunningTask(TaskId)) return;
  8651. if (err) return tryCallback(err);
  8652. PartItem.Uploaded = true;
  8653. return tryCallback(null, data);
  8654. });
  8655. });
  8656. }, function (err, data) {
  8657. if (!self._isRunningTask(TaskId)) return;
  8658. return callback(err, data);
  8659. });
  8660. }
  8661. // 完成分块上传
  8662. function uploadSliceComplete(params, callback) {
  8663. var Bucket = params.Bucket;
  8664. var Region = params.Region;
  8665. var Key = params.Key;
  8666. var UploadId = params.UploadId;
  8667. var SliceList = params.SliceList;
  8668. var self = this;
  8669. var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;
  8670. var Headers = params.Headers;
  8671. var Parts = SliceList.map(function (item) {
  8672. return {
  8673. PartNumber: item.PartNumber,
  8674. ETag: item.ETag
  8675. };
  8676. });
  8677. // 完成上传的请求也做重试
  8678. Async.retry(ChunkRetryTimes, function (tryCallback) {
  8679. self.multipartComplete({
  8680. Bucket: Bucket,
  8681. Region: Region,
  8682. Key: Key,
  8683. UploadId: UploadId,
  8684. Parts: Parts,
  8685. Headers: Headers
  8686. }, tryCallback);
  8687. }, function (err, data) {
  8688. callback(err, data);
  8689. });
  8690. }
  8691. // 抛弃分块上传任务
  8692. /*
  8693. AsyncLimit (抛弃上传任务的并发量),
  8694. UploadId (上传任务的编号,当 Level 为 task 时候需要)
  8695. Level (抛弃分块上传任务的级别,task : 抛弃指定的上传任务,file : 抛弃指定的文件对应的上传任务,其他值 :抛弃指定Bucket 的全部上传任务)
  8696. */
  8697. function abortUploadTask(params, callback) {
  8698. var Bucket = params.Bucket;
  8699. var Region = params.Region;
  8700. var Key = params.Key;
  8701. var UploadId = params.UploadId;
  8702. var Level = params.Level || 'task';
  8703. var AsyncLimit = params.AsyncLimit;
  8704. var self = this;
  8705. var ep = new EventProxy();
  8706. ep.on('error', function (errData) {
  8707. return callback(errData);
  8708. });
  8709. // 已经获取到需要抛弃的任务列表
  8710. ep.on('get_abort_array', function (AbortArray) {
  8711. abortUploadTaskArray.call(self, {
  8712. Bucket: Bucket,
  8713. Region: Region,
  8714. Key: Key,
  8715. Headers: params.Headers,
  8716. AsyncLimit: AsyncLimit,
  8717. AbortArray: AbortArray
  8718. }, callback);
  8719. });
  8720. if (Level === 'bucket') {
  8721. // Bucket 级别的任务抛弃,抛弃该 Bucket 下的全部上传任务
  8722. wholeMultipartList.call(self, {
  8723. Bucket: Bucket,
  8724. Region: Region
  8725. }, function (err, data) {
  8726. if (err) return callback(err);
  8727. ep.emit('get_abort_array', data.UploadList || []);
  8728. });
  8729. } else if (Level === 'file') {
  8730. // 文件级别的任务抛弃,抛弃该文件的全部上传任务
  8731. if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));
  8732. wholeMultipartList.call(self, {
  8733. Bucket: Bucket,
  8734. Region: Region,
  8735. Key: Key
  8736. }, function (err, data) {
  8737. if (err) return callback(err);
  8738. ep.emit('get_abort_array', data.UploadList || []);
  8739. });
  8740. } else if (Level === 'task') {
  8741. // 单个任务级别的任务抛弃,抛弃指定 UploadId 的上传任务
  8742. if (!UploadId) return callback(util.error(new Error('abort_upload_task_no_id')));
  8743. if (!Key) return callback(util.error(new Error('abort_upload_task_no_key')));
  8744. ep.emit('get_abort_array', [{
  8745. Key: Key,
  8746. UploadId: UploadId
  8747. }]);
  8748. } else {
  8749. return callback(util.error(new Error('abort_unknown_level')));
  8750. }
  8751. }
  8752. // 批量抛弃分块上传任务
  8753. function abortUploadTaskArray(params, callback) {
  8754. var Bucket = params.Bucket;
  8755. var Region = params.Region;
  8756. var Key = params.Key;
  8757. var AbortArray = params.AbortArray;
  8758. var AsyncLimit = params.AsyncLimit || 1;
  8759. var self = this;
  8760. var index = 0;
  8761. var resultList = new Array(AbortArray.length);
  8762. Async.eachLimit(AbortArray, AsyncLimit, function (AbortItem, nextItem) {
  8763. var eachIndex = index;
  8764. if (Key && Key !== AbortItem.Key) {
  8765. resultList[eachIndex] = { error: { KeyNotMatch: true } };
  8766. nextItem(null);
  8767. return;
  8768. }
  8769. var UploadId = AbortItem.UploadId || AbortItem.UploadID;
  8770. self.multipartAbort({
  8771. Bucket: Bucket,
  8772. Region: Region,
  8773. Key: AbortItem.Key,
  8774. Headers: params.Headers,
  8775. UploadId: UploadId
  8776. }, function (err) {
  8777. var task = {
  8778. Bucket: Bucket,
  8779. Region: Region,
  8780. Key: AbortItem.Key,
  8781. UploadId: UploadId
  8782. };
  8783. resultList[eachIndex] = { error: err, task: task };
  8784. nextItem(null);
  8785. });
  8786. index++;
  8787. }, function (err) {
  8788. if (err) return callback(err);
  8789. var successList = [];
  8790. var errorList = [];
  8791. for (var i = 0, len = resultList.length; i < len; i++) {
  8792. var item = resultList[i];
  8793. if (item['task']) {
  8794. if (item['error']) {
  8795. errorList.push(item['task']);
  8796. } else {
  8797. successList.push(item['task']);
  8798. }
  8799. }
  8800. }
  8801. return callback(null, {
  8802. successList: successList,
  8803. errorList: errorList
  8804. });
  8805. });
  8806. }
  8807. // 高级上传
  8808. function uploadFile(params, callback) {
  8809. var self = this;
  8810. // 判断多大的文件使用分片上传
  8811. var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;
  8812. var taskList = [];
  8813. var Body = params.Body;
  8814. var FileSize = Body.size || Body.length || 0;
  8815. var fileInfo = { TaskId: '' };
  8816. // 整理 option,用于返回给回调
  8817. util.each(params, function (v, k) {
  8818. if (typeof v !== 'object' && typeof v !== 'function') {
  8819. fileInfo[k] = v;
  8820. }
  8821. });
  8822. // 处理文件 TaskReady
  8823. var _onTaskReady = params.onTaskReady;
  8824. var onTaskReady = function (tid) {
  8825. fileInfo.TaskId = tid;
  8826. _onTaskReady && _onTaskReady(tid);
  8827. };
  8828. params.onTaskReady = onTaskReady;
  8829. // 处理文件完成
  8830. var _onFileFinish = params.onFileFinish;
  8831. var onFileFinish = function (err, data) {
  8832. _onFileFinish && _onFileFinish(err, data, fileInfo);
  8833. callback && callback(err, data);
  8834. };
  8835. // 添加上传任务,超过阈值使用分块上传,小于等于则简单上传
  8836. var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';
  8837. taskList.push({
  8838. api: api,
  8839. params: params,
  8840. callback: onFileFinish
  8841. });
  8842. self._addTasks(taskList);
  8843. }
  8844. // 批量上传文件
  8845. function uploadFiles(params, callback) {
  8846. var self = this;
  8847. // 判断多大的文件使用分片上传
  8848. var SliceSize = params.SliceSize === undefined ? self.options.SliceSize : params.SliceSize;
  8849. // 汇总返回进度
  8850. var TotalSize = 0;
  8851. var TotalFinish = 0;
  8852. var onTotalProgress = util.throttleOnProgress.call(self, TotalFinish, params.onProgress);
  8853. // 汇总返回回调
  8854. var unFinishCount = params.files.length;
  8855. var _onTotalFileFinish = params.onFileFinish;
  8856. var resultList = Array(unFinishCount);
  8857. var onTotalFileFinish = function (err, data, options) {
  8858. onTotalProgress(null, true);
  8859. _onTotalFileFinish && _onTotalFileFinish(err, data, options);
  8860. resultList[options.Index] = {
  8861. options: options,
  8862. error: err,
  8863. data: data
  8864. };
  8865. if (--unFinishCount <= 0 && callback) {
  8866. callback(null, { files: resultList });
  8867. }
  8868. };
  8869. // 开始处理每个文件
  8870. var taskList = [];
  8871. util.each(params.files, function (fileParams, index) {
  8872. (function () {
  8873. // 对齐 nodejs 缩进
  8874. var Body = fileParams.Body;
  8875. var FileSize = Body.size || Body.length || 0;
  8876. var fileInfo = { Index: index, TaskId: '' };
  8877. // 更新文件总大小
  8878. TotalSize += FileSize;
  8879. // 整理 option,用于返回给回调
  8880. util.each(fileParams, function (v, k) {
  8881. if (typeof v !== 'object' && typeof v !== 'function') {
  8882. fileInfo[k] = v;
  8883. }
  8884. });
  8885. // 处理单个文件 TaskReady
  8886. var _onTaskReady = fileParams.onTaskReady;
  8887. var onTaskReady = function (tid) {
  8888. fileInfo.TaskId = tid;
  8889. _onTaskReady && _onTaskReady(tid);
  8890. };
  8891. fileParams.onTaskReady = onTaskReady;
  8892. // 处理单个文件进度
  8893. var PreAddSize = 0;
  8894. var _onProgress = fileParams.onProgress;
  8895. var onProgress = function (info) {
  8896. TotalFinish = TotalFinish - PreAddSize + info.loaded;
  8897. PreAddSize = info.loaded;
  8898. _onProgress && _onProgress(info);
  8899. onTotalProgress({ loaded: TotalFinish, total: TotalSize });
  8900. };
  8901. fileParams.onProgress = onProgress;
  8902. // 处理单个文件完成
  8903. var _onFileFinish = fileParams.onFileFinish;
  8904. var onFileFinish = function (err, data) {
  8905. _onFileFinish && _onFileFinish(err, data);
  8906. onTotalFileFinish && onTotalFileFinish(err, data, fileInfo);
  8907. };
  8908. // 添加上传任务
  8909. var api = FileSize > SliceSize ? 'sliceUploadFile' : 'putObject';
  8910. taskList.push({
  8911. api: api,
  8912. params: fileParams,
  8913. callback: onFileFinish
  8914. });
  8915. })();
  8916. });
  8917. self._addTasks(taskList);
  8918. }
  8919. // 分片复制文件
  8920. function sliceCopyFile(params, callback) {
  8921. var ep = new EventProxy();
  8922. var self = this;
  8923. var Bucket = params.Bucket;
  8924. var Region = params.Region;
  8925. var Key = params.Key;
  8926. var CopySource = params.CopySource;
  8927. var m = util.getSourceParams.call(this, CopySource);
  8928. if (!m) {
  8929. callback(util.error(new Error('CopySource format error')));
  8930. return;
  8931. }
  8932. var SourceBucket = m.Bucket;
  8933. var SourceRegion = m.Region;
  8934. var SourceKey = decodeURIComponent(m.Key);
  8935. var CopySliceSize = params.CopySliceSize === undefined ? self.options.CopySliceSize : params.CopySliceSize;
  8936. CopySliceSize = Math.max(0, CopySliceSize);
  8937. var ChunkSize = params.CopyChunkSize || this.options.CopyChunkSize;
  8938. var ChunkParallel = this.options.CopyChunkParallelLimit;
  8939. var FinishSize = 0;
  8940. var FileSize;
  8941. var onProgress;
  8942. // 分片复制完成,开始 multipartComplete 操作
  8943. ep.on('copy_slice_complete', function (UploadData) {
  8944. var metaHeaders = {};
  8945. util.each(params.Headers, function (val, k) {
  8946. if (k.toLowerCase().indexOf('x-cos-meta-') === 0) metaHeaders[k] = val;
  8947. });
  8948. var Parts = util.map(UploadData.PartList, function (item) {
  8949. return {
  8950. PartNumber: item.PartNumber,
  8951. ETag: item.ETag
  8952. };
  8953. });
  8954. self.multipartComplete({
  8955. Bucket: Bucket,
  8956. Region: Region,
  8957. Key: Key,
  8958. UploadId: UploadData.UploadId,
  8959. Parts: Parts
  8960. }, function (err, data) {
  8961. if (err) {
  8962. onProgress(null, true);
  8963. return callback(err);
  8964. }
  8965. onProgress({ loaded: FileSize, total: FileSize }, true);
  8966. callback(null, data);
  8967. });
  8968. });
  8969. ep.on('get_copy_data_finish', function (UploadData) {
  8970. Async.eachLimit(UploadData.PartList, ChunkParallel, function (SliceItem, asyncCallback) {
  8971. var PartNumber = SliceItem.PartNumber;
  8972. var CopySourceRange = SliceItem.CopySourceRange;
  8973. var currentSize = SliceItem.end - SliceItem.start;
  8974. copySliceItem.call(self, {
  8975. Bucket: Bucket,
  8976. Region: Region,
  8977. Key: Key,
  8978. CopySource: CopySource,
  8979. UploadId: UploadData.UploadId,
  8980. PartNumber: PartNumber,
  8981. CopySourceRange: CopySourceRange
  8982. }, function (err, data) {
  8983. if (err) return asyncCallback(err);
  8984. FinishSize += currentSize;
  8985. onProgress({ loaded: FinishSize, total: FileSize });
  8986. SliceItem.ETag = data.ETag;
  8987. asyncCallback(err || null, data);
  8988. });
  8989. }, function (err) {
  8990. if (err) {
  8991. onProgress(null, true);
  8992. return callback(err);
  8993. }
  8994. ep.emit('copy_slice_complete', UploadData);
  8995. });
  8996. });
  8997. ep.on('get_file_size_finish', function (SourceHeaders) {
  8998. // 控制分片大小
  8999. (function () {
  9000. var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];
  9001. var AutoChunkSize = 1024 * 1024;
  9002. for (var i = 0; i < SIZE.length; i++) {
  9003. AutoChunkSize = SIZE[i] * 1024 * 1024;
  9004. if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;
  9005. }
  9006. params.ChunkSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);
  9007. var ChunkCount = Math.ceil(FileSize / ChunkSize);
  9008. var list = [];
  9009. for (var partNumber = 1; partNumber <= ChunkCount; partNumber++) {
  9010. var start = (partNumber - 1) * ChunkSize;
  9011. var end = partNumber * ChunkSize < FileSize ? partNumber * ChunkSize - 1 : FileSize - 1;
  9012. var item = {
  9013. PartNumber: partNumber,
  9014. start: start,
  9015. end: end,
  9016. CopySourceRange: "bytes=" + start + "-" + end
  9017. };
  9018. list.push(item);
  9019. }
  9020. params.PartList = list;
  9021. })();
  9022. var TargetHeader;
  9023. if (params.Headers['x-cos-metadata-directive'] === 'Replaced') {
  9024. TargetHeader = params.Headers;
  9025. } else {
  9026. TargetHeader = SourceHeaders;
  9027. }
  9028. TargetHeader['x-cos-storage-class'] = params.Headers['x-cos-storage-class'] || SourceHeaders['x-cos-storage-class'];
  9029. TargetHeader = util.clearKey(TargetHeader);
  9030. /**
  9031. * 对于归档存储的对象,如果未恢复副本,则不允许 Copy
  9032. */
  9033. if (SourceHeaders['x-cos-storage-class'] === 'ARCHIVE' || SourceHeaders['x-cos-storage-class'] === 'DEEP_ARCHIVE') {
  9034. var restoreHeader = SourceHeaders['x-cos-restore'];
  9035. if (!restoreHeader || restoreHeader === 'ongoing-request="true"') {
  9036. callback(util.error(new Error('Unrestored archive object is not allowed to be copied')));
  9037. return;
  9038. }
  9039. }
  9040. /**
  9041. * 去除一些无用的头部,规避 multipartInit 出错
  9042. * 这些头部通常是在 putObjectCopy 时才使用
  9043. */
  9044. delete TargetHeader['x-cos-copy-source'];
  9045. delete TargetHeader['x-cos-metadata-directive'];
  9046. delete TargetHeader['x-cos-copy-source-If-Modified-Since'];
  9047. delete TargetHeader['x-cos-copy-source-If-Unmodified-Since'];
  9048. delete TargetHeader['x-cos-copy-source-If-Match'];
  9049. delete TargetHeader['x-cos-copy-source-If-None-Match'];
  9050. self.multipartInit({
  9051. Bucket: Bucket,
  9052. Region: Region,
  9053. Key: Key,
  9054. Headers: TargetHeader
  9055. }, function (err, data) {
  9056. if (err) return callback(err);
  9057. params.UploadId = data.UploadId;
  9058. ep.emit('get_copy_data_finish', params);
  9059. });
  9060. });
  9061. // 获取远端复制源文件的大小
  9062. self.headObject({
  9063. Bucket: SourceBucket,
  9064. Region: SourceRegion,
  9065. Key: SourceKey
  9066. }, function (err, data) {
  9067. if (err) {
  9068. if (err.statusCode && err.statusCode === 404) {
  9069. callback(util.error(err, { ErrorStatus: SourceKey + ' Not Exist' }));
  9070. } else {
  9071. callback(err);
  9072. }
  9073. return;
  9074. }
  9075. FileSize = params.FileSize = data.headers['content-length'];
  9076. if (FileSize === undefined || !FileSize) {
  9077. callback(util.error(new Error('get Content-Length error, please add "Content-Length" to CORS ExposeHeader setting.( 获取Content-Length失败,请在CORS ExposeHeader设置中添加Content-Length,请参考文档:https://cloud.tencent.com/document/product/436/13318 )')));
  9078. return;
  9079. }
  9080. onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
  9081. // 开始上传
  9082. if (FileSize <= CopySliceSize) {
  9083. if (!params.Headers['x-cos-metadata-directive']) {
  9084. params.Headers['x-cos-metadata-directive'] = 'Copy';
  9085. }
  9086. self.putObjectCopy(params, function (err, data) {
  9087. if (err) {
  9088. onProgress(null, true);
  9089. return callback(err);
  9090. }
  9091. onProgress({ loaded: FileSize, total: FileSize }, true);
  9092. callback(err, data);
  9093. });
  9094. } else {
  9095. var resHeaders = data.headers;
  9096. var SourceHeaders = {
  9097. 'Cache-Control': resHeaders['cache-control'],
  9098. 'Content-Disposition': resHeaders['content-disposition'],
  9099. 'Content-Encoding': resHeaders['content-encoding'],
  9100. 'Content-Type': resHeaders['content-type'],
  9101. 'Expires': resHeaders['expires'],
  9102. 'x-cos-storage-class': resHeaders['x-cos-storage-class']
  9103. };
  9104. util.each(resHeaders, function (v, k) {
  9105. var metaPrefix = 'x-cos-meta-';
  9106. if (k.indexOf(metaPrefix) === 0 && k.length > metaPrefix.length) {
  9107. SourceHeaders[k] = v;
  9108. }
  9109. });
  9110. ep.emit('get_file_size_finish', SourceHeaders);
  9111. }
  9112. });
  9113. }
  9114. // 复制指定分片
  9115. function copySliceItem(params, callback) {
  9116. var TaskId = params.TaskId;
  9117. var Bucket = params.Bucket;
  9118. var Region = params.Region;
  9119. var Key = params.Key;
  9120. var CopySource = params.CopySource;
  9121. var UploadId = params.UploadId;
  9122. var PartNumber = params.PartNumber * 1;
  9123. var CopySourceRange = params.CopySourceRange;
  9124. var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;
  9125. var self = this;
  9126. Async.retry(ChunkRetryTimes, function (tryCallback) {
  9127. self.uploadPartCopy({
  9128. TaskId: TaskId,
  9129. Bucket: Bucket,
  9130. Region: Region,
  9131. Key: Key,
  9132. CopySource: CopySource,
  9133. UploadId: UploadId,
  9134. PartNumber: PartNumber,
  9135. CopySourceRange: CopySourceRange
  9136. }, function (err, data) {
  9137. tryCallback(err || null, data);
  9138. });
  9139. }, function (err, data) {
  9140. return callback(err, data);
  9141. });
  9142. }
  9143. var API_MAP = {
  9144. sliceUploadFile: sliceUploadFile,
  9145. abortUploadTask: abortUploadTask,
  9146. uploadFile: uploadFile,
  9147. uploadFiles: uploadFiles,
  9148. sliceCopyFile: sliceCopyFile
  9149. };
  9150. module.exports.init = function (COS, task) {
  9151. task.transferToTaskMethod(API_MAP, 'sliceUploadFile');
  9152. util.each(API_MAP, function (fn, apiName) {
  9153. COS.prototype[apiName] = util.apiWrapper(apiName, fn);
  9154. });
  9155. };
  9156. /***/ }),
  9157. /* 19 */
  9158. /***/ (function(module, exports) {
  9159. var eachLimit = function (arr, limit, iterator, callback) {
  9160. callback = callback || function () {};
  9161. if (!arr.length || limit <= 0) {
  9162. return callback();
  9163. }
  9164. var completed = 0;
  9165. var started = 0;
  9166. var running = 0;
  9167. (function replenish() {
  9168. if (completed >= arr.length) {
  9169. return callback();
  9170. }
  9171. while (running < limit && started < arr.length) {
  9172. started += 1;
  9173. running += 1;
  9174. iterator(arr[started - 1], function (err) {
  9175. if (err) {
  9176. callback(err);
  9177. callback = function () {};
  9178. } else {
  9179. completed += 1;
  9180. running -= 1;
  9181. if (completed >= arr.length) {
  9182. callback();
  9183. } else {
  9184. replenish();
  9185. }
  9186. }
  9187. });
  9188. }
  9189. })();
  9190. };
  9191. var retry = function (times, iterator, callback) {
  9192. var next = function (index) {
  9193. iterator(function (err, data) {
  9194. if (err && index < times) {
  9195. next(index + 1);
  9196. } else {
  9197. callback(err, data);
  9198. }
  9199. });
  9200. };
  9201. if (times < 1) {
  9202. callback();
  9203. } else {
  9204. next(1);
  9205. }
  9206. };
  9207. var async = {
  9208. eachLimit: eachLimit,
  9209. retry: retry
  9210. };
  9211. module.exports = async;
  9212. /***/ })
  9213. /******/ ]);
  9214. });