cos-wx-v5.js 257 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555
  1. module.exports = (function() {
  2. var __MODS__ = {};
  3. var __DEFINE__ = function(modId, func, req) { var m = { exports: {}, _tempexports: {} }; __MODS__[modId] = { status: 0, func: func, req: req, m: m }; };
  4. var __REQUIRE__ = function(modId, source) { if(!__MODS__[modId]) return require(source); if(!__MODS__[modId].status) { var m = __MODS__[modId].m; m._exports = m._tempexports; var desp = Object.getOwnPropertyDescriptor(m, "exports"); if (desp && desp.configurable) Object.defineProperty(m, "exports", { set: function (val) { if(typeof val === "object" && val !== m._exports) { m._exports.__proto__ = val.__proto__; Object.keys(val).forEach(function (k) { m._exports[k] = val[k]; }); } m._tempexports = val }, get: function () { return m._tempexports; } }); __MODS__[modId].status = 1; __MODS__[modId].func(__MODS__[modId].req, m, m.exports); } return __MODS__[modId].m.exports; };
  5. var __REQUIRE_WILDCARD__ = function(obj) { if(obj && obj.__esModule) { return obj; } else { var newObj = {}; if(obj != null) { for(var k in obj) { if (Object.prototype.hasOwnProperty.call(obj, k)) newObj[k] = obj[k]; } } newObj.default = obj; return newObj; } };
  6. var __REQUIRE_DEFAULT__ = function(obj) { return obj && obj.__esModule ? obj.default : obj; };
  7. __DEFINE__(1595302356117, function(require, module, exports) {
  8. (function webpackUniversalModuleDefinition(root, factory) {
  9. if(typeof exports === 'object' && typeof module === 'object')
  10. module.exports = factory();
  11. else if(typeof define === 'function' && define.amd)
  12. define([], factory);
  13. else if(typeof exports === 'object')
  14. exports["COS"] = factory();
  15. else
  16. root["COS"] = factory();
  17. })(this, function() {
  18. return /******/ (function(modules) { // webpackBootstrap
  19. /******/ // The module cache
  20. /******/ var installedModules = {};
  21. /******/
  22. /******/ // The require function
  23. /******/ function __webpack_require__(moduleId) {
  24. /******/
  25. /******/ // Check if module is in cache
  26. /******/ if(installedModules[moduleId]) {
  27. /******/ return installedModules[moduleId].exports;
  28. /******/ }
  29. /******/ // Create a new module (and put it into the cache)
  30. /******/ var module = installedModules[moduleId] = {
  31. /******/ i: moduleId,
  32. /******/ l: false,
  33. /******/ exports: {}
  34. /******/ };
  35. /******/
  36. /******/ // Execute the module function
  37. /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  38. /******/
  39. /******/ // Flag the module as loaded
  40. /******/ module.l = true;
  41. /******/
  42. /******/ // Return the exports of the module
  43. /******/ return module.exports;
  44. /******/ }
  45. /******/
  46. /******/
  47. /******/ // expose the modules object (__webpack_modules__)
  48. /******/ __webpack_require__.m = modules;
  49. /******/
  50. /******/ // expose the module cache
  51. /******/ __webpack_require__.c = installedModules;
  52. /******/
  53. /******/ // identity function for calling harmony imports with the correct context
  54. /******/ __webpack_require__.i = function(value) { return value; };
  55. /******/
  56. /******/ // define getter function for harmony exports
  57. /******/ __webpack_require__.d = function(exports, name, getter) {
  58. /******/ if(!__webpack_require__.o(exports, name)) {
  59. /******/ Object.defineProperty(exports, name, {
  60. /******/ configurable: false,
  61. /******/ enumerable: true,
  62. /******/ get: getter
  63. /******/ });
  64. /******/ }
  65. /******/ };
  66. /******/
  67. /******/ // getDefaultExport function for compatibility with non-harmony modules
  68. /******/ __webpack_require__.n = function(module) {
  69. /******/ var getter = module && module.__esModule ?
  70. /******/ function getDefault() { return module['default']; } :
  71. /******/ function getModuleExports() { return module; };
  72. /******/ __webpack_require__.d(getter, 'a', getter);
  73. /******/ return getter;
  74. /******/ };
  75. /******/
  76. /******/ // Object.prototype.hasOwnProperty.call
  77. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  78. /******/
  79. /******/ // __webpack_public_path__
  80. /******/ __webpack_require__.p = "D:\\code\\cos-wx-sdk-v5\\demo\\lib";
  81. /******/
  82. /******/ // Load entry module and return exports
  83. /******/ return __webpack_require__(__webpack_require__.s = 5);
  84. /******/ })
  85. /************************************************************************/
  86. /******/ ([
  87. /* 0 */
  88. /***/ (function(module, exports, __webpack_require__) {
  89. var md5 = __webpack_require__(8);
  90. var CryptoJS = __webpack_require__(6);
  91. var xml2json = __webpack_require__(10);
  92. var json2xml = __webpack_require__(7);
  93. var base64 = __webpack_require__(1);
  94. function camSafeUrlEncode(str) {
  95. return encodeURIComponent(str)
  96. .replace(/!/g, '%21')
  97. .replace(/'/g, '%27')
  98. .replace(/\(/g, '%28')
  99. .replace(/\)/g, '%29')
  100. .replace(/\*/g, '%2A');
  101. }
  102. //测试用的key后面可以去掉
  103. var getAuth = function (opt) {
  104. opt = opt || {};
  105. var SecretId = opt.SecretId;
  106. var SecretKey = opt.SecretKey;
  107. var KeyTime = opt.KeyTime;
  108. var method = (opt.method || opt.Method || 'get').toLowerCase();
  109. var queryParams = clone(opt.Query || opt.params || {});
  110. var headers = clone(opt.Headers || opt.headers || {});
  111. var pathname = opt.Pathname || '/' + (opt.Key || '');
  112. if (!SecretId) return console.error('missing param SecretId');
  113. if (!SecretKey) return console.error('missing param SecretKey');
  114. var getObjectKeys = function (obj) {
  115. var list = [];
  116. for (var key in obj) {
  117. if (obj.hasOwnProperty(key)) {
  118. list.push(key);
  119. }
  120. }
  121. return list.sort(function (a, b) {
  122. a = a.toLowerCase();
  123. b = b.toLowerCase();
  124. return a === b ? 0 : (a > b ? 1 : -1);
  125. });
  126. };
  127. var obj2str = function (obj) {
  128. var i, key, val;
  129. var list = [];
  130. var keyList = getObjectKeys(obj);
  131. for (i = 0; i < keyList.length; i++) {
  132. key = keyList[i];
  133. val = (obj[key] === undefined || obj[key] === null) ? '' : ('' + obj[key]);
  134. key = key.toLowerCase();
  135. key = camSafeUrlEncode(key);
  136. val = camSafeUrlEncode(val) || '';
  137. list.push(key + '=' + val)
  138. }
  139. return list.join('&');
  140. };
  141. // 签名有效起止时间
  142. var now = Math.round(getSkewTime(opt.SystemClockOffset) / 1000) - 1;
  143. var exp = now;
  144. var Expires = opt.Expires || opt.expires;
  145. if (Expires === undefined) {
  146. exp += 900; // 签名过期时间为当前 + 900s
  147. } else {
  148. exp += (Expires * 1) || 0;
  149. }
  150. // 要用到的 Authorization 参数列表
  151. var qSignAlgorithm = 'sha1';
  152. var qAk = SecretId;
  153. var qSignTime = KeyTime || now + ';' + exp;
  154. var qKeyTime = KeyTime || now + ';' + exp;
  155. var qHeaderList = getObjectKeys(headers).join(';').toLowerCase();
  156. var qUrlParamList = getObjectKeys(queryParams).join(';').toLowerCase();
  157. // 签名算法说明文档:https://www.qcloud.com/document/product/436/7778
  158. // 步骤一:计算 SignKey
  159. var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();
  160. // 步骤二:构成 FormatString
  161. var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\n');
  162. // 步骤三:计算 StringToSign
  163. var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\n');
  164. // 步骤四:计算 Signature
  165. var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();
  166. // 步骤五:构造 Authorization
  167. var authorization = [
  168. 'q-sign-algorithm=' + qSignAlgorithm,
  169. 'q-ak=' + qAk,
  170. 'q-sign-time=' + qSignTime,
  171. 'q-key-time=' + qKeyTime,
  172. 'q-header-list=' + qHeaderList,
  173. 'q-url-param-list=' + qUrlParamList,
  174. 'q-signature=' + qSignature
  175. ].join('&');
  176. return authorization;
  177. };
  178. var noop = function () {
  179. };
  180. // 清除对象里值为的 undefined 或 null 的属性
  181. var clearKey = function (obj) {
  182. var retObj = {};
  183. for (var key in obj) {
  184. if (obj.hasOwnProperty(key) && obj[key] !== undefined && obj[key] !== null) {
  185. retObj[key] = obj[key];
  186. }
  187. }
  188. return retObj;
  189. };
  190. var readAsBinaryString = function (blob, callback) {
  191. var readFun;
  192. var fr = new FileReader();
  193. if (FileReader.prototype.readAsBinaryString) {
  194. readFun = FileReader.prototype.readAsBinaryString;
  195. fr.onload = function () {
  196. callback(this.result);
  197. };
  198. } else if (FileReader.prototype.readAsArrayBuffer) { // 在 ie11 添加 readAsBinaryString 兼容
  199. readFun = function (fileData) {
  200. var binary = "";
  201. var pt = this;
  202. var reader = new FileReader();
  203. reader.onload = function (e) {
  204. var bytes = new Uint8Array(reader.result);
  205. var length = bytes.byteLength;
  206. for (var i = 0; i < length; i++) {
  207. binary += String.fromCharCode(bytes[i]);
  208. }
  209. callback(binary);
  210. };
  211. reader.readAsArrayBuffer(fileData);
  212. };
  213. } else {
  214. console.error('FileReader not support readAsBinaryString');
  215. }
  216. readFun.call(fr, blob);
  217. };
  218. // 获取文件 md5 值
  219. var getFileMd5 = function (blob, callback) {
  220. readAsBinaryString(blob, function (content) {
  221. var hash = md5(content, true);
  222. callback(null, hash);
  223. });
  224. };
  225. function clone(obj) {
  226. return map(obj, function (v) {
  227. return typeof v === 'object' ? clone(v) : v;
  228. });
  229. }
  230. function extend(target, source) {
  231. each(source, function (val, key) {
  232. target[key] = source[key];
  233. });
  234. return target;
  235. }
  236. function isArray(arr) {
  237. return arr instanceof Array;
  238. }
  239. function isInArray(arr, item) {
  240. var flag = false;
  241. for (var i = 0; i < arr.length; i++) {
  242. if (item === arr[i]) {
  243. flag = true;
  244. break;
  245. }
  246. }
  247. return flag;
  248. }
  249. function makeArray(arr) {
  250. return isArray(arr) ? arr : [arr];
  251. }
  252. function each(obj, fn) {
  253. for (var i in obj) {
  254. if (obj.hasOwnProperty(i)) {
  255. fn(obj[i], i);
  256. }
  257. }
  258. }
  259. function map(obj, fn) {
  260. var o = isArray(obj) ? [] : {};
  261. for (var i in obj) {
  262. if (obj.hasOwnProperty(i)) {
  263. o[i] = fn(obj[i], i);
  264. }
  265. }
  266. return o;
  267. }
  268. function filter(obj, fn) {
  269. var iaArr = isArray(obj);
  270. var o = iaArr ? [] : {};
  271. for (var i in obj) {
  272. if (obj.hasOwnProperty(i)) {
  273. if (fn(obj[i], i)) {
  274. if (iaArr) {
  275. o.push(obj[i]);
  276. } else {
  277. o[i] = obj[i];
  278. }
  279. }
  280. }
  281. }
  282. return o;
  283. }
  284. var binaryBase64 = function (str) {
  285. var i, len, char, res = '';
  286. for (i = 0, len = str.length / 2; i < len; i++) {
  287. char = parseInt(str[i * 2] + str[i * 2 + 1], 16);
  288. res += String.fromCharCode(char);
  289. }
  290. return base64.btoa(res);
  291. };
  292. var uuid = function () {
  293. var S4 = function () {
  294. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  295. };
  296. return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
  297. };
  298. var hasMissingParams = function (apiName, params) {
  299. var Bucket = params.Bucket;
  300. var Region = params.Region;
  301. var Key = params.Key;
  302. if (apiName.indexOf('Bucket') > -1 || apiName === 'deleteMultipleObject' || apiName === 'multipartList' || apiName === 'listObjectVersions') {
  303. if (!Bucket) return 'Bucket';
  304. if (!Region) return 'Region';
  305. } else if (apiName.indexOf('Object') > -1 || apiName.indexOf('multipart') > -1 || apiName === 'sliceUploadFile' || apiName === 'abortUploadTask') {
  306. if (!Bucket) return 'Bucket';
  307. if (!Region) return 'Region';
  308. if (!Key) return 'Key';
  309. }
  310. return false;
  311. };
  312. var formatParams = function (apiName, params) {
  313. // 复制参数对象
  314. params = extend({}, params);
  315. // 统一处理 Headers
  316. if (apiName !== 'getAuth' && apiName !== 'getV4Auth' && apiName !== 'getObjectUrl') {
  317. var Headers = params.Headers || {};
  318. if (params && typeof params === 'object') {
  319. (function () {
  320. for (var key in params) {
  321. if (params.hasOwnProperty(key) && key.indexOf('x-cos-') > -1) {
  322. Headers[key] = params[key];
  323. }
  324. }
  325. })();
  326. var headerMap = {
  327. // params headers
  328. 'x-cos-mfa': 'MFA',
  329. 'Content-MD5': 'ContentMD5',
  330. 'Content-Length': 'ContentLength',
  331. 'Content-Type': 'ContentType',
  332. 'Expect': 'Expect',
  333. 'Expires': 'Expires',
  334. 'Cache-Control': 'CacheControl',
  335. 'Content-Disposition': 'ContentDisposition',
  336. 'Content-Encoding': 'ContentEncoding',
  337. 'Range': 'Range',
  338. 'If-Modified-Since': 'IfModifiedSince',
  339. 'If-Unmodified-Since': 'IfUnmodifiedSince',
  340. 'If-Match': 'IfMatch',
  341. 'If-None-Match': 'IfNoneMatch',
  342. 'x-cos-copy-source': 'CopySource',
  343. 'x-cos-copy-source-Range': 'CopySourceRange',
  344. 'x-cos-metadata-directive': 'MetadataDirective',
  345. 'x-cos-copy-source-If-Modified-Since': 'CopySourceIfModifiedSince',
  346. 'x-cos-copy-source-If-Unmodified-Since': 'CopySourceIfUnmodifiedSince',
  347. 'x-cos-copy-source-If-Match': 'CopySourceIfMatch',
  348. 'x-cos-copy-source-If-None-Match': 'CopySourceIfNoneMatch',
  349. 'x-cos-acl': 'ACL',
  350. 'x-cos-grant-read': 'GrantRead',
  351. 'x-cos-grant-write': 'GrantWrite',
  352. 'x-cos-grant-full-control': 'GrantFullControl',
  353. 'x-cos-grant-read-acp': 'GrantReadAcp',
  354. 'x-cos-grant-write-acp': 'GrantWriteAcp',
  355. 'x-cos-storage-class': 'StorageClass',
  356. // SSE-C
  357. 'x-cos-server-side-encryption-customer-algorithm': 'SSECustomerAlgorithm',
  358. 'x-cos-server-side-encryption-customer-key': 'SSECustomerKey',
  359. 'x-cos-server-side-encryption-customer-key-MD5': 'SSECustomerKeyMD5',
  360. // SSE-COS、SSE-KMS
  361. 'x-cos-server-side-encryption': 'ServerSideEncryption',
  362. 'x-cos-server-side-encryption-cos-kms-key-id': 'SSEKMSKeyId',
  363. 'x-cos-server-side-encryption-context': 'SSEContext',
  364. };
  365. util.each(headerMap, function (paramKey, headerKey) {
  366. if (params[paramKey] !== undefined) {
  367. Headers[headerKey] = params[paramKey];
  368. }
  369. });
  370. params.Headers = clearKey(Headers);
  371. }
  372. }
  373. return params;
  374. };
  375. var apiWrapper = function (apiName, apiFn) {
  376. return function (params, callback) {
  377. // 处理参数
  378. if (typeof params === 'function') {
  379. callback = params;
  380. params = {};
  381. }
  382. // 整理参数格式
  383. params = formatParams(apiName, params);
  384. // 代理回调函数
  385. var formatResult = function (result) {
  386. if (result && result.headers) {
  387. result.headers['x-cos-version-id'] && (result.VersionId = result.headers['x-cos-version-id']);
  388. result.headers['x-cos-delete-marker'] && (result.DeleteMarker = result.headers['x-cos-delete-marker']);
  389. }
  390. return result;
  391. };
  392. var _callback = function (err, data) {
  393. callback && callback(formatResult(err), formatResult(data));
  394. };
  395. if (apiName !== 'getService' && apiName !== 'abortUploadTask') {
  396. // 判断参数是否完整
  397. var missingResult;
  398. if (missingResult = hasMissingParams(apiName, params)) {
  399. _callback({error: 'missing param ' + missingResult});
  400. return;
  401. }
  402. // 判断 region 格式
  403. if (params.Region) {
  404. if (params.Region.indexOf('cos.') > -1) {
  405. _callback({error: 'param Region should not be start with "cos."'});
  406. return;
  407. } else if (!/^([a-z\d-]+)$/.test(params.Region)) {
  408. _callback({error: 'Region format error.'});
  409. return;
  410. }
  411. // 判断 region 格式
  412. if (!this.options.CompatibilityMode && params.Region.indexOf('-') === -1 && params.Region !== 'yfb' && params.Region !== 'default') {
  413. console.warn('warning: param Region format error, find help here: https://cloud.tencent.com/document/product/436/6224');
  414. }
  415. }
  416. // 兼容不带 AppId 的 Bucket
  417. if (params.Bucket) {
  418. if (!/^([a-z\d-]+)-(\d+)$/.test(params.Bucket)) {
  419. if (params.AppId) {
  420. params.Bucket = params.Bucket + '-' + params.AppId;
  421. } else if (this.options.AppId) {
  422. params.Bucket = params.Bucket + '-' + this.options.AppId;
  423. } else {
  424. _callback({error: 'Bucket should format as "test-1250000000".'});
  425. return;
  426. }
  427. }
  428. if (params.AppId) {
  429. console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g Bucket:"test-1250000000" ).');
  430. delete params.AppId;
  431. }
  432. }
  433. }
  434. var res = apiFn.call(this, params, _callback);
  435. if (apiName === 'getAuth' || apiName === 'getObjectUrl') {
  436. return res;
  437. }
  438. }
  439. };
  440. var throttleOnProgress = function (total, onProgress) {
  441. if (!onProgress || typeof onProgress !== 'function') return noop;
  442. var self = this;
  443. var size0 = 0;
  444. var size1 = 0;
  445. var time0 = Date.now();
  446. var time1;
  447. var timer;
  448. function update() {
  449. clearTimeout(timer);
  450. timer = 0;
  451. time1 = Date.now();
  452. var speed = Math.max(0, Math.round((size1 - size0) / ((time1 - time0) / 1000) * 100) / 100);
  453. var percent;
  454. if (size1 === 0 && total === 0) {
  455. percent = 1;
  456. } else {
  457. percent = Math.round(size1 / total * 100) / 100 || 0;
  458. }
  459. time0 = time1;
  460. size0 = size1;
  461. try {
  462. onProgress({loaded: size1, total: total, speed: speed, percent: percent});
  463. } catch (e) {
  464. }
  465. }
  466. return function (info, immediately) {
  467. if (info) {
  468. size1 = info.loaded;
  469. total = info.total;
  470. }
  471. if (Date.now() - time0 > self.options.ProgressInterval || immediately) {
  472. update();
  473. } else {
  474. if (timer) return;
  475. timer = setTimeout(update, self.options.ProgressInterval);
  476. }
  477. };
  478. };
  479. var getFileSize = function (api, params, callback) {
  480. var size;
  481. if (typeof params.Body === 'string') {
  482. params.Body = new Blob([params.Body], {type: 'text/plain'});
  483. }
  484. if ((params.Body && (params.Body instanceof Blob || params.Body.toString() === '[object File]' || params.Body.toString() === '[object Blob]'))) {
  485. size = params.Body.size;
  486. } else {
  487. callback({error: 'params body format error, Only allow File|Blob|String.'});
  488. return;
  489. }
  490. params.ContentLength = size;
  491. callback(null, size);
  492. };
  493. var getSkewTime = function (offset) {
  494. return Date.now() + (offset || 0);
  495. };
  496. var util = {
  497. noop: noop,
  498. formatParams: formatParams,
  499. apiWrapper: apiWrapper,
  500. xml2json: xml2json,
  501. json2xml: json2xml,
  502. md5: md5,
  503. clearKey: clearKey,
  504. getFileMd5: getFileMd5,
  505. binaryBase64: binaryBase64,
  506. extend: extend,
  507. isArray: isArray,
  508. isInArray: isInArray,
  509. makeArray: makeArray,
  510. each: each,
  511. map: map,
  512. filter: filter,
  513. clone: clone,
  514. uuid: uuid,
  515. camSafeUrlEncode: camSafeUrlEncode,
  516. throttleOnProgress: throttleOnProgress,
  517. getFileSize: getFileSize,
  518. getSkewTime: getSkewTime,
  519. getAuth: getAuth,
  520. isBrowser: true,
  521. };
  522. util.fileSlice = function (file, start, end) {
  523. if (file.slice) {
  524. return file.slice(start, end);
  525. } else if (file.mozSlice) {
  526. return file.mozSlice(start, end);
  527. } else if (file.webkitSlice) {
  528. return file.webkitSlice(start, end);
  529. }
  530. };
  531. util.getFileUUID = function (file, ChunkSize) {
  532. // 如果信息不完整,不获取
  533. if (file.name && file.size && file.lastModifiedDate && ChunkSize) {
  534. return util.md5([file.name, file.size, file.lastModifiedDate, ChunkSize].join('::'));
  535. } else {
  536. return null;
  537. }
  538. };
  539. util.getBodyMd5 = function (UploadCheckContentMd5, Body, callback) {
  540. callback = callback || noop;
  541. if (UploadCheckContentMd5) {
  542. if (typeof Body === 'string') {
  543. callback(util.md5(Body, true));
  544. } else {
  545. callback();
  546. }
  547. } else {
  548. callback();
  549. }
  550. };
  551. module.exports = util;
  552. /***/ }),
  553. /* 1 */
  554. /***/ (function(module, exports) {
  555. /*
  556. * $Id: base64.js,v 2.15 2014/04/05 12:58:57 dankogai Exp dankogai $
  557. *
  558. * Licensed under the BSD 3-Clause License.
  559. * http://opensource.org/licenses/BSD-3-Clause
  560. *
  561. * References:
  562. * http://en.wikipedia.org/wiki/Base64
  563. */
  564. var Base64 = (function(global) {
  565. global = global || {};
  566. // existing version for noConflict()
  567. var _Base64 = global.Base64;
  568. var version = "2.1.9";
  569. // if node.js, we use Buffer
  570. var buffer;
  571. // constants
  572. var b64chars
  573. = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  574. var b64tab = function(bin) {
  575. var t = {};
  576. for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
  577. return t;
  578. }(b64chars);
  579. var fromCharCode = String.fromCharCode;
  580. // encoder stuff
  581. var cb_utob = function(c) {
  582. if (c.length < 2) {
  583. var cc = c.charCodeAt(0);
  584. return cc < 0x80 ? c
  585. : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
  586. + fromCharCode(0x80 | (cc & 0x3f)))
  587. : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
  588. + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
  589. + fromCharCode(0x80 | ( cc & 0x3f)));
  590. } else {
  591. var cc = 0x10000
  592. + (c.charCodeAt(0) - 0xD800) * 0x400
  593. + (c.charCodeAt(1) - 0xDC00);
  594. return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
  595. + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
  596. + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
  597. + fromCharCode(0x80 | ( cc & 0x3f)));
  598. }
  599. };
  600. var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
  601. var utob = function(u) {
  602. return u.replace(re_utob, cb_utob);
  603. };
  604. var cb_encode = function(ccc) {
  605. var padlen = [0, 2, 1][ccc.length % 3],
  606. ord = ccc.charCodeAt(0) << 16
  607. | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
  608. | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
  609. chars = [
  610. b64chars.charAt( ord >>> 18),
  611. b64chars.charAt((ord >>> 12) & 63),
  612. padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
  613. padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
  614. ];
  615. return chars.join('');
  616. };
  617. var btoa = global.btoa ? function(b) {
  618. return global.btoa(b);
  619. } : function(b) {
  620. return b.replace(/[\s\S]{1,3}/g, cb_encode);
  621. };
  622. var _encode = buffer ? function (u) {
  623. return (u.constructor === buffer.constructor ? u : new buffer(u))
  624. .toString('base64')
  625. }
  626. : function (u) { return btoa(utob(u)) }
  627. ;
  628. var encode = function(u, urisafe) {
  629. return !urisafe
  630. ? _encode(String(u))
  631. : _encode(String(u)).replace(/[+\/]/g, function(m0) {
  632. return m0 == '+' ? '-' : '_';
  633. }).replace(/=/g, '');
  634. };
  635. var encodeURI = function(u) { return encode(u, true) };
  636. // decoder stuff
  637. var re_btou = new RegExp([
  638. '[\xC0-\xDF][\x80-\xBF]',
  639. '[\xE0-\xEF][\x80-\xBF]{2}',
  640. '[\xF0-\xF7][\x80-\xBF]{3}'
  641. ].join('|'), 'g');
  642. var cb_btou = function(cccc) {
  643. switch(cccc.length) {
  644. case 4:
  645. var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
  646. | ((0x3f & cccc.charCodeAt(1)) << 12)
  647. | ((0x3f & cccc.charCodeAt(2)) << 6)
  648. | (0x3f & cccc.charCodeAt(3)),
  649. offset = cp - 0x10000;
  650. return (fromCharCode((offset >>> 10) + 0xD800)
  651. + fromCharCode((offset & 0x3FF) + 0xDC00));
  652. case 3:
  653. return fromCharCode(
  654. ((0x0f & cccc.charCodeAt(0)) << 12)
  655. | ((0x3f & cccc.charCodeAt(1)) << 6)
  656. | (0x3f & cccc.charCodeAt(2))
  657. );
  658. default:
  659. return fromCharCode(
  660. ((0x1f & cccc.charCodeAt(0)) << 6)
  661. | (0x3f & cccc.charCodeAt(1))
  662. );
  663. }
  664. };
  665. var btou = function(b) {
  666. return b.replace(re_btou, cb_btou);
  667. };
  668. var cb_decode = function(cccc) {
  669. var len = cccc.length,
  670. padlen = len % 4,
  671. n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
  672. | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
  673. | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)
  674. | (len > 3 ? b64tab[cccc.charAt(3)] : 0),
  675. chars = [
  676. fromCharCode( n >>> 16),
  677. fromCharCode((n >>> 8) & 0xff),
  678. fromCharCode( n & 0xff)
  679. ];
  680. chars.length -= [0, 0, 2, 1][padlen];
  681. return chars.join('');
  682. };
  683. var atob = global.atob ? function(a) {
  684. return global.atob(a);
  685. } : function(a){
  686. return a.replace(/[\s\S]{1,4}/g, cb_decode);
  687. };
  688. var _decode = buffer ? function(a) {
  689. return (a.constructor === buffer.constructor
  690. ? a : new buffer(a, 'base64')).toString();
  691. }
  692. : function(a) { return btou(atob(a)) };
  693. var decode = function(a){
  694. return _decode(
  695. String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
  696. .replace(/[^A-Za-z0-9\+\/]/g, '')
  697. );
  698. };
  699. var noConflict = function() {
  700. var Base64 = global.Base64;
  701. global.Base64 = _Base64;
  702. return Base64;
  703. };
  704. // export Base64
  705. var Base64 = {
  706. VERSION: version,
  707. atob: atob,
  708. btoa: btoa,
  709. fromBase64: decode,
  710. toBase64: encode,
  711. utob: utob,
  712. encode: encode,
  713. encodeURI: encodeURI,
  714. btou: btou,
  715. decode: decode,
  716. noConflict: noConflict
  717. };
  718. return Base64;
  719. })();
  720. module.exports = Base64;
  721. /***/ }),
  722. /* 2 */
  723. /***/ (function(module, exports) {
  724. /*
  725. * DOM Level 2
  726. * Object DOMException
  727. * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
  728. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
  729. */
  730. function copy(src,dest){
  731. for(var p in src){
  732. dest[p] = src[p];
  733. }
  734. }
  735. /**
  736. ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
  737. ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
  738. */
  739. function _extends(Class,Super){
  740. var pt = Class.prototype;
  741. if(Object.create){
  742. var ppt = Object.create(Super.prototype)
  743. pt.__proto__ = ppt;
  744. }
  745. if(!(pt instanceof Super)){
  746. function t(){};
  747. t.prototype = Super.prototype;
  748. t = new t();
  749. copy(pt,t);
  750. Class.prototype = pt = t;
  751. }
  752. if(pt.constructor != Class){
  753. if(typeof Class != 'function'){
  754. console.error("unknow Class:"+Class)
  755. }
  756. pt.constructor = Class
  757. }
  758. }
  759. var htmlns = 'http://www.w3.org/1999/xhtml' ;
  760. // Node Types
  761. var NodeType = {}
  762. var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
  763. var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
  764. var TEXT_NODE = NodeType.TEXT_NODE = 3;
  765. var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
  766. var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
  767. var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
  768. var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
  769. var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
  770. var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
  771. var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
  772. var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
  773. var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
  774. // ExceptionCode
  775. var ExceptionCode = {}
  776. var ExceptionMessage = {};
  777. var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
  778. var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
  779. var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
  780. var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
  781. var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
  782. var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
  783. var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
  784. var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
  785. var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
  786. var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
  787. //level2
  788. var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
  789. var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
  790. var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
  791. var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
  792. var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
  793. function DOMException(code, message) {
  794. if(message instanceof Error){
  795. var error = message;
  796. }else{
  797. error = this;
  798. Error.call(this, ExceptionMessage[code]);
  799. this.message = ExceptionMessage[code];
  800. if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
  801. }
  802. error.code = code;
  803. if(message) this.message = this.message + ": " + message;
  804. return error;
  805. };
  806. DOMException.prototype = Error.prototype;
  807. copy(ExceptionCode,DOMException)
  808. /**
  809. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
  810. * 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.
  811. * The items in the NodeList are accessible via an integral index, starting from 0.
  812. */
  813. function NodeList() {
  814. };
  815. NodeList.prototype = {
  816. /**
  817. * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
  818. * @standard level1
  819. */
  820. length:0,
  821. /**
  822. * 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.
  823. * @standard level1
  824. * @param index unsigned long
  825. * Index into the collection.
  826. * @return Node
  827. * The node at the indexth position in the NodeList, or null if that is not a valid index.
  828. */
  829. item: function(index) {
  830. return this[index] || null;
  831. },
  832. toString:function(isHTML,nodeFilter){
  833. for(var buf = [], i = 0;i<this.length;i++){
  834. serializeToString(this[i],buf,isHTML,nodeFilter);
  835. }
  836. return buf.join('');
  837. }
  838. };
  839. function LiveNodeList(node,refresh){
  840. this._node = node;
  841. this._refresh = refresh
  842. _updateLiveList(this);
  843. }
  844. function _updateLiveList(list){
  845. var inc = list._node._inc || list._node.ownerDocument._inc;
  846. if(list._inc != inc){
  847. var ls = list._refresh(list._node);
  848. //console.log(ls.length)
  849. __set__(list,'length',ls.length);
  850. copy(ls,list);
  851. list._inc = inc;
  852. }
  853. }
  854. LiveNodeList.prototype.item = function(i){
  855. _updateLiveList(this);
  856. return this[i];
  857. }
  858. _extends(LiveNodeList,NodeList);
  859. /**
  860. *
  861. * 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.
  862. * NamedNodeMap objects in the DOM are live.
  863. * used for attributes or DocumentType entities
  864. */
  865. function NamedNodeMap() {
  866. };
  867. function _findNodeIndex(list,node){
  868. var i = list.length;
  869. while(i--){
  870. if(list[i] === node){return i}
  871. }
  872. }
  873. function _addNamedNode(el,list,newAttr,oldAttr){
  874. if(oldAttr){
  875. list[_findNodeIndex(list,oldAttr)] = newAttr;
  876. }else{
  877. list[list.length++] = newAttr;
  878. }
  879. if(el){
  880. newAttr.ownerElement = el;
  881. var doc = el.ownerDocument;
  882. if(doc){
  883. oldAttr && _onRemoveAttribute(doc,el,oldAttr);
  884. _onAddAttribute(doc,el,newAttr);
  885. }
  886. }
  887. }
  888. function _removeNamedNode(el,list,attr){
  889. //console.log('remove attr:'+attr)
  890. var i = _findNodeIndex(list,attr);
  891. if(i>=0){
  892. var lastIndex = list.length-1
  893. while(i<lastIndex){
  894. list[i] = list[++i]
  895. }
  896. list.length = lastIndex;
  897. if(el){
  898. var doc = el.ownerDocument;
  899. if(doc){
  900. _onRemoveAttribute(doc,el,attr);
  901. attr.ownerElement = null;
  902. }
  903. }
  904. }else{
  905. throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
  906. }
  907. }
  908. NamedNodeMap.prototype = {
  909. length:0,
  910. item:NodeList.prototype.item,
  911. getNamedItem: function(key) {
  912. // if(key.indexOf(':')>0 || key == 'xmlns'){
  913. // return null;
  914. // }
  915. //console.log()
  916. var i = this.length;
  917. while(i--){
  918. var attr = this[i];
  919. //console.log(attr.nodeName,key)
  920. if(attr.nodeName == key){
  921. return attr;
  922. }
  923. }
  924. },
  925. setNamedItem: function(attr) {
  926. var el = attr.ownerElement;
  927. if(el && el!=this._ownerElement){
  928. throw new DOMException(INUSE_ATTRIBUTE_ERR);
  929. }
  930. var oldAttr = this.getNamedItem(attr.nodeName);
  931. _addNamedNode(this._ownerElement,this,attr,oldAttr);
  932. return oldAttr;
  933. },
  934. /* returns Node */
  935. setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
  936. var el = attr.ownerElement, oldAttr;
  937. if(el && el!=this._ownerElement){
  938. throw new DOMException(INUSE_ATTRIBUTE_ERR);
  939. }
  940. oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
  941. _addNamedNode(this._ownerElement,this,attr,oldAttr);
  942. return oldAttr;
  943. },
  944. /* returns Node */
  945. removeNamedItem: function(key) {
  946. var attr = this.getNamedItem(key);
  947. _removeNamedNode(this._ownerElement,this,attr);
  948. return attr;
  949. },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
  950. //for level2
  951. removeNamedItemNS:function(namespaceURI,localName){
  952. var attr = this.getNamedItemNS(namespaceURI,localName);
  953. _removeNamedNode(this._ownerElement,this,attr);
  954. return attr;
  955. },
  956. getNamedItemNS: function(namespaceURI, localName) {
  957. var i = this.length;
  958. while(i--){
  959. var node = this[i];
  960. if(node.localName == localName && node.namespaceURI == namespaceURI){
  961. return node;
  962. }
  963. }
  964. return null;
  965. }
  966. };
  967. /**
  968. * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
  969. */
  970. function DOMImplementation(/* Object */ features) {
  971. this._features = {};
  972. if (features) {
  973. for (var feature in features) {
  974. this._features = features[feature];
  975. }
  976. }
  977. };
  978. DOMImplementation.prototype = {
  979. hasFeature: function(/* string */ feature, /* string */ version) {
  980. var versions = this._features[feature.toLowerCase()];
  981. if (versions && (!version || version in versions)) {
  982. return true;
  983. } else {
  984. return false;
  985. }
  986. },
  987. // Introduced in DOM Level 2:
  988. createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
  989. var doc = new Document();
  990. doc.implementation = this;
  991. doc.childNodes = new NodeList();
  992. doc.doctype = doctype;
  993. if(doctype){
  994. doc.appendChild(doctype);
  995. }
  996. if(qualifiedName){
  997. var root = doc.createElementNS(namespaceURI,qualifiedName);
  998. doc.appendChild(root);
  999. }
  1000. return doc;
  1001. },
  1002. // Introduced in DOM Level 2:
  1003. createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
  1004. var node = new DocumentType();
  1005. node.name = qualifiedName;
  1006. node.nodeName = qualifiedName;
  1007. node.publicId = publicId;
  1008. node.systemId = systemId;
  1009. // Introduced in DOM Level 2:
  1010. //readonly attribute DOMString internalSubset;
  1011. //TODO:..
  1012. // readonly attribute NamedNodeMap entities;
  1013. // readonly attribute NamedNodeMap notations;
  1014. return node;
  1015. }
  1016. };
  1017. /**
  1018. * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
  1019. */
  1020. function Node() {
  1021. };
  1022. Node.prototype = {
  1023. firstChild : null,
  1024. lastChild : null,
  1025. previousSibling : null,
  1026. nextSibling : null,
  1027. attributes : null,
  1028. parentNode : null,
  1029. childNodes : null,
  1030. ownerDocument : null,
  1031. nodeValue : null,
  1032. namespaceURI : null,
  1033. prefix : null,
  1034. localName : null,
  1035. // Modified in DOM Level 2:
  1036. insertBefore:function(newChild, refChild){//raises
  1037. return _insertBefore(this,newChild,refChild);
  1038. },
  1039. replaceChild:function(newChild, oldChild){//raises
  1040. this.insertBefore(newChild,oldChild);
  1041. if(oldChild){
  1042. this.removeChild(oldChild);
  1043. }
  1044. },
  1045. removeChild:function(oldChild){
  1046. return _removeChild(this,oldChild);
  1047. },
  1048. appendChild:function(newChild){
  1049. return this.insertBefore(newChild,null);
  1050. },
  1051. hasChildNodes:function(){
  1052. return this.firstChild != null;
  1053. },
  1054. cloneNode:function(deep){
  1055. return cloneNode(this.ownerDocument||this,this,deep);
  1056. },
  1057. // Modified in DOM Level 2:
  1058. normalize:function(){
  1059. var child = this.firstChild;
  1060. while(child){
  1061. var next = child.nextSibling;
  1062. if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
  1063. this.removeChild(next);
  1064. child.appendData(next.data);
  1065. }else{
  1066. child.normalize();
  1067. child = next;
  1068. }
  1069. }
  1070. },
  1071. // Introduced in DOM Level 2:
  1072. isSupported:function(feature, version){
  1073. return this.ownerDocument.implementation.hasFeature(feature,version);
  1074. },
  1075. // Introduced in DOM Level 2:
  1076. hasAttributes:function(){
  1077. return this.attributes.length>0;
  1078. },
  1079. lookupPrefix:function(namespaceURI){
  1080. var el = this;
  1081. while(el){
  1082. var map = el._nsMap;
  1083. //console.dir(map)
  1084. if(map){
  1085. for(var n in map){
  1086. if(map[n] == namespaceURI){
  1087. return n;
  1088. }
  1089. }
  1090. }
  1091. el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
  1092. }
  1093. return null;
  1094. },
  1095. // Introduced in DOM Level 3:
  1096. lookupNamespaceURI:function(prefix){
  1097. var el = this;
  1098. while(el){
  1099. var map = el._nsMap;
  1100. //console.dir(map)
  1101. if(map){
  1102. if(prefix in map){
  1103. return map[prefix] ;
  1104. }
  1105. }
  1106. el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
  1107. }
  1108. return null;
  1109. },
  1110. // Introduced in DOM Level 3:
  1111. isDefaultNamespace:function(namespaceURI){
  1112. var prefix = this.lookupPrefix(namespaceURI);
  1113. return prefix == null;
  1114. }
  1115. };
  1116. function _xmlEncoder(c){
  1117. return c == '<' && '&lt;' ||
  1118. c == '>' && '&gt;' ||
  1119. c == '&' && '&amp;' ||
  1120. c == '"' && '&quot;' ||
  1121. '&#'+c.charCodeAt()+';'
  1122. }
  1123. copy(NodeType,Node);
  1124. copy(NodeType,Node.prototype);
  1125. /**
  1126. * @param callback return true for continue,false for break
  1127. * @return boolean true: break visit;
  1128. */
  1129. function _visitNode(node,callback){
  1130. if(callback(node)){
  1131. return true;
  1132. }
  1133. if(node = node.firstChild){
  1134. do{
  1135. if(_visitNode(node,callback)){return true}
  1136. }while(node=node.nextSibling)
  1137. }
  1138. }
  1139. function Document(){
  1140. }
  1141. function _onAddAttribute(doc,el,newAttr){
  1142. doc && doc._inc++;
  1143. var ns = newAttr.namespaceURI ;
  1144. if(ns == 'http://www.w3.org/2000/xmlns/'){
  1145. //update namespace
  1146. el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value
  1147. }
  1148. }
  1149. function _onRemoveAttribute(doc,el,newAttr,remove){
  1150. doc && doc._inc++;
  1151. var ns = newAttr.namespaceURI ;
  1152. if(ns == 'http://www.w3.org/2000/xmlns/'){
  1153. //update namespace
  1154. delete el._nsMap[newAttr.prefix?newAttr.localName:'']
  1155. }
  1156. }
  1157. function _onUpdateChild(doc,el,newChild){
  1158. if(doc && doc._inc){
  1159. doc._inc++;
  1160. //update childNodes
  1161. var cs = el.childNodes;
  1162. if(newChild){
  1163. cs[cs.length++] = newChild;
  1164. }else{
  1165. //console.log(1)
  1166. var child = el.firstChild;
  1167. var i = 0;
  1168. while(child){
  1169. cs[i++] = child;
  1170. child =child.nextSibling;
  1171. }
  1172. cs.length = i;
  1173. }
  1174. }
  1175. }
  1176. /**
  1177. * attributes;
  1178. * children;
  1179. *
  1180. * writeable properties:
  1181. * nodeValue,Attr:value,CharacterData:data
  1182. * prefix
  1183. */
  1184. function _removeChild(parentNode,child){
  1185. var previous = child.previousSibling;
  1186. var next = child.nextSibling;
  1187. if(previous){
  1188. previous.nextSibling = next;
  1189. }else{
  1190. parentNode.firstChild = next
  1191. }
  1192. if(next){
  1193. next.previousSibling = previous;
  1194. }else{
  1195. parentNode.lastChild = previous;
  1196. }
  1197. _onUpdateChild(parentNode.ownerDocument,parentNode);
  1198. return child;
  1199. }
  1200. /**
  1201. * preformance key(refChild == null)
  1202. */
  1203. function _insertBefore(parentNode,newChild,nextChild){
  1204. var cp = newChild.parentNode;
  1205. if(cp){
  1206. cp.removeChild(newChild);//remove and update
  1207. }
  1208. if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
  1209. var newFirst = newChild.firstChild;
  1210. if (newFirst == null) {
  1211. return newChild;
  1212. }
  1213. var newLast = newChild.lastChild;
  1214. }else{
  1215. newFirst = newLast = newChild;
  1216. }
  1217. var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
  1218. newFirst.previousSibling = pre;
  1219. newLast.nextSibling = nextChild;
  1220. if(pre){
  1221. pre.nextSibling = newFirst;
  1222. }else{
  1223. parentNode.firstChild = newFirst;
  1224. }
  1225. if(nextChild == null){
  1226. parentNode.lastChild = newLast;
  1227. }else{
  1228. nextChild.previousSibling = newLast;
  1229. }
  1230. do{
  1231. newFirst.parentNode = parentNode;
  1232. }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
  1233. _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
  1234. //console.log(parentNode.lastChild.nextSibling == null)
  1235. if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
  1236. newChild.firstChild = newChild.lastChild = null;
  1237. }
  1238. return newChild;
  1239. }
  1240. function _appendSingleChild(parentNode,newChild){
  1241. var cp = newChild.parentNode;
  1242. if(cp){
  1243. var pre = parentNode.lastChild;
  1244. cp.removeChild(newChild);//remove and update
  1245. var pre = parentNode.lastChild;
  1246. }
  1247. var pre = parentNode.lastChild;
  1248. newChild.parentNode = parentNode;
  1249. newChild.previousSibling = pre;
  1250. newChild.nextSibling = null;
  1251. if(pre){
  1252. pre.nextSibling = newChild;
  1253. }else{
  1254. parentNode.firstChild = newChild;
  1255. }
  1256. parentNode.lastChild = newChild;
  1257. _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
  1258. return newChild;
  1259. //console.log("__aa",parentNode.lastChild.nextSibling == null)
  1260. }
  1261. Document.prototype = {
  1262. //implementation : null,
  1263. nodeName : '#document',
  1264. nodeType : DOCUMENT_NODE,
  1265. doctype : null,
  1266. documentElement : null,
  1267. _inc : 1,
  1268. insertBefore : function(newChild, refChild){//raises
  1269. if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
  1270. var child = newChild.firstChild;
  1271. while(child){
  1272. var next = child.nextSibling;
  1273. this.insertBefore(child,refChild);
  1274. child = next;
  1275. }
  1276. return newChild;
  1277. }
  1278. if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
  1279. this.documentElement = newChild;
  1280. }
  1281. return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
  1282. },
  1283. removeChild : function(oldChild){
  1284. if(this.documentElement == oldChild){
  1285. this.documentElement = null;
  1286. }
  1287. return _removeChild(this,oldChild);
  1288. },
  1289. // Introduced in DOM Level 2:
  1290. importNode : function(importedNode,deep){
  1291. return importNode(this,importedNode,deep);
  1292. },
  1293. // Introduced in DOM Level 2:
  1294. getElementById : function(id){
  1295. var rtv = null;
  1296. _visitNode(this.documentElement,function(node){
  1297. if(node.nodeType == ELEMENT_NODE){
  1298. if(node.getAttribute('id') == id){
  1299. rtv = node;
  1300. return true;
  1301. }
  1302. }
  1303. })
  1304. return rtv;
  1305. },
  1306. //document factory method:
  1307. createElement : function(tagName){
  1308. var node = new Element();
  1309. node.ownerDocument = this;
  1310. node.nodeName = tagName;
  1311. node.tagName = tagName;
  1312. node.childNodes = new NodeList();
  1313. var attrs = node.attributes = new NamedNodeMap();
  1314. attrs._ownerElement = node;
  1315. return node;
  1316. },
  1317. createDocumentFragment : function(){
  1318. var node = new DocumentFragment();
  1319. node.ownerDocument = this;
  1320. node.childNodes = new NodeList();
  1321. return node;
  1322. },
  1323. createTextNode : function(data){
  1324. var node = new Text();
  1325. node.ownerDocument = this;
  1326. node.appendData(data)
  1327. return node;
  1328. },
  1329. createComment : function(data){
  1330. var node = new Comment();
  1331. node.ownerDocument = this;
  1332. node.appendData(data)
  1333. return node;
  1334. },
  1335. createCDATASection : function(data){
  1336. var node = new CDATASection();
  1337. node.ownerDocument = this;
  1338. node.appendData(data)
  1339. return node;
  1340. },
  1341. createProcessingInstruction : function(target,data){
  1342. var node = new ProcessingInstruction();
  1343. node.ownerDocument = this;
  1344. node.tagName = node.target = target;
  1345. node.nodeValue= node.data = data;
  1346. return node;
  1347. },
  1348. createAttribute : function(name){
  1349. var node = new Attr();
  1350. node.ownerDocument = this;
  1351. node.name = name;
  1352. node.nodeName = name;
  1353. node.localName = name;
  1354. node.specified = true;
  1355. return node;
  1356. },
  1357. createEntityReference : function(name){
  1358. var node = new EntityReference();
  1359. node.ownerDocument = this;
  1360. node.nodeName = name;
  1361. return node;
  1362. },
  1363. // Introduced in DOM Level 2:
  1364. createElementNS : function(namespaceURI,qualifiedName){
  1365. var node = new Element();
  1366. var pl = qualifiedName.split(':');
  1367. var attrs = node.attributes = new NamedNodeMap();
  1368. node.childNodes = new NodeList();
  1369. node.ownerDocument = this;
  1370. node.nodeName = qualifiedName;
  1371. node.tagName = qualifiedName;
  1372. node.namespaceURI = namespaceURI;
  1373. if(pl.length == 2){
  1374. node.prefix = pl[0];
  1375. node.localName = pl[1];
  1376. }else{
  1377. //el.prefix = null;
  1378. node.localName = qualifiedName;
  1379. }
  1380. attrs._ownerElement = node;
  1381. return node;
  1382. },
  1383. // Introduced in DOM Level 2:
  1384. createAttributeNS : function(namespaceURI,qualifiedName){
  1385. var node = new Attr();
  1386. var pl = qualifiedName.split(':');
  1387. node.ownerDocument = this;
  1388. node.nodeName = qualifiedName;
  1389. node.name = qualifiedName;
  1390. node.namespaceURI = namespaceURI;
  1391. node.specified = true;
  1392. if(pl.length == 2){
  1393. node.prefix = pl[0];
  1394. node.localName = pl[1];
  1395. }else{
  1396. //el.prefix = null;
  1397. node.localName = qualifiedName;
  1398. }
  1399. return node;
  1400. }
  1401. };
  1402. _extends(Document,Node);
  1403. function Element() {
  1404. this._nsMap = {};
  1405. };
  1406. Element.prototype = {
  1407. nodeType : ELEMENT_NODE,
  1408. hasAttribute : function(name){
  1409. return this.getAttributeNode(name)!=null;
  1410. },
  1411. getAttribute : function(name){
  1412. var attr = this.getAttributeNode(name);
  1413. return attr && attr.value || '';
  1414. },
  1415. getAttributeNode : function(name){
  1416. return this.attributes.getNamedItem(name);
  1417. },
  1418. setAttribute : function(name, value){
  1419. var attr = this.ownerDocument.createAttribute(name);
  1420. attr.value = attr.nodeValue = "" + value;
  1421. this.setAttributeNode(attr)
  1422. },
  1423. removeAttribute : function(name){
  1424. var attr = this.getAttributeNode(name)
  1425. attr && this.removeAttributeNode(attr);
  1426. },
  1427. //four real opeartion method
  1428. appendChild:function(newChild){
  1429. if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
  1430. return this.insertBefore(newChild,null);
  1431. }else{
  1432. return _appendSingleChild(this,newChild);
  1433. }
  1434. },
  1435. setAttributeNode : function(newAttr){
  1436. return this.attributes.setNamedItem(newAttr);
  1437. },
  1438. setAttributeNodeNS : function(newAttr){
  1439. return this.attributes.setNamedItemNS(newAttr);
  1440. },
  1441. removeAttributeNode : function(oldAttr){
  1442. //console.log(this == oldAttr.ownerElement)
  1443. return this.attributes.removeNamedItem(oldAttr.nodeName);
  1444. },
  1445. //get real attribute name,and remove it by removeAttributeNode
  1446. removeAttributeNS : function(namespaceURI, localName){
  1447. var old = this.getAttributeNodeNS(namespaceURI, localName);
  1448. old && this.removeAttributeNode(old);
  1449. },
  1450. hasAttributeNS : function(namespaceURI, localName){
  1451. return this.getAttributeNodeNS(namespaceURI, localName)!=null;
  1452. },
  1453. getAttributeNS : function(namespaceURI, localName){
  1454. var attr = this.getAttributeNodeNS(namespaceURI, localName);
  1455. return attr && attr.value || '';
  1456. },
  1457. setAttributeNS : function(namespaceURI, qualifiedName, value){
  1458. var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
  1459. attr.value = attr.nodeValue = "" + value;
  1460. this.setAttributeNode(attr)
  1461. },
  1462. getAttributeNodeNS : function(namespaceURI, localName){
  1463. return this.attributes.getNamedItemNS(namespaceURI, localName);
  1464. },
  1465. getElementsByTagName : function(tagName){
  1466. return new LiveNodeList(this,function(base){
  1467. var ls = [];
  1468. _visitNode(base,function(node){
  1469. if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
  1470. ls.push(node);
  1471. }
  1472. });
  1473. return ls;
  1474. });
  1475. },
  1476. getElementsByTagNameNS : function(namespaceURI, localName){
  1477. return new LiveNodeList(this,function(base){
  1478. var ls = [];
  1479. _visitNode(base,function(node){
  1480. if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
  1481. ls.push(node);
  1482. }
  1483. });
  1484. return ls;
  1485. });
  1486. }
  1487. };
  1488. Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
  1489. Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
  1490. _extends(Element,Node);
  1491. function Attr() {
  1492. };
  1493. Attr.prototype.nodeType = ATTRIBUTE_NODE;
  1494. _extends(Attr,Node);
  1495. function CharacterData() {
  1496. };
  1497. CharacterData.prototype = {
  1498. data : '',
  1499. substringData : function(offset, count) {
  1500. return this.data.substring(offset, offset+count);
  1501. },
  1502. appendData: function(text) {
  1503. text = this.data+text;
  1504. this.nodeValue = this.data = text;
  1505. this.length = text.length;
  1506. },
  1507. insertData: function(offset,text) {
  1508. this.replaceData(offset,0,text);
  1509. },
  1510. appendChild:function(newChild){
  1511. throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
  1512. },
  1513. deleteData: function(offset, count) {
  1514. this.replaceData(offset,count,"");
  1515. },
  1516. replaceData: function(offset, count, text) {
  1517. var start = this.data.substring(0,offset);
  1518. var end = this.data.substring(offset+count);
  1519. text = start + text + end;
  1520. this.nodeValue = this.data = text;
  1521. this.length = text.length;
  1522. }
  1523. }
  1524. _extends(CharacterData,Node);
  1525. function Text() {
  1526. };
  1527. Text.prototype = {
  1528. nodeName : "#text",
  1529. nodeType : TEXT_NODE,
  1530. splitText : function(offset) {
  1531. var text = this.data;
  1532. var newText = text.substring(offset);
  1533. text = text.substring(0, offset);
  1534. this.data = this.nodeValue = text;
  1535. this.length = text.length;
  1536. var newNode = this.ownerDocument.createTextNode(newText);
  1537. if(this.parentNode){
  1538. this.parentNode.insertBefore(newNode, this.nextSibling);
  1539. }
  1540. return newNode;
  1541. }
  1542. }
  1543. _extends(Text,CharacterData);
  1544. function Comment() {
  1545. };
  1546. Comment.prototype = {
  1547. nodeName : "#comment",
  1548. nodeType : COMMENT_NODE
  1549. }
  1550. _extends(Comment,CharacterData);
  1551. function CDATASection() {
  1552. };
  1553. CDATASection.prototype = {
  1554. nodeName : "#cdata-section",
  1555. nodeType : CDATA_SECTION_NODE
  1556. }
  1557. _extends(CDATASection,CharacterData);
  1558. function DocumentType() {
  1559. };
  1560. DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
  1561. _extends(DocumentType,Node);
  1562. function Notation() {
  1563. };
  1564. Notation.prototype.nodeType = NOTATION_NODE;
  1565. _extends(Notation,Node);
  1566. function Entity() {
  1567. };
  1568. Entity.prototype.nodeType = ENTITY_NODE;
  1569. _extends(Entity,Node);
  1570. function EntityReference() {
  1571. };
  1572. EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
  1573. _extends(EntityReference,Node);
  1574. function DocumentFragment() {
  1575. };
  1576. DocumentFragment.prototype.nodeName = "#document-fragment";
  1577. DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
  1578. _extends(DocumentFragment,Node);
  1579. function ProcessingInstruction() {
  1580. }
  1581. ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
  1582. _extends(ProcessingInstruction,Node);
  1583. function XMLSerializer(){}
  1584. XMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){
  1585. return nodeSerializeToString.call(node,isHtml,nodeFilter);
  1586. }
  1587. Node.prototype.toString = nodeSerializeToString;
  1588. function nodeSerializeToString(isHtml,nodeFilter){
  1589. var buf = [];
  1590. var refNode = this.nodeType == 9?this.documentElement:this;
  1591. var prefix = refNode.prefix;
  1592. var uri = refNode.namespaceURI;
  1593. if(uri && prefix == null){
  1594. //console.log(prefix)
  1595. var prefix = refNode.lookupPrefix(uri);
  1596. if(prefix == null){
  1597. //isHTML = true;
  1598. var visibleNamespaces=[
  1599. {namespace:uri,prefix:null}
  1600. //{namespace:uri,prefix:''}
  1601. ]
  1602. }
  1603. }
  1604. serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
  1605. //console.log('###',this.nodeType,uri,prefix,buf.join(''))
  1606. return buf.join('');
  1607. }
  1608. function needNamespaceDefine(node,isHTML, visibleNamespaces) {
  1609. var prefix = node.prefix||'';
  1610. var uri = node.namespaceURI;
  1611. if (!prefix && !uri){
  1612. return false;
  1613. }
  1614. if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
  1615. || uri == 'http://www.w3.org/2000/xmlns/'){
  1616. return false;
  1617. }
  1618. var i = visibleNamespaces.length
  1619. //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
  1620. while (i--) {
  1621. var ns = visibleNamespaces[i];
  1622. // get namespace prefix
  1623. //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
  1624. if (ns.prefix == prefix){
  1625. return ns.namespace != uri;
  1626. }
  1627. }
  1628. //console.log(isHTML,uri,prefix=='')
  1629. //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
  1630. // return false;
  1631. //}
  1632. //node.flag = '11111'
  1633. //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
  1634. return true;
  1635. }
  1636. function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
  1637. if(nodeFilter){
  1638. node = nodeFilter(node);
  1639. if(node){
  1640. if(typeof node == 'string'){
  1641. buf.push(node);
  1642. return;
  1643. }
  1644. }else{
  1645. return;
  1646. }
  1647. //buf.sort.apply(attrs, attributeSorter);
  1648. }
  1649. switch(node.nodeType){
  1650. case ELEMENT_NODE:
  1651. if (!visibleNamespaces) visibleNamespaces = [];
  1652. var startVisibleNamespaces = visibleNamespaces.length;
  1653. var attrs = node.attributes;
  1654. var len = attrs.length;
  1655. var child = node.firstChild;
  1656. var nodeName = node.tagName;
  1657. isHTML = (htmlns === node.namespaceURI) ||isHTML
  1658. buf.push('<',nodeName);
  1659. for(var i=0;i<len;i++){
  1660. // add namespaces for attributes
  1661. var attr = attrs.item(i);
  1662. if (attr.prefix == 'xmlns') {
  1663. visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
  1664. }else if(attr.nodeName == 'xmlns'){
  1665. visibleNamespaces.push({ prefix: '', namespace: attr.value });
  1666. }
  1667. }
  1668. for(var i=0;i<len;i++){
  1669. var attr = attrs.item(i);
  1670. if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
  1671. var prefix = attr.prefix||'';
  1672. var uri = attr.namespaceURI;
  1673. var ns = prefix ? ' xmlns:' + prefix : " xmlns";
  1674. buf.push(ns, '="' , uri , '"');
  1675. visibleNamespaces.push({ prefix: prefix, namespace:uri });
  1676. }
  1677. serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
  1678. }
  1679. // add namespace for current node
  1680. if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
  1681. var prefix = node.prefix||'';
  1682. var uri = node.namespaceURI;
  1683. var ns = prefix ? ' xmlns:' + prefix : " xmlns";
  1684. buf.push(ns, '="' , uri , '"');
  1685. visibleNamespaces.push({ prefix: prefix, namespace:uri });
  1686. }
  1687. if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
  1688. buf.push('>');
  1689. //if is cdata child node
  1690. if(isHTML && /^script$/i.test(nodeName)){
  1691. while(child){
  1692. if(child.data){
  1693. buf.push(child.data);
  1694. }else{
  1695. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1696. }
  1697. child = child.nextSibling;
  1698. }
  1699. }else
  1700. {
  1701. while(child){
  1702. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1703. child = child.nextSibling;
  1704. }
  1705. }
  1706. buf.push('</',nodeName,'>');
  1707. }else{
  1708. buf.push('/>');
  1709. }
  1710. // remove added visible namespaces
  1711. //visibleNamespaces.length = startVisibleNamespaces;
  1712. return;
  1713. case DOCUMENT_NODE:
  1714. case DOCUMENT_FRAGMENT_NODE:
  1715. var child = node.firstChild;
  1716. while(child){
  1717. serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
  1718. child = child.nextSibling;
  1719. }
  1720. return;
  1721. case ATTRIBUTE_NODE:
  1722. return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
  1723. case TEXT_NODE:
  1724. return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
  1725. case CDATA_SECTION_NODE:
  1726. return buf.push( '<![CDATA[',node.data,']]>');
  1727. case COMMENT_NODE:
  1728. return buf.push( "<!--",node.data,"-->");
  1729. case DOCUMENT_TYPE_NODE:
  1730. var pubid = node.publicId;
  1731. var sysid = node.systemId;
  1732. buf.push('<!DOCTYPE ',node.name);
  1733. if(pubid){
  1734. buf.push(' PUBLIC "',pubid);
  1735. if (sysid && sysid!='.') {
  1736. buf.push( '" "',sysid);
  1737. }
  1738. buf.push('">');
  1739. }else if(sysid && sysid!='.'){
  1740. buf.push(' SYSTEM "',sysid,'">');
  1741. }else{
  1742. var sub = node.internalSubset;
  1743. if(sub){
  1744. buf.push(" [",sub,"]");
  1745. }
  1746. buf.push(">");
  1747. }
  1748. return;
  1749. case PROCESSING_INSTRUCTION_NODE:
  1750. return buf.push( "<?",node.target," ",node.data,"?>");
  1751. case ENTITY_REFERENCE_NODE:
  1752. return buf.push( '&',node.nodeName,';');
  1753. //case ENTITY_NODE:
  1754. //case NOTATION_NODE:
  1755. default:
  1756. buf.push('??',node.nodeName);
  1757. }
  1758. }
  1759. function importNode(doc,node,deep){
  1760. var node2;
  1761. switch (node.nodeType) {
  1762. case ELEMENT_NODE:
  1763. node2 = node.cloneNode(false);
  1764. node2.ownerDocument = doc;
  1765. //var attrs = node2.attributes;
  1766. //var len = attrs.length;
  1767. //for(var i=0;i<len;i++){
  1768. //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
  1769. //}
  1770. case DOCUMENT_FRAGMENT_NODE:
  1771. break;
  1772. case ATTRIBUTE_NODE:
  1773. deep = true;
  1774. break;
  1775. //case ENTITY_REFERENCE_NODE:
  1776. //case PROCESSING_INSTRUCTION_NODE:
  1777. ////case TEXT_NODE:
  1778. //case CDATA_SECTION_NODE:
  1779. //case COMMENT_NODE:
  1780. // deep = false;
  1781. // break;
  1782. //case DOCUMENT_NODE:
  1783. //case DOCUMENT_TYPE_NODE:
  1784. //cannot be imported.
  1785. //case ENTITY_NODE:
  1786. //case NOTATION_NODE:
  1787. //can not hit in level3
  1788. //default:throw e;
  1789. }
  1790. if(!node2){
  1791. node2 = node.cloneNode(false);//false
  1792. }
  1793. node2.ownerDocument = doc;
  1794. node2.parentNode = null;
  1795. if(deep){
  1796. var child = node.firstChild;
  1797. while(child){
  1798. node2.appendChild(importNode(doc,child,deep));
  1799. child = child.nextSibling;
  1800. }
  1801. }
  1802. return node2;
  1803. }
  1804. //
  1805. //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
  1806. // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
  1807. function cloneNode(doc,node,deep){
  1808. var node2 = new node.constructor();
  1809. for(var n in node){
  1810. var v = node[n];
  1811. if(typeof v != 'object' ){
  1812. if(v != node2[n]){
  1813. node2[n] = v;
  1814. }
  1815. }
  1816. }
  1817. if(node.childNodes){
  1818. node2.childNodes = new NodeList();
  1819. }
  1820. node2.ownerDocument = doc;
  1821. switch (node2.nodeType) {
  1822. case ELEMENT_NODE:
  1823. var attrs = node.attributes;
  1824. var attrs2 = node2.attributes = new NamedNodeMap();
  1825. var len = attrs.length
  1826. attrs2._ownerElement = node2;
  1827. for(var i=0;i<len;i++){
  1828. node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
  1829. }
  1830. break;;
  1831. case ATTRIBUTE_NODE:
  1832. deep = true;
  1833. }
  1834. if(deep){
  1835. var child = node.firstChild;
  1836. while(child){
  1837. node2.appendChild(cloneNode(doc,child,deep));
  1838. child = child.nextSibling;
  1839. }
  1840. }
  1841. return node2;
  1842. }
  1843. function __set__(object,key,value){
  1844. object[key] = value
  1845. }
  1846. //do dynamic
  1847. try{
  1848. if(Object.defineProperty){
  1849. Object.defineProperty(LiveNodeList.prototype,'length',{
  1850. get:function(){
  1851. _updateLiveList(this);
  1852. return this.$$length;
  1853. }
  1854. });
  1855. Object.defineProperty(Node.prototype,'textContent',{
  1856. get:function(){
  1857. return getTextContent(this);
  1858. },
  1859. set:function(data){
  1860. switch(this.nodeType){
  1861. case ELEMENT_NODE:
  1862. case DOCUMENT_FRAGMENT_NODE:
  1863. while(this.firstChild){
  1864. this.removeChild(this.firstChild);
  1865. }
  1866. if(data || String(data)){
  1867. this.appendChild(this.ownerDocument.createTextNode(data));
  1868. }
  1869. break;
  1870. default:
  1871. //TODO:
  1872. this.data = data;
  1873. this.value = data;
  1874. this.nodeValue = data;
  1875. }
  1876. }
  1877. })
  1878. function getTextContent(node){
  1879. switch(node.nodeType){
  1880. case ELEMENT_NODE:
  1881. case DOCUMENT_FRAGMENT_NODE:
  1882. var buf = [];
  1883. node = node.firstChild;
  1884. while(node){
  1885. if(node.nodeType!==7 && node.nodeType !==8){
  1886. buf.push(getTextContent(node));
  1887. }
  1888. node = node.nextSibling;
  1889. }
  1890. return buf.join('');
  1891. default:
  1892. return node.nodeValue;
  1893. }
  1894. }
  1895. __set__ = function(object,key,value){
  1896. //console.log(value)
  1897. object['$$'+key] = value
  1898. }
  1899. }
  1900. }catch(e){//ie8
  1901. }
  1902. //if(typeof require == 'function'){
  1903. exports.DOMImplementation = DOMImplementation;
  1904. exports.XMLSerializer = XMLSerializer;
  1905. //}
  1906. /***/ }),
  1907. /* 3 */
  1908. /***/ (function(module, exports) {
  1909. var initEvent = function (cos) {
  1910. var listeners = {};
  1911. var getList = function (action) {
  1912. !listeners[action] && (listeners[action] = []);
  1913. return listeners[action];
  1914. };
  1915. cos.on = function (action, callback) {
  1916. getList(action).push(callback);
  1917. };
  1918. cos.off = function (action, callback) {
  1919. var list = getList(action);
  1920. for (var i = list.length - 1; i >= 0; i--) {
  1921. callback === list[i] && list.splice(i, 1);
  1922. }
  1923. };
  1924. cos.emit = function (action, data) {
  1925. var list = getList(action).map(function (cb) {
  1926. return cb;
  1927. });
  1928. for (var i = 0; i < list.length; i++) {
  1929. list[i](data);
  1930. }
  1931. };
  1932. };
  1933. var EventProxy = function () {
  1934. initEvent(this);
  1935. };
  1936. module.exports.init = initEvent;
  1937. module.exports.EventProxy = EventProxy;
  1938. /***/ }),
  1939. /* 4 */
  1940. /***/ (function(module, exports, __webpack_require__) {
  1941. var util = __webpack_require__(0);
  1942. var event = __webpack_require__(3);
  1943. var task = __webpack_require__(16);
  1944. var base = __webpack_require__(15);
  1945. var advance = __webpack_require__(13);
  1946. var defaultOptions = {
  1947. SecretId: '',
  1948. SecretKey: '',
  1949. XCosSecurityToken: '', // 使用临时密钥需要注意自行刷新 Token
  1950. ChunkRetryTimes: 2,
  1951. FileParallelLimit: 3,
  1952. ChunkParallelLimit: 3,
  1953. ChunkRetryTimes: 3,
  1954. ChunkSize: 1024 * 1024,
  1955. SliceSize: 1024 * 1024,
  1956. CopyChunkParallelLimit: 20,
  1957. CopyChunkSize: 1024 * 1024 * 10,
  1958. CopySliceSize: 1024 * 1024 * 10,
  1959. MaxPartNumber: 10000,
  1960. ProgressInterval: 1000,
  1961. UploadQueueSize: 10000,
  1962. Domain: '',
  1963. ServiceDomain: '',
  1964. Protocol: '',
  1965. CompatibilityMode: false,
  1966. ForcePathStyle: false,
  1967. CorrectClockSkew: true,
  1968. SystemClockOffset: 0, // 单位毫秒,ms
  1969. };
  1970. // 对外暴露的类
  1971. var COS = function (options) {
  1972. this.options = util.extend(util.clone(defaultOptions), options || {});
  1973. this.options.FileParallelLimit = Math.max(1, this.options.FileParallelLimit);
  1974. this.options.ChunkParallelLimit = Math.max(1, this.options.ChunkParallelLimit);
  1975. this.options.ChunkRetryTimes = Math.max(0, this.options.ChunkRetryTimes);
  1976. this.options.ChunkSize = Math.max(1024 * 1024, this.options.ChunkSize);
  1977. this.options.CopyChunkParallelLimit = Math.max(1, this.options.CopyChunkParallelLimit);
  1978. this.options.CopyChunkSize = Math.max(1024 * 1024, this.options.CopyChunkSize);
  1979. this.options.CopySliceSize = Math.max(0, this.options.CopySliceSize);
  1980. this.options.MaxPartNumber = Math.max(1024, Math.min(10000, this.options.MaxPartNumber));
  1981. this.options.Timeout = Math.max(0, this.options.Timeout);
  1982. if (this.options.AppId) {
  1983. console.warn('warning: AppId has been deprecated, Please put it at the end of parameter Bucket(E.g: "test-1250000000").');
  1984. }
  1985. event.init(this);
  1986. task.init(this);
  1987. };
  1988. base.init(COS, task);
  1989. advance.init(COS, task);
  1990. COS.getAuthorization = util.getAuth;
  1991. COS.version = '0.7.10';
  1992. module.exports = COS;
  1993. /***/ }),
  1994. /* 5 */
  1995. /***/ (function(module, exports, __webpack_require__) {
  1996. var COS = __webpack_require__(4);
  1997. module.exports = COS;
  1998. /***/ }),
  1999. /* 6 */
  2000. /***/ (function(module, exports) {
  2001. /*
  2002. CryptoJS v3.1.2
  2003. code.google.com/p/crypto-js
  2004. (c) 2009-2013 by Jeff Mott. All rights reserved.
  2005. code.google.com/p/crypto-js/wiki/License
  2006. */
  2007. var CryptoJS=CryptoJS||function(g,l){var e={},d=e.lib={},m=function(){},k=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
  2008. p=d.WordArray=k.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var c=this.words,q=a.words,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},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
  2009. 32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new p.init(c,a)}}),b=e.enc={},n=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f,
  2010. 2),16)<<24-4*(f%8);return new p.init(b,c/2)}},j=b.Latin1={stringify:function(a){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("")},parse:function(a){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)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(j.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return j.parse(unescape(encodeURIComponent(a)))}},
  2011. r=d.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,f=c.sigBytes,d=this.blockSize,e=f/(4*d),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*d;f=g.min(4*a,f);if(a){for(var k=0;k<a;k+=d)this._doProcessBlock(b,k);k=b.splice(0,a);c.sigBytes-=f}return new p.init(k,f)},clone:function(){var a=k.clone.call(this);
  2012. a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=r.extend({cfg:k.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new s.HMAC.init(a,
  2013. d)).finalize(b)}}});var s=e.algo={};return e}(Math);
  2014. (function(){var g=CryptoJS,l=g.lib,e=l.WordArray,d=l.Hasher,m=[],l=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){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++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}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^
  2015. g)-899497514);l=g;g=h;h=j<<30|j>>>2;j=n;n=c}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},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,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},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(l);g.HmacSHA1=d._createHmacHelper(l)})();
  2016. (function(){var g=CryptoJS,l=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=l.parse(d));var g=e.blockSize,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()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d=
  2017. this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})();
  2018. (function () {
  2019. // Shortcuts
  2020. var C = CryptoJS;
  2021. var C_lib = C.lib;
  2022. var WordArray = C_lib.WordArray;
  2023. var C_enc = C.enc;
  2024. /**
  2025. * Base64 encoding strategy.
  2026. */
  2027. var Base64 = C_enc.Base64 = {
  2028. /**
  2029. * Converts a word array to a Base64 string.
  2030. *
  2031. * @param {WordArray} wordArray The word array.
  2032. *
  2033. * @return {string} The Base64 string.
  2034. *
  2035. * @static
  2036. *
  2037. * @example
  2038. *
  2039. * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  2040. */
  2041. stringify: function (wordArray) {
  2042. // Shortcuts
  2043. var words = wordArray.words;
  2044. var sigBytes = wordArray.sigBytes;
  2045. var map = this._map;
  2046. // Clamp excess bits
  2047. wordArray.clamp();
  2048. // Convert
  2049. var base64Chars = [];
  2050. for (var i = 0; i < sigBytes; i += 3) {
  2051. var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  2052. var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  2053. var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  2054. var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  2055. for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  2056. base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  2057. }
  2058. }
  2059. // Add padding
  2060. var paddingChar = map.charAt(64);
  2061. if (paddingChar) {
  2062. while (base64Chars.length % 4) {
  2063. base64Chars.push(paddingChar);
  2064. }
  2065. }
  2066. return base64Chars.join('');
  2067. },
  2068. /**
  2069. * Converts a Base64 string to a word array.
  2070. *
  2071. * @param {string} base64Str The Base64 string.
  2072. *
  2073. * @return {WordArray} The word array.
  2074. *
  2075. * @static
  2076. *
  2077. * @example
  2078. *
  2079. * var wordArray = CryptoJS.enc.Base64.parse(base64String);
  2080. */
  2081. parse: function (base64Str) {
  2082. // Shortcuts
  2083. var base64StrLength = base64Str.length;
  2084. var map = this._map;
  2085. // Ignore padding
  2086. var paddingChar = map.charAt(64);
  2087. if (paddingChar) {
  2088. var paddingIndex = base64Str.indexOf(paddingChar);
  2089. if (paddingIndex != -1) {
  2090. base64StrLength = paddingIndex;
  2091. }
  2092. }
  2093. // Convert
  2094. var words = [];
  2095. var nBytes = 0;
  2096. for (var i = 0; i < base64StrLength; i++) {
  2097. if (i % 4) {
  2098. var bits1 = map.indexOf(base64Str.charAt(i - 1)) << ((i % 4) * 2);
  2099. var bits2 = map.indexOf(base64Str.charAt(i)) >>> (6 - (i % 4) * 2);
  2100. words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
  2101. nBytes++;
  2102. }
  2103. }
  2104. return WordArray.create(words, nBytes);
  2105. },
  2106. _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  2107. };
  2108. }());
  2109. module.exports = CryptoJS;
  2110. /***/ }),
  2111. /* 7 */
  2112. /***/ (function(module, exports) {
  2113. //copyright Ryan Day 2010 <http://ryanday.org>, Joscha Feth 2013 <http://www.feth.com> [MIT Licensed]
  2114. var element_start_char =
  2115. "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";
  2116. var element_non_start_char = "\-.0-9\u00B7\u0300-\u036F\u203F\u2040";
  2117. var element_replace = new RegExp("^([^" + element_start_char + "])|^((x|X)(m|M)(l|L))|([^" + element_start_char + element_non_start_char + "])", "g");
  2118. var not_safe_in_xml = /[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm;
  2119. var objKeys = function (obj) {
  2120. var l = [];
  2121. if (obj instanceof Object) {
  2122. for (var k in obj) {
  2123. if (obj.hasOwnProperty(k)) {
  2124. l.push(k);
  2125. }
  2126. }
  2127. }
  2128. return l;
  2129. };
  2130. var process_to_xml = function (node_data, options) {
  2131. var makeNode = function (name, content, attributes, level, hasSubNodes) {
  2132. var indent_value = options.indent !== undefined ? options.indent : "\t";
  2133. var indent = options.prettyPrint ? '\n' + new Array(level).join(indent_value) : '';
  2134. if (options.removeIllegalNameCharacters) {
  2135. name = name.replace(element_replace, '_');
  2136. }
  2137. var node = [indent, '<', name, (attributes || '')];
  2138. if (content && content.length > 0) {
  2139. node.push('>')
  2140. node.push(content);
  2141. hasSubNodes && node.push(indent);
  2142. node.push('</');
  2143. node.push(name);
  2144. node.push('>');
  2145. } else {
  2146. node.push('/>');
  2147. }
  2148. return node.join('');
  2149. };
  2150. return (function fn(node_data, node_descriptor, level) {
  2151. var type = typeof node_data;
  2152. if ((Array.isArray) ? Array.isArray(node_data) : node_data instanceof Array) {
  2153. type = 'array';
  2154. } else if (node_data instanceof Date) {
  2155. type = 'date';
  2156. }
  2157. switch (type) {
  2158. //if value is an array create child nodes from values
  2159. case 'array':
  2160. var ret = [];
  2161. node_data.map(function (v) {
  2162. ret.push(fn(v, 1, level + 1));
  2163. //entries that are values of an array are the only ones that can be special node descriptors
  2164. });
  2165. options.prettyPrint && ret.push('\n');
  2166. return ret.join('');
  2167. break;
  2168. case 'date':
  2169. // cast dates to ISO 8601 date (soap likes it)
  2170. return node_data.toJSON ? node_data.toJSON() : node_data + '';
  2171. break;
  2172. case 'object':
  2173. var nodes = [];
  2174. for (var name in node_data) {
  2175. if (node_data[name] instanceof Array) {
  2176. for (var j in node_data[name]) {
  2177. nodes.push(makeNode(name, fn(node_data[name][j], 0, level + 1), null, level + 1, objKeys(node_data[name][j]).length));
  2178. }
  2179. } else {
  2180. nodes.push(makeNode(name, fn(node_data[name], 0, level + 1), null, level + 1));
  2181. }
  2182. }
  2183. options.prettyPrint && nodes.length > 0 && nodes.push('\n');
  2184. return nodes.join('');
  2185. break;
  2186. case 'function':
  2187. return node_data();
  2188. break;
  2189. default:
  2190. return options.escape ? esc(node_data) : '' + node_data;
  2191. }
  2192. }(node_data, 0, 0))
  2193. };
  2194. var xml_header = function (standalone) {
  2195. var ret = ['<?xml version="1.0" encoding="UTF-8"'];
  2196. if (standalone) {
  2197. ret.push(' standalone="yes"');
  2198. }
  2199. ret.push('?>');
  2200. return ret.join('');
  2201. };
  2202. function esc(str) {
  2203. return ('' + str).replace(/&/g, '&amp;')
  2204. .replace(/</g, '&lt;')
  2205. .replace(/>/g, '&gt;')
  2206. .replace(/'/g, '&apos;')
  2207. .replace(/"/g, '&quot;')
  2208. .replace(not_safe_in_xml, '');
  2209. }
  2210. var json2xml = function (obj, options) {
  2211. if (!options) {
  2212. options = {
  2213. xmlHeader: {
  2214. standalone: true
  2215. },
  2216. prettyPrint: true,
  2217. indent: " "
  2218. };
  2219. }
  2220. if (typeof obj == 'string') {
  2221. try {
  2222. obj = JSON.parse(obj.toString());
  2223. } catch (e) {
  2224. return false;
  2225. }
  2226. }
  2227. var xmlheader = '';
  2228. var docType = '';
  2229. if (options) {
  2230. if (typeof options == 'object') {
  2231. // our config is an object
  2232. if (options.xmlHeader) {
  2233. // the user wants an xml header
  2234. xmlheader = xml_header(!!options.xmlHeader.standalone);
  2235. }
  2236. if (typeof options.docType != 'undefined') {
  2237. docType = '<!DOCTYPE ' + options.docType + '>'
  2238. }
  2239. } else {
  2240. // our config is a boolean value, so just add xml header
  2241. xmlheader = xml_header();
  2242. }
  2243. }
  2244. options = options || {}
  2245. var ret = [
  2246. xmlheader,
  2247. (options.prettyPrint && docType ? '\n' : ''),
  2248. docType,
  2249. process_to_xml(obj, options)
  2250. ];
  2251. return ret.join('').replace(/\n{2,}/g, '\n').replace(/\s+$/g, '');
  2252. };
  2253. module.exports = json2xml;
  2254. /***/ }),
  2255. /* 8 */
  2256. /***/ (function(module, exports) {
  2257. /**
  2258. *
  2259. * MD5 (Message-Digest Algorithm)
  2260. * http://www.webtoolkit.info/
  2261. *
  2262. **/
  2263. var md5 = function (string) {
  2264. function RotateLeft(lValue, iShiftBits) {
  2265. return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
  2266. }
  2267. function AddUnsigned(lX,lY) {
  2268. var lX4,lY4,lX8,lY8,lResult;
  2269. lX8 = (lX & 0x80000000);
  2270. lY8 = (lY & 0x80000000);
  2271. lX4 = (lX & 0x40000000);
  2272. lY4 = (lY & 0x40000000);
  2273. lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
  2274. if (lX4 & lY4) {
  2275. return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
  2276. }
  2277. if (lX4 | lY4) {
  2278. if (lResult & 0x40000000) {
  2279. return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
  2280. } else {
  2281. return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
  2282. }
  2283. } else {
  2284. return (lResult ^ lX8 ^ lY8);
  2285. }
  2286. }
  2287. function F(x,y,z) { return (x & y) | ((~x) & z); }
  2288. function G(x,y,z) { return (x & z) | (y & (~z)); }
  2289. function H(x,y,z) { return (x ^ y ^ z); }
  2290. function I(x,y,z) { return (y ^ (x | (~z))); }
  2291. function FF(a,b,c,d,x,s,ac) {
  2292. a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
  2293. return AddUnsigned(RotateLeft(a, s), b);
  2294. };
  2295. function GG(a,b,c,d,x,s,ac) {
  2296. a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
  2297. return AddUnsigned(RotateLeft(a, s), b);
  2298. };
  2299. function HH(a,b,c,d,x,s,ac) {
  2300. a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
  2301. return AddUnsigned(RotateLeft(a, s), b);
  2302. };
  2303. function II(a,b,c,d,x,s,ac) {
  2304. a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
  2305. return AddUnsigned(RotateLeft(a, s), b);
  2306. };
  2307. function ConvertToWordArray(string) {
  2308. var lWordCount;
  2309. var lMessageLength = string.length;
  2310. var lNumberOfWords_temp1=lMessageLength + 8;
  2311. var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
  2312. var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
  2313. var lWordArray=Array(lNumberOfWords-1);
  2314. var lBytePosition = 0;
  2315. var lByteCount = 0;
  2316. while ( lByteCount < lMessageLength ) {
  2317. lWordCount = (lByteCount-(lByteCount % 4))/4;
  2318. lBytePosition = (lByteCount % 4)*8;
  2319. lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
  2320. lByteCount++;
  2321. }
  2322. lWordCount = (lByteCount-(lByteCount % 4))/4;
  2323. lBytePosition = (lByteCount % 4)*8;
  2324. lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
  2325. lWordArray[lNumberOfWords-2] = lMessageLength<<3;
  2326. lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
  2327. return lWordArray;
  2328. };
  2329. function WordToHex(lValue) {
  2330. var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
  2331. for (lCount = 0;lCount<=3;lCount++) {
  2332. lByte = (lValue>>>(lCount*8)) & 255;
  2333. WordToHexValue_temp = "0" + lByte.toString(16);
  2334. WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
  2335. }
  2336. return WordToHexValue;
  2337. };
  2338. function Utf8Encode(string) {
  2339. string = string.replace(/\r\n/g,"\n");
  2340. var utftext = "";
  2341. for (var n = 0; n < string.length; n++) {
  2342. var c = string.charCodeAt(n);
  2343. if (c < 128) {
  2344. utftext += String.fromCharCode(c);
  2345. }
  2346. else if((c > 127) && (c < 2048)) {
  2347. utftext += String.fromCharCode((c >> 6) | 192);
  2348. utftext += String.fromCharCode((c & 63) | 128);
  2349. }
  2350. else {
  2351. utftext += String.fromCharCode((c >> 12) | 224);
  2352. utftext += String.fromCharCode(((c >> 6) & 63) | 128);
  2353. utftext += String.fromCharCode((c & 63) | 128);
  2354. }
  2355. }
  2356. return utftext;
  2357. };
  2358. var x=Array();
  2359. var k,AA,BB,CC,DD,a,b,c,d;
  2360. var S11=7, S12=12, S13=17, S14=22;
  2361. var S21=5, S22=9 , S23=14, S24=20;
  2362. var S31=4, S32=11, S33=16, S34=23;
  2363. var S41=6, S42=10, S43=15, S44=21;
  2364. string = Utf8Encode(string);
  2365. x = ConvertToWordArray(string);
  2366. a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
  2367. for (k=0;k<x.length;k+=16) {
  2368. AA=a; BB=b; CC=c; DD=d;
  2369. a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
  2370. d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
  2371. c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
  2372. b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
  2373. a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
  2374. d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
  2375. c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
  2376. b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
  2377. a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
  2378. d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
  2379. c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
  2380. b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
  2381. a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
  2382. d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
  2383. c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
  2384. b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
  2385. a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
  2386. d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
  2387. c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
  2388. b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
  2389. a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
  2390. d=GG(d,a,b,c,x[k+10],S22,0x2441453);
  2391. c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
  2392. b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
  2393. a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
  2394. d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
  2395. c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
  2396. b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
  2397. a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
  2398. d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
  2399. c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
  2400. b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
  2401. a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
  2402. d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
  2403. c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
  2404. b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
  2405. a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
  2406. d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
  2407. c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
  2408. b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
  2409. a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
  2410. d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
  2411. c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
  2412. b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
  2413. a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
  2414. d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
  2415. c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
  2416. b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
  2417. a=II(a,b,c,d,x[k+0], S41,0xF4292244);
  2418. d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
  2419. c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
  2420. b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
  2421. a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
  2422. d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
  2423. c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
  2424. b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
  2425. a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
  2426. d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
  2427. c=II(c,d,a,b,x[k+6], S43,0xA3014314);
  2428. b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
  2429. a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
  2430. d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
  2431. c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
  2432. b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
  2433. a=AddUnsigned(a,AA);
  2434. b=AddUnsigned(b,BB);
  2435. c=AddUnsigned(c,CC);
  2436. d=AddUnsigned(d,DD);
  2437. }
  2438. var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
  2439. return temp.toLowerCase();
  2440. }
  2441. module.exports = md5;
  2442. /***/ }),
  2443. /* 9 */
  2444. /***/ (function(module, exports) {
  2445. var obj2str = function (obj) {
  2446. var i, key, val;
  2447. var list = [];
  2448. var keyList = Object.keys(obj);
  2449. for (i = 0; i < keyList.length; i++) {
  2450. key = keyList[i];
  2451. val = obj[key] || '';
  2452. list.push(key + '=' + encodeURIComponent(val));
  2453. }
  2454. return list.join('&');
  2455. };
  2456. var request = function (params, callback) {
  2457. var filePath = params.filePath;
  2458. var headers = params.headers || {};
  2459. var url = params.url;
  2460. var method = params.method;
  2461. var onProgress = params.onProgress;
  2462. var requestTask;
  2463. var cb = function (err, response) {
  2464. callback(err, {statusCode: response.statusCode, headers: response.header}, response.data);
  2465. };
  2466. if (filePath) {
  2467. var fileKey;
  2468. var m = url.match(/^(https?:\/\/[^/]+\/)([^/]*\/?)(.*)$/);
  2469. if (params.pathStyle) {
  2470. fileKey = decodeURIComponent(m[3] || '');
  2471. url = m[1] + m[2];
  2472. } else {
  2473. fileKey = decodeURIComponent(m[2] + m[3] || '');
  2474. url = m[1];
  2475. }
  2476. // 整理 postObject 参数
  2477. var formData = {
  2478. 'key': fileKey,
  2479. 'success_action_status': 200,
  2480. 'Signature': headers.Authorization,
  2481. };
  2482. var headerKeys = [
  2483. 'Cache-Control',
  2484. 'Content-Type',
  2485. 'Content-Disposition',
  2486. 'Content-Encoding',
  2487. 'Expires',
  2488. 'x-cos-storage-class',
  2489. 'x-cos-security-token',
  2490. ];
  2491. for (var i in params.headers) {
  2492. if (params.headers.hasOwnProperty(i) && (i.indexOf('x-cos-meta-') > -1 || headerKeys.indexOf(i) > -1)) {
  2493. formData[i] = params.headers[i];
  2494. }
  2495. }
  2496. headers['x-cos-acl'] && (formData.acl = headers['x-cos-acl']);
  2497. !formData['Content-Type'] && (formData['Content-Type'] = '');
  2498. var responseHeader = {};
  2499. requestTask = wx.uploadFile({
  2500. url: url,
  2501. method: method,
  2502. name: 'file',
  2503. filePath: filePath,
  2504. formData: formData,
  2505. success: function (response) {
  2506. !response.header && (response.header = responseHeader);
  2507. cb(null, response);
  2508. },
  2509. fail: function (response) {
  2510. cb(response.errMsg, response);
  2511. }
  2512. });
  2513. requestTask.onHeadersReceived && requestTask.onHeadersReceived(function(res){
  2514. responseHeader = res.header;
  2515. });
  2516. requestTask.onProgressUpdate(function (res) {
  2517. onProgress({
  2518. loaded: res.totalBytesSent,
  2519. total: res.totalBytesExpectedToSend,
  2520. progress: res.progress / 100
  2521. });
  2522. });
  2523. } else {
  2524. var qsStr = params.qs && obj2str(params.qs) || '';
  2525. if (qsStr) {
  2526. url += (url.indexOf('?') > -1 ? '&' : '?') + qsStr;
  2527. }
  2528. headers['Content-Length'] && (delete headers['Content-Length']);
  2529. wx.request({
  2530. url: url,
  2531. method: method,
  2532. header: headers,
  2533. dataType: 'text',
  2534. data: params.body,
  2535. success: function (response) {
  2536. cb(null, response);
  2537. },
  2538. fail: function (response) {
  2539. cb(response.errMsg, response);
  2540. }
  2541. });
  2542. }
  2543. return requestTask;
  2544. };
  2545. module.exports = request;
  2546. /***/ }),
  2547. /* 10 */
  2548. /***/ (function(module, exports, __webpack_require__) {
  2549. /*
  2550. Copyright 2011-2013 Abdulla Abdurakhmanov
  2551. Original sources are available at https://code.google.com/p/x2js/
  2552. Licensed under the Apache License, Version 2.0 (the "License");
  2553. you may not use this file except in compliance with the License.
  2554. You may obtain a copy of the License at
  2555. http://www.apache.org/licenses/LICENSE-2.0
  2556. Unless required by applicable law or agreed to in writing, software
  2557. distributed under the License is distributed on an "AS IS" BASIS,
  2558. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  2559. See the License for the specific language governing permissions and
  2560. limitations under the License.
  2561. */
  2562. var DOMParser = __webpack_require__(11).DOMParser;
  2563. var x2js = function (config) {
  2564. var VERSION = "1.2.0";
  2565. config = config || {};
  2566. initConfigDefaults();
  2567. initRequiredPolyfills();
  2568. function initConfigDefaults() {
  2569. if(config.escapeMode === undefined) {
  2570. config.escapeMode = true;
  2571. }
  2572. config.attributePrefix = config.attributePrefix || "_";
  2573. config.arrayAccessForm = config.arrayAccessForm || "none";
  2574. config.emptyNodeForm = config.emptyNodeForm || "text";
  2575. if(config.enableToStringFunc === undefined) {
  2576. config.enableToStringFunc = true;
  2577. }
  2578. config.arrayAccessFormPaths = config.arrayAccessFormPaths || [];
  2579. if(config.skipEmptyTextNodesForObj === undefined) {
  2580. config.skipEmptyTextNodesForObj = true;
  2581. }
  2582. if(config.stripWhitespaces === undefined) {
  2583. config.stripWhitespaces = true;
  2584. }
  2585. config.datetimeAccessFormPaths = config.datetimeAccessFormPaths || [];
  2586. if(config.useDoubleQuotes === undefined) {
  2587. config.useDoubleQuotes = false;
  2588. }
  2589. config.xmlElementsFilter = config.xmlElementsFilter || [];
  2590. config.jsonPropertiesFilter = config.jsonPropertiesFilter || [];
  2591. if(config.keepCData === undefined) {
  2592. config.keepCData = false;
  2593. }
  2594. }
  2595. var DOMNodeTypes = {
  2596. ELEMENT_NODE : 1,
  2597. TEXT_NODE : 3,
  2598. CDATA_SECTION_NODE : 4,
  2599. COMMENT_NODE : 8,
  2600. DOCUMENT_NODE : 9
  2601. };
  2602. function initRequiredPolyfills() {
  2603. }
  2604. function getNodeLocalName( node ) {
  2605. var nodeLocalName = node.localName;
  2606. if(nodeLocalName == null) // Yeah, this is IE!!
  2607. nodeLocalName = node.baseName;
  2608. if(nodeLocalName == null || nodeLocalName=="") // =="" is IE too
  2609. nodeLocalName = node.nodeName;
  2610. return nodeLocalName;
  2611. }
  2612. function getNodePrefix(node) {
  2613. return node.prefix;
  2614. }
  2615. function escapeXmlChars(str) {
  2616. if(typeof(str) == "string")
  2617. return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;');
  2618. else
  2619. return str;
  2620. }
  2621. function unescapeXmlChars(str) {
  2622. return str.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&amp;/g, '&');
  2623. }
  2624. function checkInStdFiltersArrayForm(stdFiltersArrayForm, obj, name, path) {
  2625. var idx = 0;
  2626. for(; idx < stdFiltersArrayForm.length; idx++) {
  2627. var filterPath = stdFiltersArrayForm[idx];
  2628. if( typeof filterPath === "string" ) {
  2629. if(filterPath == path)
  2630. break;
  2631. }
  2632. else
  2633. if( filterPath instanceof RegExp) {
  2634. if(filterPath.test(path))
  2635. break;
  2636. }
  2637. else
  2638. if( typeof filterPath === "function") {
  2639. if(filterPath(obj, name, path))
  2640. break;
  2641. }
  2642. }
  2643. return idx!=stdFiltersArrayForm.length;
  2644. }
  2645. function toArrayAccessForm(obj, childName, path) {
  2646. switch(config.arrayAccessForm) {
  2647. case "property":
  2648. if(!(obj[childName] instanceof Array))
  2649. obj[childName+"_asArray"] = [obj[childName]];
  2650. else
  2651. obj[childName+"_asArray"] = obj[childName];
  2652. break;
  2653. /*case "none":
  2654. break;*/
  2655. }
  2656. if(!(obj[childName] instanceof Array) && config.arrayAccessFormPaths.length > 0) {
  2657. if(checkInStdFiltersArrayForm(config.arrayAccessFormPaths, obj, childName, path)) {
  2658. obj[childName] = [obj[childName]];
  2659. }
  2660. }
  2661. }
  2662. function fromXmlDateTime(prop) {
  2663. // Implementation based up on http://stackoverflow.com/questions/8178598/xml-datetime-to-javascript-date-object
  2664. // Improved to support full spec and optional parts
  2665. var bits = prop.split(/[-T:+Z]/g);
  2666. var d = new Date(bits[0], bits[1]-1, bits[2]);
  2667. var secondBits = bits[5].split("\.");
  2668. d.setHours(bits[3], bits[4], secondBits[0]);
  2669. if(secondBits.length>1)
  2670. d.setMilliseconds(secondBits[1]);
  2671. // Get supplied time zone offset in minutes
  2672. if(bits[6] && bits[7]) {
  2673. var offsetMinutes = bits[6] * 60 + Number(bits[7]);
  2674. var sign = /\d\d-\d\d:\d\d$/.test(prop)? '-' : '+';
  2675. // Apply the sign
  2676. offsetMinutes = 0 + (sign == '-'? -1 * offsetMinutes : offsetMinutes);
  2677. // Apply offset and local timezone
  2678. d.setMinutes(d.getMinutes() - offsetMinutes - d.getTimezoneOffset())
  2679. }
  2680. else
  2681. if(prop.indexOf("Z", prop.length - 1) !== -1) {
  2682. d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()));
  2683. }
  2684. // d is now a local time equivalent to the supplied time
  2685. return d;
  2686. }
  2687. function checkFromXmlDateTimePaths(value, childName, fullPath) {
  2688. if(config.datetimeAccessFormPaths.length > 0) {
  2689. var path = fullPath.split("\.#")[0];
  2690. if(checkInStdFiltersArrayForm(config.datetimeAccessFormPaths, value, childName, path)) {
  2691. return fromXmlDateTime(value);
  2692. }
  2693. else
  2694. return value;
  2695. }
  2696. else
  2697. return value;
  2698. }
  2699. function checkXmlElementsFilter(obj, childType, childName, childPath) {
  2700. if( childType == DOMNodeTypes.ELEMENT_NODE && config.xmlElementsFilter.length > 0) {
  2701. return checkInStdFiltersArrayForm(config.xmlElementsFilter, obj, childName, childPath);
  2702. }
  2703. else
  2704. return true;
  2705. }
  2706. function parseDOMChildren( node, path ) {
  2707. if(node.nodeType == DOMNodeTypes.DOCUMENT_NODE) {
  2708. var result = new Object;
  2709. var nodeChildren = node.childNodes;
  2710. // Alternative for firstElementChild which is not supported in some environments
  2711. for(var cidx=0; cidx <nodeChildren.length; cidx++) {
  2712. var child = nodeChildren.item(cidx);
  2713. if(child.nodeType == DOMNodeTypes.ELEMENT_NODE) {
  2714. var childName = getNodeLocalName(child);
  2715. result[childName] = parseDOMChildren(child, childName);
  2716. }
  2717. }
  2718. return result;
  2719. }
  2720. else
  2721. if(node.nodeType == DOMNodeTypes.ELEMENT_NODE) {
  2722. var result = new Object;
  2723. result.__cnt=0;
  2724. var nodeChildren = node.childNodes;
  2725. // Children nodes
  2726. for(var cidx=0; cidx <nodeChildren.length; cidx++) {
  2727. var child = nodeChildren.item(cidx); // nodeChildren[cidx];
  2728. var childName = getNodeLocalName(child);
  2729. if(child.nodeType!= DOMNodeTypes.COMMENT_NODE) {
  2730. var childPath = path+"."+childName;
  2731. if (checkXmlElementsFilter(result,child.nodeType,childName,childPath)) {
  2732. result.__cnt++;
  2733. if(result[childName] == null) {
  2734. result[childName] = parseDOMChildren(child, childPath);
  2735. toArrayAccessForm(result, childName, childPath);
  2736. }
  2737. else {
  2738. if(result[childName] != null) {
  2739. if( !(result[childName] instanceof Array)) {
  2740. result[childName] = [result[childName]];
  2741. toArrayAccessForm(result, childName, childPath);
  2742. }
  2743. }
  2744. (result[childName])[result[childName].length] = parseDOMChildren(child, childPath);
  2745. }
  2746. }
  2747. }
  2748. }
  2749. // Attributes
  2750. for(var aidx=0; aidx <node.attributes.length; aidx++) {
  2751. var attr = node.attributes.item(aidx); // [aidx];
  2752. result.__cnt++;
  2753. result[config.attributePrefix+attr.name]=attr.value;
  2754. }
  2755. // Node namespace prefix
  2756. var nodePrefix = getNodePrefix(node);
  2757. if(nodePrefix!=null && nodePrefix!="") {
  2758. result.__cnt++;
  2759. result.__prefix=nodePrefix;
  2760. }
  2761. if(result["#text"]!=null) {
  2762. result.__text = result["#text"];
  2763. if(result.__text instanceof Array) {
  2764. result.__text = result.__text.join("\n");
  2765. }
  2766. //if(config.escapeMode)
  2767. // result.__text = unescapeXmlChars(result.__text);
  2768. if(config.stripWhitespaces)
  2769. result.__text = result.__text.trim();
  2770. delete result["#text"];
  2771. if(config.arrayAccessForm=="property")
  2772. delete result["#text_asArray"];
  2773. result.__text = checkFromXmlDateTimePaths(result.__text, childName, path+"."+childName);
  2774. }
  2775. if(result["#cdata-section"]!=null) {
  2776. result.__cdata = result["#cdata-section"];
  2777. delete result["#cdata-section"];
  2778. if(config.arrayAccessForm=="property")
  2779. delete result["#cdata-section_asArray"];
  2780. }
  2781. if( result.__cnt == 0 && config.emptyNodeForm=="text" ) {
  2782. result = '';
  2783. }
  2784. else
  2785. if( result.__cnt == 1 && result.__text!=null ) {
  2786. result = result.__text;
  2787. }
  2788. else
  2789. if( result.__cnt == 1 && result.__cdata!=null && !config.keepCData ) {
  2790. result = result.__cdata;
  2791. }
  2792. else
  2793. if ( result.__cnt > 1 && result.__text!=null && config.skipEmptyTextNodesForObj) {
  2794. if( (config.stripWhitespaces && result.__text=="") || (result.__text.trim()=="")) {
  2795. delete result.__text;
  2796. }
  2797. }
  2798. delete result.__cnt;
  2799. if( config.enableToStringFunc && (result.__text!=null || result.__cdata!=null )) {
  2800. result.toString = function() {
  2801. return (this.__text!=null? this.__text:'')+( this.__cdata!=null ? this.__cdata:'');
  2802. };
  2803. }
  2804. return result;
  2805. }
  2806. else
  2807. if(node.nodeType == DOMNodeTypes.TEXT_NODE || node.nodeType == DOMNodeTypes.CDATA_SECTION_NODE) {
  2808. return node.nodeValue;
  2809. }
  2810. }
  2811. function startTag(jsonObj, element, attrList, closed) {
  2812. var resultStr = "<"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+":"):"") + element;
  2813. if(attrList!=null) {
  2814. for(var aidx = 0; aidx < attrList.length; aidx++) {
  2815. var attrName = attrList[aidx];
  2816. var attrVal = jsonObj[attrName];
  2817. if(config.escapeMode)
  2818. attrVal=escapeXmlChars(attrVal);
  2819. resultStr+=" "+attrName.substr(config.attributePrefix.length)+"=";
  2820. if(config.useDoubleQuotes)
  2821. resultStr+='"'+attrVal+'"';
  2822. else
  2823. resultStr+="'"+attrVal+"'";
  2824. }
  2825. }
  2826. if(!closed)
  2827. resultStr+=">";
  2828. else
  2829. resultStr+="/>";
  2830. return resultStr;
  2831. }
  2832. function endTag(jsonObj,elementName) {
  2833. return "</"+ (jsonObj.__prefix!=null? (jsonObj.__prefix+":"):"")+elementName+">";
  2834. }
  2835. function endsWith(str, suffix) {
  2836. return str.indexOf(suffix, str.length - suffix.length) !== -1;
  2837. }
  2838. function jsonXmlSpecialElem ( jsonObj, jsonObjField ) {
  2839. if((config.arrayAccessForm=="property" && endsWith(jsonObjField.toString(),("_asArray")))
  2840. || jsonObjField.toString().indexOf(config.attributePrefix)==0
  2841. || jsonObjField.toString().indexOf("__")==0
  2842. || (jsonObj[jsonObjField] instanceof Function) )
  2843. return true;
  2844. else
  2845. return false;
  2846. }
  2847. function jsonXmlElemCount ( jsonObj ) {
  2848. var elementsCnt = 0;
  2849. if(jsonObj instanceof Object ) {
  2850. for( var it in jsonObj ) {
  2851. if(jsonXmlSpecialElem ( jsonObj, it) )
  2852. continue;
  2853. elementsCnt++;
  2854. }
  2855. }
  2856. return elementsCnt;
  2857. }
  2858. function checkJsonObjPropertiesFilter(jsonObj, propertyName, jsonObjPath) {
  2859. return config.jsonPropertiesFilter.length == 0
  2860. || jsonObjPath==""
  2861. || checkInStdFiltersArrayForm(config.jsonPropertiesFilter, jsonObj, propertyName, jsonObjPath);
  2862. }
  2863. function parseJSONAttributes ( jsonObj ) {
  2864. var attrList = [];
  2865. if(jsonObj instanceof Object ) {
  2866. for( var ait in jsonObj ) {
  2867. if(ait.toString().indexOf("__")== -1 && ait.toString().indexOf(config.attributePrefix)==0) {
  2868. attrList.push(ait);
  2869. }
  2870. }
  2871. }
  2872. return attrList;
  2873. }
  2874. function parseJSONTextAttrs ( jsonTxtObj ) {
  2875. var result ="";
  2876. if(jsonTxtObj.__cdata!=null) {
  2877. result+="<![CDATA["+jsonTxtObj.__cdata+"]]>";
  2878. }
  2879. if(jsonTxtObj.__text!=null) {
  2880. if(config.escapeMode)
  2881. result+=escapeXmlChars(jsonTxtObj.__text);
  2882. else
  2883. result+=jsonTxtObj.__text;
  2884. }
  2885. return result;
  2886. }
  2887. function parseJSONTextObject ( jsonTxtObj ) {
  2888. var result ="";
  2889. if( jsonTxtObj instanceof Object ) {
  2890. result+=parseJSONTextAttrs ( jsonTxtObj );
  2891. }
  2892. else
  2893. if(jsonTxtObj!=null) {
  2894. if(config.escapeMode)
  2895. result+=escapeXmlChars(jsonTxtObj);
  2896. else
  2897. result+=jsonTxtObj;
  2898. }
  2899. return result;
  2900. }
  2901. function getJsonPropertyPath(jsonObjPath, jsonPropName) {
  2902. if (jsonObjPath==="") {
  2903. return jsonPropName;
  2904. }
  2905. else
  2906. return jsonObjPath+"."+jsonPropName;
  2907. }
  2908. function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList, jsonObjPath ) {
  2909. var result = "";
  2910. if(jsonArrRoot.length == 0) {
  2911. result+=startTag(jsonArrRoot, jsonArrObj, attrList, true);
  2912. }
  2913. else {
  2914. for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) {
  2915. result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false);
  2916. result+=parseJSONObject(jsonArrRoot[arIdx], getJsonPropertyPath(jsonObjPath,jsonArrObj));
  2917. result+=endTag(jsonArrRoot[arIdx],jsonArrObj);
  2918. }
  2919. }
  2920. return result;
  2921. }
  2922. function parseJSONObject ( jsonObj, jsonObjPath ) {
  2923. var result = "";
  2924. var elementsCnt = jsonXmlElemCount ( jsonObj );
  2925. if(elementsCnt > 0) {
  2926. for( var it in jsonObj ) {
  2927. if(jsonXmlSpecialElem ( jsonObj, it) || (jsonObjPath!="" && !checkJsonObjPropertiesFilter(jsonObj, it, getJsonPropertyPath(jsonObjPath,it))) )
  2928. continue;
  2929. var subObj = jsonObj[it];
  2930. var attrList = parseJSONAttributes( subObj )
  2931. if(subObj == null || subObj == undefined) {
  2932. result+=startTag(subObj, it, attrList, true);
  2933. }
  2934. else
  2935. if(subObj instanceof Object) {
  2936. if(subObj instanceof Array) {
  2937. result+=parseJSONArray( subObj, it, attrList, jsonObjPath );
  2938. }
  2939. else if(subObj instanceof Date) {
  2940. result+=startTag(subObj, it, attrList, false);
  2941. result+=subObj.toISOString();
  2942. result+=endTag(subObj,it);
  2943. }
  2944. else {
  2945. var subObjElementsCnt = jsonXmlElemCount ( subObj );
  2946. if(subObjElementsCnt > 0 || subObj.__text!=null || subObj.__cdata!=null) {
  2947. result+=startTag(subObj, it, attrList, false);
  2948. result+=parseJSONObject(subObj, getJsonPropertyPath(jsonObjPath,it));
  2949. result+=endTag(subObj,it);
  2950. }
  2951. else {
  2952. result+=startTag(subObj, it, attrList, true);
  2953. }
  2954. }
  2955. }
  2956. else {
  2957. result+=startTag(subObj, it, attrList, false);
  2958. result+=parseJSONTextObject(subObj);
  2959. result+=endTag(subObj,it);
  2960. }
  2961. }
  2962. }
  2963. result+=parseJSONTextObject(jsonObj);
  2964. return result;
  2965. }
  2966. this.parseXmlString = function(xmlDocStr) {
  2967. // var isIEParser = window.ActiveXObject || "ActiveXObject" in window;
  2968. var isIEParser = false;
  2969. if (xmlDocStr === undefined) {
  2970. return null;
  2971. }
  2972. var xmlDoc;
  2973. if (DOMParser) {
  2974. var parser=new DOMParser();
  2975. var parsererrorNS = null;
  2976. // IE9+ now is here
  2977. if(!isIEParser) {
  2978. try {
  2979. parsererrorNS = parser.parseFromString("INVALID", "text/xml").getElementsByTagName("parsererror")[0].namespaceURI;
  2980. }
  2981. catch(err) {
  2982. parsererrorNS = null;
  2983. }
  2984. }
  2985. try {
  2986. xmlDoc = parser.parseFromString( xmlDocStr, "text/xml" );
  2987. if( parsererrorNS!= null && xmlDoc.getElementsByTagNameNS(parsererrorNS, "parsererror").length > 0) {
  2988. //throw new Error('Error parsing XML: '+xmlDocStr);
  2989. xmlDoc = null;
  2990. }
  2991. }
  2992. catch(err) {
  2993. xmlDoc = null;
  2994. }
  2995. }
  2996. else {
  2997. // IE :(
  2998. if(xmlDocStr.indexOf("<?")==0) {
  2999. xmlDocStr = xmlDocStr.substr( xmlDocStr.indexOf("?>") + 2 );
  3000. }
  3001. xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  3002. xmlDoc.async="false";
  3003. xmlDoc.loadXML(xmlDocStr);
  3004. }
  3005. return xmlDoc;
  3006. };
  3007. this.asArray = function(prop) {
  3008. if (prop === undefined || prop == null)
  3009. return [];
  3010. else
  3011. if(prop instanceof Array)
  3012. return prop;
  3013. else
  3014. return [prop];
  3015. };
  3016. this.toXmlDateTime = function(dt) {
  3017. if(dt instanceof Date)
  3018. return dt.toISOString();
  3019. else
  3020. if(typeof(dt) === 'number' )
  3021. return new Date(dt).toISOString();
  3022. else
  3023. return null;
  3024. };
  3025. this.asDateTime = function(prop) {
  3026. if(typeof(prop) == "string") {
  3027. return fromXmlDateTime(prop);
  3028. }
  3029. else
  3030. return prop;
  3031. };
  3032. this.xml2json = function (xmlDoc) {
  3033. return parseDOMChildren ( xmlDoc );
  3034. };
  3035. this.xml_str2json = function (xmlDocStr) {
  3036. var xmlDoc = this.parseXmlString(xmlDocStr);
  3037. if(xmlDoc!=null)
  3038. return this.xml2json(xmlDoc);
  3039. else
  3040. return null;
  3041. };
  3042. this.json2xml_str = function (jsonObj) {
  3043. return parseJSONObject ( jsonObj, "" );
  3044. };
  3045. this.json2xml = function (jsonObj) {
  3046. var xmlDocStr = this.json2xml_str (jsonObj);
  3047. return this.parseXmlString(xmlDocStr);
  3048. };
  3049. this.getVersion = function () {
  3050. return VERSION;
  3051. };
  3052. };
  3053. var xml2json = function (str) {
  3054. if (!str) return null;
  3055. var parser = new DOMParser();
  3056. var xmlDoc = parser.parseFromString(str, "text/xml");
  3057. var x2jsObj = new x2js();
  3058. var data = x2jsObj.xml2json(xmlDoc);
  3059. if (data.html && data.getElementsByTagName('parsererror').length) {
  3060. return null;
  3061. } else {
  3062. return data;
  3063. }
  3064. };
  3065. var json2xml = function (data) {
  3066. var x2jsObj = new x2js();
  3067. return x2jsObj.json2xml(data);
  3068. };
  3069. module.exports = xml2json;
  3070. /***/ }),
  3071. /* 11 */
  3072. /***/ (function(module, exports, __webpack_require__) {
  3073. function DOMParser(options){
  3074. this.options = options ||{locator:{}};
  3075. }
  3076. DOMParser.prototype.parseFromString = function(source,mimeType){
  3077. var options = this.options;
  3078. var sax = new XMLReader();
  3079. var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
  3080. var errorHandler = options.errorHandler;
  3081. var locator = options.locator;
  3082. var defaultNSMap = options.xmlns||{};
  3083. var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"}
  3084. if(locator){
  3085. domBuilder.setDocumentLocator(locator)
  3086. }
  3087. sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
  3088. sax.domBuilder = options.domBuilder || domBuilder;
  3089. if(/\/x?html?$/.test(mimeType)){
  3090. entityMap.nbsp = '\xa0';
  3091. entityMap.copy = '\xa9';
  3092. defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
  3093. }
  3094. defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
  3095. if(source){
  3096. sax.parse(source,defaultNSMap,entityMap);
  3097. }else{
  3098. sax.errorHandler.error("invalid doc source");
  3099. }
  3100. return domBuilder.doc;
  3101. }
  3102. function buildErrorHandler(errorImpl,domBuilder,locator){
  3103. if(!errorImpl){
  3104. if(domBuilder instanceof DOMHandler){
  3105. return domBuilder;
  3106. }
  3107. errorImpl = domBuilder ;
  3108. }
  3109. var errorHandler = {}
  3110. var isCallback = errorImpl instanceof Function;
  3111. locator = locator||{}
  3112. function build(key){
  3113. var fn = errorImpl[key];
  3114. if(!fn && isCallback){
  3115. fn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;
  3116. }
  3117. errorHandler[key] = fn && function(msg){
  3118. fn('[xmldom '+key+']\t'+msg+_locator(locator));
  3119. }||function(){};
  3120. }
  3121. build('warning');
  3122. build('error');
  3123. build('fatalError');
  3124. return errorHandler;
  3125. }
  3126. //console.log('#\n\n\n\n\n\n\n####')
  3127. /**
  3128. * +ContentHandler+ErrorHandler
  3129. * +LexicalHandler+EntityResolver2
  3130. * -DeclHandler-DTDHandler
  3131. *
  3132. * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
  3133. * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
  3134. * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
  3135. */
  3136. function DOMHandler() {
  3137. this.cdata = false;
  3138. }
  3139. function position(locator,node){
  3140. node.lineNumber = locator.lineNumber;
  3141. node.columnNumber = locator.columnNumber;
  3142. }
  3143. /**
  3144. * @see org.xml.sax.ContentHandler#startDocument
  3145. * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
  3146. */
  3147. DOMHandler.prototype = {
  3148. startDocument : function() {
  3149. this.doc = new DOMImplementation().createDocument(null, null, null);
  3150. if (this.locator) {
  3151. this.doc.documentURI = this.locator.systemId;
  3152. }
  3153. },
  3154. startElement:function(namespaceURI, localName, qName, attrs) {
  3155. var doc = this.doc;
  3156. var el = doc.createElementNS(namespaceURI, qName||localName);
  3157. var len = attrs.length;
  3158. appendElement(this, el);
  3159. this.currentElement = el;
  3160. this.locator && position(this.locator,el)
  3161. for (var i = 0 ; i < len; i++) {
  3162. var namespaceURI = attrs.getURI(i);
  3163. var value = attrs.getValue(i);
  3164. var qName = attrs.getQName(i);
  3165. var attr = doc.createAttributeNS(namespaceURI, qName);
  3166. this.locator &&position(attrs.getLocator(i),attr);
  3167. attr.value = attr.nodeValue = value;
  3168. el.setAttributeNode(attr)
  3169. }
  3170. },
  3171. endElement:function(namespaceURI, localName, qName) {
  3172. var current = this.currentElement
  3173. var tagName = current.tagName;
  3174. this.currentElement = current.parentNode;
  3175. },
  3176. startPrefixMapping:function(prefix, uri) {
  3177. },
  3178. endPrefixMapping:function(prefix) {
  3179. },
  3180. processingInstruction:function(target, data) {
  3181. var ins = this.doc.createProcessingInstruction(target, data);
  3182. this.locator && position(this.locator,ins)
  3183. appendElement(this, ins);
  3184. },
  3185. ignorableWhitespace:function(ch, start, length) {
  3186. },
  3187. characters:function(chars, start, length) {
  3188. chars = _toString.apply(this,arguments)
  3189. //console.log(chars)
  3190. if(chars){
  3191. if (this.cdata) {
  3192. var charNode = this.doc.createCDATASection(chars);
  3193. } else {
  3194. var charNode = this.doc.createTextNode(chars);
  3195. }
  3196. if(this.currentElement){
  3197. this.currentElement.appendChild(charNode);
  3198. }else if(/^\s*$/.test(chars)){
  3199. this.doc.appendChild(charNode);
  3200. //process xml
  3201. }
  3202. this.locator && position(this.locator,charNode)
  3203. }
  3204. },
  3205. skippedEntity:function(name) {
  3206. },
  3207. endDocument:function() {
  3208. this.doc.normalize();
  3209. },
  3210. setDocumentLocator:function (locator) {
  3211. if(this.locator = locator){// && !('lineNumber' in locator)){
  3212. locator.lineNumber = 0;
  3213. }
  3214. },
  3215. //LexicalHandler
  3216. comment:function(chars, start, length) {
  3217. chars = _toString.apply(this,arguments)
  3218. var comm = this.doc.createComment(chars);
  3219. this.locator && position(this.locator,comm)
  3220. appendElement(this, comm);
  3221. },
  3222. startCDATA:function() {
  3223. //used in characters() methods
  3224. this.cdata = true;
  3225. },
  3226. endCDATA:function() {
  3227. this.cdata = false;
  3228. },
  3229. startDTD:function(name, publicId, systemId) {
  3230. var impl = this.doc.implementation;
  3231. if (impl && impl.createDocumentType) {
  3232. var dt = impl.createDocumentType(name, publicId, systemId);
  3233. this.locator && position(this.locator,dt)
  3234. appendElement(this, dt);
  3235. }
  3236. },
  3237. /**
  3238. * @see org.xml.sax.ErrorHandler
  3239. * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
  3240. */
  3241. warning:function(error) {
  3242. console.warn('[xmldom warning]\t'+error,_locator(this.locator));
  3243. },
  3244. error:function(error) {
  3245. console.error('[xmldom error]\t'+error,_locator(this.locator));
  3246. },
  3247. fatalError:function(error) {
  3248. console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
  3249. throw error;
  3250. }
  3251. }
  3252. function _locator(l){
  3253. if(l){
  3254. return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
  3255. }
  3256. }
  3257. function _toString(chars,start,length){
  3258. if(typeof chars == 'string'){
  3259. return chars.substr(start,length)
  3260. }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
  3261. if(chars.length >= start+length || start){
  3262. return new java.lang.String(chars,start,length)+'';
  3263. }
  3264. return chars;
  3265. }
  3266. }
  3267. /*
  3268. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
  3269. * used method of org.xml.sax.ext.LexicalHandler:
  3270. * #comment(chars, start, length)
  3271. * #startCDATA()
  3272. * #endCDATA()
  3273. * #startDTD(name, publicId, systemId)
  3274. *
  3275. *
  3276. * IGNORED method of org.xml.sax.ext.LexicalHandler:
  3277. * #endDTD()
  3278. * #startEntity(name)
  3279. * #endEntity(name)
  3280. *
  3281. *
  3282. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
  3283. * IGNORED method of org.xml.sax.ext.DeclHandler
  3284. * #attributeDecl(eName, aName, type, mode, value)
  3285. * #elementDecl(name, model)
  3286. * #externalEntityDecl(name, publicId, systemId)
  3287. * #internalEntityDecl(name, value)
  3288. * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
  3289. * IGNORED method of org.xml.sax.EntityResolver2
  3290. * #resolveEntity(String name,String publicId,String baseURI,String systemId)
  3291. * #resolveEntity(publicId, systemId)
  3292. * #getExternalSubset(name, baseURI)
  3293. * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
  3294. * IGNORED method of org.xml.sax.DTDHandler
  3295. * #notationDecl(name, publicId, systemId) {};
  3296. * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
  3297. */
  3298. "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
  3299. DOMHandler.prototype[key] = function(){return null}
  3300. })
  3301. /* 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 */
  3302. function appendElement (hander,node) {
  3303. if (!hander.currentElement) {
  3304. hander.doc.appendChild(node);
  3305. } else {
  3306. hander.currentElement.appendChild(node);
  3307. }
  3308. }//appendChild and setAttributeNS are preformance key
  3309. //if(typeof require == 'function'){
  3310. var XMLReader = __webpack_require__(12).XMLReader;
  3311. var DOMImplementation = exports.DOMImplementation = __webpack_require__(2).DOMImplementation;
  3312. exports.XMLSerializer = __webpack_require__(2).XMLSerializer ;
  3313. exports.DOMParser = DOMParser;
  3314. //}
  3315. /***/ }),
  3316. /* 12 */
  3317. /***/ (function(module, exports) {
  3318. //[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]
  3319. //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
  3320. //[5] Name ::= NameStartChar (NameChar)*
  3321. 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
  3322. var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
  3323. var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
  3324. //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
  3325. //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(',')
  3326. //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
  3327. //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
  3328. var S_TAG = 0;//tag name offerring
  3329. var S_ATTR = 1;//attr name offerring
  3330. var S_ATTR_SPACE=2;//attr name end and space offer
  3331. var S_EQ = 3;//=space?
  3332. var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
  3333. var S_ATTR_END = 5;//attr value end and no space(quot end)
  3334. var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
  3335. var S_TAG_CLOSE = 7;//closed el<el />
  3336. function XMLReader(){
  3337. }
  3338. XMLReader.prototype = {
  3339. parse:function(source,defaultNSMap,entityMap){
  3340. var domBuilder = this.domBuilder;
  3341. domBuilder.startDocument();
  3342. _copy(defaultNSMap ,defaultNSMap = {})
  3343. parse(source,defaultNSMap,entityMap,
  3344. domBuilder,this.errorHandler);
  3345. domBuilder.endDocument();
  3346. }
  3347. }
  3348. function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
  3349. function fixedFromCharCode(code) {
  3350. // String.prototype.fromCharCode does not supports
  3351. // > 2 bytes unicode chars directly
  3352. if (code > 0xffff) {
  3353. code -= 0x10000;
  3354. var surrogate1 = 0xd800 + (code >> 10)
  3355. , surrogate2 = 0xdc00 + (code & 0x3ff);
  3356. return String.fromCharCode(surrogate1, surrogate2);
  3357. } else {
  3358. return String.fromCharCode(code);
  3359. }
  3360. }
  3361. function entityReplacer(a){
  3362. var k = a.slice(1,-1);
  3363. if(k in entityMap){
  3364. return entityMap[k];
  3365. }else if(k.charAt(0) === '#'){
  3366. return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
  3367. }else{
  3368. errorHandler.error('entity not found:'+a);
  3369. return a;
  3370. }
  3371. }
  3372. function appendText(end){//has some bugs
  3373. if(end>start){
  3374. var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
  3375. locator&&position(start);
  3376. domBuilder.characters(xt,0,end-start);
  3377. start = end
  3378. }
  3379. }
  3380. function position(p,m){
  3381. while(p>=lineEnd && (m = linePattern.exec(source))){
  3382. lineStart = m.index;
  3383. lineEnd = lineStart + m[0].length;
  3384. locator.lineNumber++;
  3385. //console.log('line++:',locator,startPos,endPos)
  3386. }
  3387. locator.columnNumber = p-lineStart+1;
  3388. }
  3389. var lineStart = 0;
  3390. var lineEnd = 0;
  3391. var linePattern = /.*(?:\r\n?|\n)|.*$/g
  3392. var locator = domBuilder.locator;
  3393. var parseStack = [{currentNSMap:defaultNSMapCopy}]
  3394. var closeMap = {};
  3395. var start = 0;
  3396. while(true){
  3397. try{
  3398. var tagStart = source.indexOf('<',start);
  3399. if(tagStart<0){
  3400. if(!source.substr(start).match(/^\s*$/)){
  3401. var doc = domBuilder.doc;
  3402. var text = doc.createTextNode(source.substr(start));
  3403. doc.appendChild(text);
  3404. domBuilder.currentElement = text;
  3405. }
  3406. return;
  3407. }
  3408. if(tagStart>start){
  3409. appendText(tagStart);
  3410. }
  3411. switch(source.charAt(tagStart+1)){
  3412. case '/':
  3413. var end = source.indexOf('>',tagStart+3);
  3414. var tagName = source.substring(tagStart+2,end);
  3415. var config = parseStack.pop();
  3416. if(end<0){
  3417. tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
  3418. //console.error('#@@@@@@'+tagName)
  3419. errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
  3420. end = tagStart+1+tagName.length;
  3421. }else if(tagName.match(/\s</)){
  3422. tagName = tagName.replace(/[\s<].*/,'');
  3423. errorHandler.error("end tag name: "+tagName+' maybe not complete');
  3424. end = tagStart+1+tagName.length;
  3425. }
  3426. //console.error(parseStack.length,parseStack)
  3427. //console.error(config);
  3428. var localNSMap = config.localNSMap;
  3429. var endMatch = config.tagName == tagName;
  3430. var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()
  3431. if(endIgnoreCaseMach){
  3432. domBuilder.endElement(config.uri,config.localName,tagName);
  3433. if(localNSMap){
  3434. for(var prefix in localNSMap){
  3435. domBuilder.endPrefixMapping(prefix) ;
  3436. }
  3437. }
  3438. if(!endMatch){
  3439. errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
  3440. }
  3441. }else{
  3442. parseStack.push(config)
  3443. }
  3444. end++;
  3445. break;
  3446. // end elment
  3447. case '?':// <?...?>
  3448. locator&&position(tagStart);
  3449. end = parseInstruction(source,tagStart,domBuilder);
  3450. break;
  3451. case '!':// <!doctype,<![CDATA,<!--
  3452. locator&&position(tagStart);
  3453. end = parseDCC(source,tagStart,domBuilder,errorHandler);
  3454. break;
  3455. default:
  3456. locator&&position(tagStart);
  3457. var el = new ElementAttributes();
  3458. var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
  3459. //elStartEnd
  3460. var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
  3461. var len = el.length;
  3462. if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
  3463. el.closed = true;
  3464. if(!entityMap.nbsp){
  3465. errorHandler.warning('unclosed xml attribute');
  3466. }
  3467. }
  3468. if(locator && len){
  3469. var locator2 = copyLocator(locator,{});
  3470. //try{//attribute position fixed
  3471. for(var i = 0;i<len;i++){
  3472. var a = el[i];
  3473. position(a.offset);
  3474. a.locator = copyLocator(locator,{});
  3475. }
  3476. //}catch(e){console.error('@@@@@'+e)}
  3477. domBuilder.locator = locator2
  3478. if(appendElement(el,domBuilder,currentNSMap)){
  3479. parseStack.push(el)
  3480. }
  3481. domBuilder.locator = locator;
  3482. }else{
  3483. if(appendElement(el,domBuilder,currentNSMap)){
  3484. parseStack.push(el)
  3485. }
  3486. }
  3487. if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
  3488. end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)
  3489. }else{
  3490. end++;
  3491. }
  3492. }
  3493. }catch(e){
  3494. errorHandler.error('element parse error: '+e)
  3495. //errorHandler.error('element parse error: '+e);
  3496. end = -1;
  3497. //throw e;
  3498. }
  3499. if(end>start){
  3500. start = end;
  3501. }else{
  3502. //TODO: 这里有可能sax回退,有位置错误风险
  3503. appendText(Math.max(tagStart,start)+1);
  3504. }
  3505. }
  3506. }
  3507. function copyLocator(f,t){
  3508. t.lineNumber = f.lineNumber;
  3509. t.columnNumber = f.columnNumber;
  3510. return t;
  3511. }
  3512. /**
  3513. * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
  3514. * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
  3515. */
  3516. function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
  3517. var attrName;
  3518. var value;
  3519. var p = ++start;
  3520. var s = S_TAG;//status
  3521. while(true){
  3522. var c = source.charAt(p);
  3523. switch(c){
  3524. case '=':
  3525. if(s === S_ATTR){//attrName
  3526. attrName = source.slice(start,p);
  3527. s = S_EQ;
  3528. }else if(s === S_ATTR_SPACE){
  3529. s = S_EQ;
  3530. }else{
  3531. //fatalError: equal must after attrName or space after attrName
  3532. throw new Error('attribute equal must after attrName');
  3533. }
  3534. break;
  3535. case '\'':
  3536. case '"':
  3537. if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
  3538. ){//equal
  3539. if(s === S_ATTR){
  3540. errorHandler.warning('attribute value must after "="')
  3541. attrName = source.slice(start,p)
  3542. }
  3543. start = p+1;
  3544. p = source.indexOf(c,start)
  3545. if(p>0){
  3546. value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3547. el.add(attrName,value,start-1);
  3548. s = S_ATTR_END;
  3549. }else{
  3550. //fatalError: no end quot match
  3551. throw new Error('attribute value no end \''+c+'\' match');
  3552. }
  3553. }else if(s == S_ATTR_NOQUOT_VALUE){
  3554. value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3555. //console.log(attrName,value,start,p)
  3556. el.add(attrName,value,start);
  3557. //console.dir(el)
  3558. errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
  3559. start = p+1;
  3560. s = S_ATTR_END
  3561. }else{
  3562. //fatalError: no equal before
  3563. throw new Error('attribute value must after "="');
  3564. }
  3565. break;
  3566. case '/':
  3567. switch(s){
  3568. case S_TAG:
  3569. el.setTagName(source.slice(start,p));
  3570. case S_ATTR_END:
  3571. case S_TAG_SPACE:
  3572. case S_TAG_CLOSE:
  3573. s =S_TAG_CLOSE;
  3574. el.closed = true;
  3575. case S_ATTR_NOQUOT_VALUE:
  3576. case S_ATTR:
  3577. case S_ATTR_SPACE:
  3578. break;
  3579. //case S_EQ:
  3580. default:
  3581. throw new Error("attribute invalid close char('/')")
  3582. }
  3583. break;
  3584. case ''://end document
  3585. //throw new Error('unexpected end of input')
  3586. errorHandler.error('unexpected end of input');
  3587. if(s == S_TAG){
  3588. el.setTagName(source.slice(start,p));
  3589. }
  3590. return p;
  3591. case '>':
  3592. switch(s){
  3593. case S_TAG:
  3594. el.setTagName(source.slice(start,p));
  3595. case S_ATTR_END:
  3596. case S_TAG_SPACE:
  3597. case S_TAG_CLOSE:
  3598. break;//normal
  3599. case S_ATTR_NOQUOT_VALUE://Compatible state
  3600. case S_ATTR:
  3601. value = source.slice(start,p);
  3602. if(value.slice(-1) === '/'){
  3603. el.closed = true;
  3604. value = value.slice(0,-1)
  3605. }
  3606. case S_ATTR_SPACE:
  3607. if(s === S_ATTR_SPACE){
  3608. value = attrName;
  3609. }
  3610. if(s == S_ATTR_NOQUOT_VALUE){
  3611. errorHandler.warning('attribute "'+value+'" missed quot(")!!');
  3612. el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start)
  3613. }else{
  3614. if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
  3615. errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!')
  3616. }
  3617. el.add(value,value,start)
  3618. }
  3619. break;
  3620. case S_EQ:
  3621. throw new Error('attribute value missed!!');
  3622. }
  3623. // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
  3624. return p;
  3625. /*xml space '\x20' | #x9 | #xD | #xA; */
  3626. case '\u0080':
  3627. c = ' ';
  3628. default:
  3629. if(c<= ' '){//space
  3630. switch(s){
  3631. case S_TAG:
  3632. el.setTagName(source.slice(start,p));//tagName
  3633. s = S_TAG_SPACE;
  3634. break;
  3635. case S_ATTR:
  3636. attrName = source.slice(start,p)
  3637. s = S_ATTR_SPACE;
  3638. break;
  3639. case S_ATTR_NOQUOT_VALUE:
  3640. var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
  3641. errorHandler.warning('attribute "'+value+'" missed quot(")!!');
  3642. el.add(attrName,value,start)
  3643. case S_ATTR_END:
  3644. s = S_TAG_SPACE;
  3645. break;
  3646. //case S_TAG_SPACE:
  3647. //case S_EQ:
  3648. //case S_ATTR_SPACE:
  3649. // void();break;
  3650. //case S_TAG_CLOSE:
  3651. //ignore warning
  3652. }
  3653. }else{//not space
  3654. //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
  3655. //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
  3656. switch(s){
  3657. //case S_TAG:void();break;
  3658. //case S_ATTR:void();break;
  3659. //case S_ATTR_NOQUOT_VALUE:void();break;
  3660. case S_ATTR_SPACE:
  3661. var tagName = el.tagName;
  3662. if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
  3663. errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!')
  3664. }
  3665. el.add(attrName,attrName,start);
  3666. start = p;
  3667. s = S_ATTR;
  3668. break;
  3669. case S_ATTR_END:
  3670. errorHandler.warning('attribute space is required"'+attrName+'"!!')
  3671. case S_TAG_SPACE:
  3672. s = S_ATTR;
  3673. start = p;
  3674. break;
  3675. case S_EQ:
  3676. s = S_ATTR_NOQUOT_VALUE;
  3677. start = p;
  3678. break;
  3679. case S_TAG_CLOSE:
  3680. throw new Error("elements closed character '/' and '>' must be connected to");
  3681. }
  3682. }
  3683. }//end outer switch
  3684. //console.log('p++',p)
  3685. p++;
  3686. }
  3687. }
  3688. /**
  3689. * @return true if has new namespace define
  3690. */
  3691. function appendElement(el,domBuilder,currentNSMap){
  3692. var tagName = el.tagName;
  3693. var localNSMap = null;
  3694. //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
  3695. var i = el.length;
  3696. while(i--){
  3697. var a = el[i];
  3698. var qName = a.qName;
  3699. var value = a.value;
  3700. var nsp = qName.indexOf(':');
  3701. if(nsp>0){
  3702. var prefix = a.prefix = qName.slice(0,nsp);
  3703. var localName = qName.slice(nsp+1);
  3704. var nsPrefix = prefix === 'xmlns' && localName
  3705. }else{
  3706. localName = qName;
  3707. prefix = null
  3708. nsPrefix = qName === 'xmlns' && ''
  3709. }
  3710. //can not set prefix,because prefix !== ''
  3711. a.localName = localName ;
  3712. //prefix == null for no ns prefix attribute
  3713. if(nsPrefix !== false){//hack!!
  3714. if(localNSMap == null){
  3715. localNSMap = {}
  3716. //console.log(currentNSMap,0)
  3717. _copy(currentNSMap,currentNSMap={})
  3718. //console.log(currentNSMap,1)
  3719. }
  3720. currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
  3721. a.uri = 'http://www.w3.org/2000/xmlns/'
  3722. domBuilder.startPrefixMapping(nsPrefix, value)
  3723. }
  3724. }
  3725. var i = el.length;
  3726. while(i--){
  3727. a = el[i];
  3728. var prefix = a.prefix;
  3729. if(prefix){//no prefix attribute has no namespace
  3730. if(prefix === 'xml'){
  3731. a.uri = 'http://www.w3.org/XML/1998/namespace';
  3732. }if(prefix !== 'xmlns'){
  3733. a.uri = currentNSMap[prefix || '']
  3734. //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
  3735. }
  3736. }
  3737. }
  3738. var nsp = tagName.indexOf(':');
  3739. if(nsp>0){
  3740. prefix = el.prefix = tagName.slice(0,nsp);
  3741. localName = el.localName = tagName.slice(nsp+1);
  3742. }else{
  3743. prefix = null;//important!!
  3744. localName = el.localName = tagName;
  3745. }
  3746. //no prefix element has default namespace
  3747. var ns = el.uri = currentNSMap[prefix || ''];
  3748. domBuilder.startElement(ns,localName,tagName,el);
  3749. //endPrefixMapping and startPrefixMapping have not any help for dom builder
  3750. //localNSMap = null
  3751. if(el.closed){
  3752. domBuilder.endElement(ns,localName,tagName);
  3753. if(localNSMap){
  3754. for(prefix in localNSMap){
  3755. domBuilder.endPrefixMapping(prefix)
  3756. }
  3757. }
  3758. }else{
  3759. el.currentNSMap = currentNSMap;
  3760. el.localNSMap = localNSMap;
  3761. //parseStack.push(el);
  3762. return true;
  3763. }
  3764. }
  3765. function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
  3766. if(/^(?:script|textarea)$/i.test(tagName)){
  3767. var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
  3768. var text = source.substring(elStartEnd+1,elEndStart);
  3769. if(/[&<]/.test(text)){
  3770. if(/^script$/i.test(tagName)){
  3771. //if(!/\]\]>/.test(text)){
  3772. //lexHandler.startCDATA();
  3773. domBuilder.characters(text,0,text.length);
  3774. //lexHandler.endCDATA();
  3775. return elEndStart;
  3776. //}
  3777. }//}else{//text area
  3778. text = text.replace(/&#?\w+;/g,entityReplacer);
  3779. domBuilder.characters(text,0,text.length);
  3780. return elEndStart;
  3781. //}
  3782. }
  3783. }
  3784. return elStartEnd+1;
  3785. }
  3786. function fixSelfClosed(source,elStartEnd,tagName,closeMap){
  3787. //if(tagName in closeMap){
  3788. var pos = closeMap[tagName];
  3789. if(pos == null){
  3790. //console.log(tagName)
  3791. pos = source.lastIndexOf('</'+tagName+'>')
  3792. if(pos<elStartEnd){//忘记闭合
  3793. pos = source.lastIndexOf('</'+tagName)
  3794. }
  3795. closeMap[tagName] =pos
  3796. }
  3797. return pos<elStartEnd;
  3798. //}
  3799. }
  3800. function _copy(source,target){
  3801. for(var n in source){target[n] = source[n]}
  3802. }
  3803. function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
  3804. var next= source.charAt(start+2)
  3805. switch(next){
  3806. case '-':
  3807. if(source.charAt(start + 3) === '-'){
  3808. var end = source.indexOf('-->',start+4);
  3809. //append comment source.substring(4,end)//<!--
  3810. if(end>start){
  3811. domBuilder.comment(source,start+4,end-start-4);
  3812. return end+3;
  3813. }else{
  3814. errorHandler.error("Unclosed comment");
  3815. return -1;
  3816. }
  3817. }else{
  3818. //error
  3819. return -1;
  3820. }
  3821. default:
  3822. if(source.substr(start+3,6) == 'CDATA['){
  3823. var end = source.indexOf(']]>',start+9);
  3824. domBuilder.startCDATA();
  3825. domBuilder.characters(source,start+9,end-start-9);
  3826. domBuilder.endCDATA()
  3827. return end+3;
  3828. }
  3829. //<!DOCTYPE
  3830. //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
  3831. var matchs = split(source,start);
  3832. var len = matchs.length;
  3833. if(len>1 && /!doctype/i.test(matchs[0][0])){
  3834. var name = matchs[1][0];
  3835. var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0]
  3836. var sysid = len>4 && matchs[4][0];
  3837. var lastMatch = matchs[len-1]
  3838. domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
  3839. sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
  3840. domBuilder.endDTD();
  3841. return lastMatch.index+lastMatch[0].length
  3842. }
  3843. }
  3844. return -1;
  3845. }
  3846. function parseInstruction(source,start,domBuilder){
  3847. var end = source.indexOf('?>',start);
  3848. if(end){
  3849. var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
  3850. if(match){
  3851. var len = match[0].length;
  3852. domBuilder.processingInstruction(match[1], match[2]) ;
  3853. return end+2;
  3854. }else{//error
  3855. return -1;
  3856. }
  3857. }
  3858. return -1;
  3859. }
  3860. /**
  3861. * @param source
  3862. */
  3863. function ElementAttributes(source){
  3864. }
  3865. ElementAttributes.prototype = {
  3866. setTagName:function(tagName){
  3867. if(!tagNamePattern.test(tagName)){
  3868. throw new Error('invalid tagName:'+tagName)
  3869. }
  3870. this.tagName = tagName
  3871. },
  3872. add:function(qName,value,offset){
  3873. if(!tagNamePattern.test(qName)){
  3874. throw new Error('invalid attribute:'+qName)
  3875. }
  3876. this[this.length++] = {qName:qName,value:value,offset:offset}
  3877. },
  3878. length:0,
  3879. getLocalName:function(i){return this[i].localName},
  3880. getLocator:function(i){return this[i].locator},
  3881. getQName:function(i){return this[i].qName},
  3882. getURI:function(i){return this[i].uri},
  3883. getValue:function(i){return this[i].value}
  3884. // ,getIndex:function(uri, localName)){
  3885. // if(localName){
  3886. //
  3887. // }else{
  3888. // var qName = uri
  3889. // }
  3890. // },
  3891. // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
  3892. // getType:function(uri,localName){}
  3893. // getType:function(i){},
  3894. }
  3895. function _set_proto_(thiz,parent){
  3896. thiz.__proto__ = parent;
  3897. return thiz;
  3898. }
  3899. if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
  3900. _set_proto_ = function(thiz,parent){
  3901. function p(){};
  3902. p.prototype = parent;
  3903. p = new p();
  3904. for(parent in thiz){
  3905. p[parent] = thiz[parent];
  3906. }
  3907. return p;
  3908. }
  3909. }
  3910. function split(source,start){
  3911. var match;
  3912. var buf = [];
  3913. var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
  3914. reg.lastIndex = start;
  3915. reg.exec(source);//skip <
  3916. while(match = reg.exec(source)){
  3917. buf.push(match);
  3918. if(match[1])return buf;
  3919. }
  3920. }
  3921. exports.XMLReader = XMLReader;
  3922. /***/ }),
  3923. /* 13 */
  3924. /***/ (function(module, exports, __webpack_require__) {
  3925. var Async = __webpack_require__(14);
  3926. var EventProxy = __webpack_require__(3).EventProxy;
  3927. var util = __webpack_require__(0);
  3928. // 抛弃分块上传任务
  3929. /*
  3930. AsyncLimit (抛弃上传任务的并发量),
  3931. UploadId (上传任务的编号,当 Level 为 task 时候需要)
  3932. Level (抛弃分块上传任务的级别,task : 抛弃指定的上传任务,file : 抛弃指定的文件对应的上传任务,其他值 :抛弃指定Bucket 的全部上传任务)
  3933. */
  3934. function abortUploadTask(params, callback) {
  3935. var Bucket = params.Bucket;
  3936. var Region = params.Region;
  3937. var Key = params.Key;
  3938. var UploadId = params.UploadId;
  3939. var Level = params.Level || 'task';
  3940. var AsyncLimit = params.AsyncLimit;
  3941. var self = this;
  3942. var ep = new EventProxy();
  3943. ep.on('error', function (errData) {
  3944. return callback(errData);
  3945. });
  3946. // 已经获取到需要抛弃的任务列表
  3947. ep.on('get_abort_array', function (AbortArray) {
  3948. abortUploadTaskArray.call(self, {
  3949. Bucket: Bucket,
  3950. Region: Region,
  3951. Key: Key,
  3952. Headers: params.Headers,
  3953. AsyncLimit: AsyncLimit,
  3954. AbortArray: AbortArray
  3955. }, function (err, data) {
  3956. if (err) {
  3957. return callback(err);
  3958. }
  3959. callback(null, data);
  3960. });
  3961. });
  3962. if (Level === 'bucket') {
  3963. // Bucket 级别的任务抛弃,抛弃该 Bucket 下的全部上传任务
  3964. wholeMultipartList.call(self, {
  3965. Bucket: Bucket,
  3966. Region: Region
  3967. }, function (err, data) {
  3968. if (err) {
  3969. return callback(err);
  3970. }
  3971. ep.emit('get_abort_array', data.UploadList || []);
  3972. });
  3973. } else if (Level === 'file') {
  3974. // 文件级别的任务抛弃,抛弃该文件的全部上传任务
  3975. if (!Key) return callback({error: 'abort_upload_task_no_key'});
  3976. wholeMultipartList.call(self, {
  3977. Bucket: Bucket,
  3978. Region: Region,
  3979. Key: Key
  3980. }, function (err, data) {
  3981. if (err) {
  3982. return callback(err);
  3983. }
  3984. ep.emit('get_abort_array', data.UploadList || []);
  3985. });
  3986. } else if (Level === 'task') {
  3987. // 单个任务级别的任务抛弃,抛弃指定 UploadId 的上传任务
  3988. if (!UploadId) return callback({error: 'abort_upload_task_no_id'});
  3989. if (!Key) return callback({error: 'abort_upload_task_no_key'});
  3990. ep.emit('get_abort_array', [{
  3991. Key: Key,
  3992. UploadId: UploadId
  3993. }]);
  3994. } else {
  3995. return callback({error: 'abort_unknown_level'});
  3996. }
  3997. }
  3998. // 批量抛弃分块上传任务
  3999. function abortUploadTaskArray(params, callback) {
  4000. var Bucket = params.Bucket;
  4001. var Region = params.Region;
  4002. var Key = params.Key;
  4003. var AbortArray = params.AbortArray;
  4004. var AsyncLimit = params.AsyncLimit || 1;
  4005. var self = this;
  4006. var index = 0;
  4007. var resultList = new Array(AbortArray.length);
  4008. Async.eachLimit(AbortArray, AsyncLimit, function (AbortItem, callback) {
  4009. var eachIndex = index;
  4010. if (Key && Key !== AbortItem.Key) {
  4011. resultList[eachIndex] = {error: {KeyNotMatch: true}};
  4012. callback(null);
  4013. return;
  4014. }
  4015. var UploadId = AbortItem.UploadId || AbortItem.UploadID;
  4016. self.multipartAbort({
  4017. Bucket: Bucket,
  4018. Region: Region,
  4019. Key: AbortItem.Key,
  4020. Headers: params.Headers,
  4021. UploadId: UploadId
  4022. }, function (err, data) {
  4023. var task = {
  4024. Bucket: Bucket,
  4025. Region: Region,
  4026. Key: AbortItem.Key,
  4027. UploadId: UploadId
  4028. };
  4029. resultList[eachIndex] = {error: err, task: task};
  4030. callback(null);
  4031. });
  4032. index++;
  4033. }, function (err) {
  4034. if (err) {
  4035. return callback(err);
  4036. }
  4037. var successList = [];
  4038. var errorList = [];
  4039. for (var i = 0, len = resultList.length; i < len; i++) {
  4040. var item = resultList[i];
  4041. if (item['task']) {
  4042. if (item['error']) {
  4043. errorList.push(item['task']);
  4044. } else {
  4045. successList.push(item['task']);
  4046. }
  4047. }
  4048. }
  4049. return callback(null, {
  4050. successList: successList,
  4051. errorList: errorList
  4052. });
  4053. });
  4054. }
  4055. // 获取符合条件的全部上传任务 (条件包括 Bucket, Region, Prefix)
  4056. function wholeMultipartList(params, callback) {
  4057. var self = this;
  4058. var UploadList = [];
  4059. var sendParams = {
  4060. Bucket: params.Bucket,
  4061. Region: params.Region,
  4062. Prefix: params.Key
  4063. };
  4064. var next = function () {
  4065. self.multipartList(sendParams, function (err, data) {
  4066. if (err) return callback(err);
  4067. UploadList.push.apply(UploadList, data.Upload || []);
  4068. if (data.IsTruncated == 'true') { // 列表不完整
  4069. sendParams.KeyMarker = data.NextKeyMarker;
  4070. sendParams.UploadIdMarker = data.NextUploadIdMarker;
  4071. next();
  4072. } else {
  4073. callback(null, {UploadList: UploadList});
  4074. }
  4075. });
  4076. };
  4077. next();
  4078. }
  4079. // 分片复制文件
  4080. function sliceCopyFile(params, callback) {
  4081. var ep = new EventProxy();
  4082. var self = this;
  4083. var Bucket = params.Bucket;
  4084. var Region = params.Region;
  4085. var Key = params.Key;
  4086. var CopySource = params.CopySource;
  4087. var m = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
  4088. if (!m) {
  4089. callback({error: 'CopySource format error'});
  4090. return;
  4091. }
  4092. var SourceBucket = m[1];
  4093. var SourceRegion = m[3];
  4094. var SourceKey = decodeURIComponent(m[4]);
  4095. var CopySliceSize = params.SliceSize === undefined ? self.options.CopySliceSize : params.SliceSize;
  4096. CopySliceSize = Math.max(0, Math.min(CopySliceSize, 5 * 1024 * 1024 * 1024));
  4097. var ChunkSize = params.ChunkSize || this.options.CopyChunkSize;
  4098. var ChunkParallel = this.options.CopyChunkParallelLimit;
  4099. var FinishSize = 0;
  4100. var FileSize;
  4101. var onProgress;
  4102. // 分片复制完成,开始 multipartComplete 操作
  4103. ep.on('copy_slice_complete', function (UploadData) {
  4104. self.multipartComplete({
  4105. Bucket: Bucket,
  4106. Region: Region,
  4107. Key: Key,
  4108. UploadId: UploadData.UploadId,
  4109. Parts: UploadData.PartList,
  4110. },function (err, data) {
  4111. if (err) {
  4112. onProgress(null, true);
  4113. return callback(err);
  4114. }
  4115. onProgress({loaded: FileSize, total: FileSize}, true);
  4116. callback(null, data);
  4117. });
  4118. });
  4119. ep.on('get_copy_data_finish',function (UploadData) {
  4120. Async.eachLimit(UploadData.PartList, ChunkParallel, function (SliceItem, asyncCallback) {
  4121. var PartNumber = SliceItem.PartNumber;
  4122. var CopySourceRange = SliceItem.CopySourceRange;
  4123. var currentSize = SliceItem.end - SliceItem.start;
  4124. var preAddSize = 0;
  4125. copySliceItem.call(self,{
  4126. Bucket: Bucket,
  4127. Region: Region,
  4128. Key: Key,
  4129. CopySource: CopySource,
  4130. UploadId: UploadData.UploadId,
  4131. PartNumber: PartNumber,
  4132. CopySourceRange: CopySourceRange,
  4133. onProgress: function (data) {
  4134. FinishSize += data.loaded - preAddSize;
  4135. preAddSize = data.loaded;
  4136. onProgress({loaded: FinishSize, total: FileSize});
  4137. }
  4138. },function (err,data) {
  4139. if (err) {
  4140. return asyncCallback(err);
  4141. }
  4142. onProgress({loaded: FinishSize, total: FileSize});
  4143. FinishSize += currentSize - preAddSize;
  4144. SliceItem.ETag = data.ETag;
  4145. asyncCallback(err || null, data);
  4146. });
  4147. }, function (err) {
  4148. if (err) {
  4149. onProgress(null, true);
  4150. return callback(err);
  4151. }
  4152. ep.emit('copy_slice_complete', UploadData);
  4153. });
  4154. });
  4155. ep.on('get_file_size_finish', function (SourceHeaders) {
  4156. // 控制分片大小
  4157. (function () {
  4158. var SIZE = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024 * 2, 1024 * 4, 1024 * 5];
  4159. var AutoChunkSize = 1024 * 1024;
  4160. for (var i = 0; i < SIZE.length; i++) {
  4161. AutoChunkSize = SIZE[i] * 1024 * 1024;
  4162. if (FileSize / AutoChunkSize <= self.options.MaxPartNumber) break;
  4163. }
  4164. params.ChunkSize = ChunkSize = Math.max(ChunkSize, AutoChunkSize);
  4165. var ChunkCount = Math.ceil(FileSize / ChunkSize);
  4166. var list = [];
  4167. for (var partNumber = 1; partNumber <= ChunkCount; partNumber++) {
  4168. var start = (partNumber - 1) * ChunkSize;
  4169. var end = partNumber * ChunkSize < FileSize ? (partNumber * ChunkSize - 1) : FileSize - 1;
  4170. var item = {
  4171. PartNumber: partNumber,
  4172. start: start,
  4173. end: end,
  4174. CopySourceRange: "bytes=" + start + "-" + end,
  4175. };
  4176. list.push(item);
  4177. }
  4178. params.PartList = list;
  4179. })();
  4180. var TargetHeader;
  4181. if (params.Headers['x-cos-metadata-directive'] === 'Replaced') {
  4182. TargetHeader = params.Headers;
  4183. } else {
  4184. TargetHeader = SourceHeaders;
  4185. }
  4186. TargetHeader['x-cos-storage-class'] = params.Headers['x-cos-storage-class'] || SourceHeaders['x-cos-storage-class'];
  4187. TargetHeader = util.clearKey(TargetHeader);
  4188. self.multipartInit({
  4189. Bucket: Bucket,
  4190. Region: Region,
  4191. Key: Key,
  4192. Headers: TargetHeader,
  4193. },function (err,data) {
  4194. if (err) {
  4195. return callback(err);
  4196. }
  4197. params.UploadId = data.UploadId;
  4198. ep.emit('get_copy_data_finish', params);
  4199. });
  4200. });
  4201. // 获取远端复制源文件的大小
  4202. self.headObject({
  4203. Bucket: SourceBucket,
  4204. Region: SourceRegion,
  4205. Key: SourceKey,
  4206. },function(err, data) {
  4207. if (err) {
  4208. if (err.statusCode && err.statusCode === 404) {
  4209. callback({ErrorStatus: SourceKey + ' Not Exist'});
  4210. } else {
  4211. callback(err);
  4212. }
  4213. return;
  4214. }
  4215. FileSize = params.FileSize = data.headers['content-length'];
  4216. if (FileSize === undefined || !FileSize) {
  4217. callback({error: 'get Content-Length error, please add "Content-Length" to CORS ExposeHeader setting.'});
  4218. return;
  4219. }
  4220. onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
  4221. // 开始上传
  4222. if (FileSize <= CopySliceSize) {
  4223. if (!params.Headers['x-cos-metadata-directive']) {
  4224. params.Headers['x-cos-metadata-directive'] = 'Copy';
  4225. }
  4226. self.putObjectCopy(params, function (err, data) {
  4227. if (err) {
  4228. onProgress(null, true);
  4229. return callback(err);
  4230. }
  4231. onProgress({loaded: FileSize, total: FileSize}, true);
  4232. callback(err, data);
  4233. });
  4234. } else {
  4235. var resHeaders = data.headers;
  4236. var SourceHeaders = {
  4237. 'Cache-Control': resHeaders['cache-control'],
  4238. 'Content-Disposition': resHeaders['content-disposition'],
  4239. 'Content-Encoding': resHeaders['content-encoding'],
  4240. 'Content-Type': resHeaders['content-type'],
  4241. 'Expires': resHeaders['expires'],
  4242. 'x-cos-storage-class': resHeaders['x-cos-storage-class'],
  4243. };
  4244. util.each(resHeaders, function (v, k) {
  4245. var metaPrefix = 'x-cos-meta-';
  4246. if (k.indexOf(metaPrefix) === 0 && k.length > metaPrefix.length) {
  4247. SourceHeaders[k] = v;
  4248. }
  4249. });
  4250. ep.emit('get_file_size_finish', SourceHeaders);
  4251. }
  4252. });
  4253. }
  4254. // 复制指定分片
  4255. function copySliceItem(params, callback) {
  4256. var TaskId = params.TaskId;
  4257. var Bucket = params.Bucket;
  4258. var Region = params.Region;
  4259. var Key = params.Key;
  4260. var CopySource = params.CopySource;
  4261. var UploadId = params.UploadId;
  4262. var PartNumber = params.PartNumber * 1;
  4263. var CopySourceRange = params.CopySourceRange;
  4264. var ChunkRetryTimes = this.options.ChunkRetryTimes + 1;
  4265. var self = this;
  4266. Async.retry(ChunkRetryTimes, function (tryCallback) {
  4267. self.uploadPartCopy({
  4268. TaskId: TaskId,
  4269. Bucket: Bucket,
  4270. Region: Region,
  4271. Key: Key,
  4272. CopySource: CopySource,
  4273. UploadId: UploadId,
  4274. PartNumber:PartNumber,
  4275. CopySourceRange:CopySourceRange,
  4276. onProgress:params.onProgress,
  4277. },function (err,data) {
  4278. tryCallback(err || null, data);
  4279. })
  4280. }, function (err, data) {
  4281. return callback(err, data);
  4282. });
  4283. }
  4284. var API_MAP = {
  4285. abortUploadTask: abortUploadTask,
  4286. sliceCopyFile: sliceCopyFile,
  4287. };
  4288. module.exports.init = function (COS, task) {
  4289. util.each(API_MAP, function (fn, apiName) {
  4290. COS.prototype[apiName] = util.apiWrapper(apiName, fn);
  4291. });
  4292. };
  4293. /***/ }),
  4294. /* 14 */
  4295. /***/ (function(module, exports) {
  4296. var eachLimit = function (arr, limit, iterator, callback) {
  4297. callback = callback || function () {};
  4298. if (!arr.length || limit <= 0) {
  4299. return callback();
  4300. }
  4301. var completed = 0;
  4302. var started = 0;
  4303. var running = 0;
  4304. (function replenish () {
  4305. if (completed >= arr.length) {
  4306. return callback();
  4307. }
  4308. while (running < limit && started < arr.length) {
  4309. started += 1;
  4310. running += 1;
  4311. iterator(arr[started - 1], function (err) {
  4312. if (err) {
  4313. callback(err);
  4314. callback = function () {};
  4315. } else {
  4316. completed += 1;
  4317. running -= 1;
  4318. if (completed >= arr.length) {
  4319. callback();
  4320. } else {
  4321. replenish();
  4322. }
  4323. }
  4324. });
  4325. }
  4326. })();
  4327. };
  4328. var retry = function (times, iterator, callback) {
  4329. var next = function (index) {
  4330. iterator(function (err, data) {
  4331. if (err && index < times) {
  4332. next(index + 1);
  4333. } else {
  4334. callback(err, data);
  4335. }
  4336. });
  4337. };
  4338. if (times < 1) {
  4339. callback();
  4340. } else {
  4341. next(1);
  4342. }
  4343. };
  4344. var async = {
  4345. eachLimit: eachLimit,
  4346. retry: retry
  4347. };
  4348. module.exports = async;
  4349. /***/ }),
  4350. /* 15 */
  4351. /***/ (function(module, exports, __webpack_require__) {
  4352. var REQUEST = __webpack_require__(9);
  4353. var base64 = __webpack_require__(1);
  4354. var util = __webpack_require__(0);
  4355. // Bucket 相关
  4356. /**
  4357. * 获取用户的 bucket 列表
  4358. * @param {Object} params 回调函数,必须,下面为参数列表
  4359. * 无特殊参数
  4360. * @param {Function} callback 回调函数,必须
  4361. */
  4362. function getService(params, callback) {
  4363. if (typeof params === 'function') {
  4364. callback = params;
  4365. params = {};
  4366. }
  4367. var protocol = 'https:';
  4368. var domain = this.options.ServiceDomain;
  4369. var appId = params.AppId || this.options.appId;
  4370. var region = params.Region;
  4371. if (domain) {
  4372. domain = domain.replace(/\{\{AppId\}\}/ig, appId || '')
  4373. .replace(/\{\{Region\}\}/ig, region || '').replace(/\{\{.*?\}\}/ig, '');
  4374. if (!/^[a-zA-Z]+:\/\//.test(domain)) {
  4375. domain = protocol + '//' + domain;
  4376. }
  4377. if (domain.slice(-1) === '/') {
  4378. domain = domain.slice(0, -1);
  4379. }
  4380. } else if(region){
  4381. domain = protocol + '//cos.'+ region + '.myqcloud.com';
  4382. } else {
  4383. domain = protocol + '//service.cos.myqcloud.com';
  4384. }
  4385. submitRequest.call(this, {
  4386. Action: 'name/cos:GetService',
  4387. url: domain + '/',
  4388. method: 'GET',
  4389. }, function (err, data) {
  4390. if (err) {
  4391. return callback(err);
  4392. }
  4393. var buckets = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Buckets
  4394. && data.ListAllMyBucketsResult.Buckets.Bucket) || [];
  4395. buckets = util.isArray(buckets) ? buckets : [buckets];
  4396. var owner = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Owner) || {};
  4397. callback(null, {
  4398. Buckets: buckets,
  4399. Owner: owner,
  4400. statusCode: data.statusCode,
  4401. headers: data.headers,
  4402. });
  4403. });
  4404. }
  4405. /**
  4406. * 查看是否存在该Bucket,是否有权限访问
  4407. * @param {Object} params 参数对象,必须
  4408. * @param {String} params.Bucket Bucket名称,必须
  4409. * @param {String} params.Region 地域名称,必须
  4410. * @param {Function} callback 回调函数,必须
  4411. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4412. * @return {Object} data 返回的数据
  4413. * @return {Boolean} data.BucketExist Bucket是否存在
  4414. * @return {Boolean} data.BucketAuth 是否有 Bucket 的访问权限
  4415. */
  4416. function headBucket(params, callback) {
  4417. submitRequest.call(this, {
  4418. Action: 'name/cos:HeadBucket',
  4419. Bucket: params.Bucket,
  4420. Region: params.Region,
  4421. headers: params.Headers,
  4422. method: 'HEAD',
  4423. }, function (err, data) {
  4424. callback(err, data);
  4425. });
  4426. }
  4427. /**
  4428. * 获取 Bucket 下的 object 列表
  4429. * @param {Object} params 参数对象,必须
  4430. * @param {String} params.Bucket Bucket名称,必须
  4431. * @param {String} params.Region 地域名称,必须
  4432. * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须
  4433. * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,非必须
  4434. * @param {String} params.Marker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须
  4435. * @param {String} params.MaxKeys 单次返回最大的条目数量,默认1000,非必须
  4436. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  4437. * @param {Function} callback 回调函数,必须
  4438. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4439. * @return {Object} data 返回的数据
  4440. * @return {Object} data.ListBucketResult 返回的 object 列表信息
  4441. */
  4442. function getBucket(params, callback) {
  4443. var reqParams = {};
  4444. reqParams['prefix'] = params['Prefix'] || '';
  4445. reqParams['delimiter'] = params['Delimiter'];
  4446. reqParams['marker'] = params['Marker'];
  4447. reqParams['max-keys'] = params['MaxKeys'];
  4448. reqParams['encoding-type'] = params['EncodingType'];
  4449. submitRequest.call(this, {
  4450. Action: 'name/cos:GetBucket',
  4451. ResourceKey: reqParams['prefix'],
  4452. method: 'GET',
  4453. Bucket: params.Bucket,
  4454. Region: params.Region,
  4455. headers: params.Headers,
  4456. qs: reqParams,
  4457. }, function (err, data) {
  4458. if (err) {
  4459. return callback(err);
  4460. }
  4461. var ListBucketResult = data.ListBucketResult || {};
  4462. var Contents = ListBucketResult.Contents || [];
  4463. var CommonPrefixes = ListBucketResult.CommonPrefixes || [];
  4464. Contents = util.isArray(Contents) ? Contents : [Contents];
  4465. CommonPrefixes = util.isArray(CommonPrefixes) ? CommonPrefixes : [CommonPrefixes];
  4466. var result = util.clone(ListBucketResult);
  4467. util.extend(result, {
  4468. Contents: Contents,
  4469. CommonPrefixes: CommonPrefixes,
  4470. statusCode: data.statusCode,
  4471. headers: data.headers,
  4472. });
  4473. callback(null, result);
  4474. });
  4475. }
  4476. /**
  4477. * 创建 Bucket,并初始化访问权限
  4478. * @param {Object} params 参数对象,必须
  4479. * @param {String} params.Bucket Bucket名称,必须
  4480. * @param {String} params.Region 地域名称,必须
  4481. * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须
  4482. * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=" ",uin=" ",非必须
  4483. * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=" ",uin=" ",非必须
  4484. * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=" ",uin=" ",非必须
  4485. * @param {Function} callback 回调函数,必须
  4486. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4487. * @return {Object} data 返回的数据
  4488. * @return {String} data.Location 操作地址
  4489. */
  4490. function putBucket(params, callback) {
  4491. var self = this;
  4492. var headers = {};
  4493. headers['x-cos-acl'] = params['ACL'];
  4494. headers['x-cos-grant-read'] = params['GrantRead'];
  4495. headers['x-cos-grant-write'] = params['GrantWrite'];
  4496. headers['x-cos-grant-read-acp'] = params['GrantReadAcp'];
  4497. headers['x-cos-grant-write-acp'] = params['GrantWriteAcp'];
  4498. headers['x-cos-grant-full-control'] = params['GrantFullControl'];
  4499. submitRequest.call(this, {
  4500. Action: 'name/cos:PutBucket',
  4501. method: 'PUT',
  4502. Bucket: params.Bucket,
  4503. Region: params.Region,
  4504. headers: headers,
  4505. }, function (err, data) {
  4506. if (err) {
  4507. return callback(err);
  4508. }
  4509. var url = getUrl({
  4510. domain: self.options.Domain,
  4511. bucket: params.Bucket,
  4512. region: params.Region,
  4513. isLocation: true,
  4514. });
  4515. callback(null, {
  4516. Location: url,
  4517. statusCode: data.statusCode,
  4518. headers: data.headers,
  4519. });
  4520. });
  4521. }
  4522. /**
  4523. * 删除 Bucket
  4524. * @param {Object} params 参数对象,必须
  4525. * @param {String} params.Bucket Bucket名称,必须
  4526. * @param {String} params.Region 地域名称,必须
  4527. * @param {Function} callback 回调函数,必须
  4528. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4529. * @return {Object} data 返回的数据
  4530. * @return {String} data.Location 操作地址
  4531. */
  4532. function deleteBucket(params, callback) {
  4533. submitRequest.call(this, {
  4534. Action: 'name/cos:DeleteBucket',
  4535. Bucket: params.Bucket,
  4536. Region: params.Region,
  4537. headers: params.Headers,
  4538. method: 'DELETE',
  4539. }, function (err, data) {
  4540. if (err && err.statusCode === 204) {
  4541. return callback(null, {statusCode: err.statusCode});
  4542. } else if (err) {
  4543. return callback(err);
  4544. }
  4545. callback(null, {
  4546. statusCode: data.statusCode,
  4547. headers: data.headers,
  4548. });
  4549. });
  4550. }
  4551. /**
  4552. * 获取 Bucket 的 权限列表
  4553. * @param {Object} params 参数对象,必须
  4554. * @param {String} params.Bucket Bucket名称,必须
  4555. * @param {String} params.Region 地域名称,必须
  4556. * @param {Function} callback 回调函数,必须
  4557. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4558. * @return {Object} data 返回的数据
  4559. * @return {Object} data.AccessControlPolicy 访问权限信息
  4560. */
  4561. function getBucketAcl(params, callback) {
  4562. submitRequest.call(this, {
  4563. Action: 'name/cos:GetBucketACL',
  4564. method: 'GET',
  4565. Bucket: params.Bucket,
  4566. Region: params.Region,
  4567. headers: params.Headers,
  4568. action: 'acl',
  4569. }, function (err, data) {
  4570. if (err) {
  4571. return callback(err);
  4572. }
  4573. var AccessControlPolicy = data.AccessControlPolicy || {};
  4574. var Owner = AccessControlPolicy.Owner || {};
  4575. var Grant = AccessControlPolicy.AccessControlList.Grant || [];
  4576. Grant = util.isArray(Grant) ? Grant : [Grant];
  4577. var result = decodeAcl(AccessControlPolicy);
  4578. if (data.headers && data.headers['x-cos-acl']) {
  4579. result.ACL = data.headers['x-cos-acl'];
  4580. }
  4581. result = util.extend(result, {
  4582. Owner: Owner,
  4583. Grants: Grant,
  4584. statusCode: data.statusCode,
  4585. headers: data.headers,
  4586. });
  4587. callback(null, result);
  4588. });
  4589. }
  4590. /**
  4591. * 设置 Bucket 的 权限列表
  4592. * @param {Object} params 参数对象,必须
  4593. * @param {String} params.Bucket Bucket名称,必须
  4594. * @param {String} params.Region 地域名称,必须
  4595. * @param {String} params.ACL 用户自定义文件权限,可以设置:private,public-read;默认值:private,非必须
  4596. * @param {String} params.GrantRead 赋予被授权者读的权限,格式x-cos-grant-read: uin=" ",uin=" ",非必须
  4597. * @param {String} params.GrantWrite 赋予被授权者写的权限,格式x-cos-grant-write: uin=" ",uin=" ",非必须
  4598. * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式x-cos-grant-full-control: uin=" ",uin=" ",非必须
  4599. * @param {Function} callback 回调函数,必须
  4600. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4601. * @return {Object} data 返回的数据
  4602. */
  4603. function putBucketAcl(params, callback) {
  4604. var headers = params.Headers;
  4605. var xml = '';
  4606. if (params['AccessControlPolicy']) {
  4607. var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});
  4608. var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;
  4609. Grants = util.isArray(Grants) ? Grants : [Grants];
  4610. delete AccessControlPolicy.Grant;
  4611. delete AccessControlPolicy.Grants;
  4612. AccessControlPolicy.AccessControlList = {Grant: Grants};
  4613. xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});
  4614. headers['Content-Type'] = 'application/xml';
  4615. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  4616. }
  4617. // Grant Header 去重
  4618. util.each(headers, function (val, key) {
  4619. if (key.indexOf('x-cos-grant-') === 0) {
  4620. headers[key] = uniqGrant(headers[key]);
  4621. }
  4622. });
  4623. submitRequest.call(this, {
  4624. Action: 'name/cos:PutBucketACL',
  4625. method: 'PUT',
  4626. Bucket: params.Bucket,
  4627. Region: params.Region,
  4628. headers: headers,
  4629. action: 'acl',
  4630. body: xml,
  4631. }, function (err, data) {
  4632. if (err) {
  4633. return callback(err);
  4634. }
  4635. callback(null, {
  4636. statusCode: data.statusCode,
  4637. headers: data.headers,
  4638. });
  4639. });
  4640. }
  4641. /**
  4642. * 获取 Bucket 的 跨域设置
  4643. * @param {Object} params 参数对象,必须
  4644. * @param {String} params.Bucket Bucket名称,必须
  4645. * @param {String} params.Region 地域名称,必须
  4646. * @param {Function} callback 回调函数,必须
  4647. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4648. * @return {Object} data 返回的数据
  4649. * @return {Object} data.CORSRules Bucket的跨域设置
  4650. */
  4651. function getBucketCors(params, callback) {
  4652. submitRequest.call(this, {
  4653. Action: 'name/cos:GetBucketCORS',
  4654. method: 'GET',
  4655. Bucket: params.Bucket,
  4656. Region: params.Region,
  4657. headers: params.Headers,
  4658. action: 'cors',
  4659. }, function (err, data) {
  4660. if (err) {
  4661. if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchCORSConfiguration') {
  4662. var result = {
  4663. CORSRules: [],
  4664. statusCode: err.statusCode,
  4665. };
  4666. err.headers && (result.headers = err.headers);
  4667. callback(null, result);
  4668. } else {
  4669. callback(err);
  4670. }
  4671. return;
  4672. }
  4673. var CORSConfiguration = data.CORSConfiguration || {};
  4674. var CORSRules = CORSConfiguration.CORSRules || CORSConfiguration.CORSRule || [];
  4675. CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
  4676. util.each(CORSRules, function (rule) {
  4677. util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key, j) {
  4678. var sKey = key + 's';
  4679. var val = rule[sKey] || rule[key] || [];
  4680. delete rule[key];
  4681. rule[sKey] = util.isArray(val) ? val : [val];
  4682. });
  4683. });
  4684. callback(null, {
  4685. CORSRules: CORSRules,
  4686. statusCode: data.statusCode,
  4687. headers: data.headers,
  4688. });
  4689. });
  4690. }
  4691. /**
  4692. * 设置 Bucket 的 跨域设置
  4693. * @param {Object} params 参数对象,必须
  4694. * @param {String} params.Bucket Bucket名称,必须
  4695. * @param {String} params.Region 地域名称,必须
  4696. * @param {Object} params.CORSConfiguration 相关的跨域设置,必须
  4697. * @param {Array} params.CORSConfiguration.CORSRules 对应的跨域规则
  4698. * @param {Function} callback 回调函数,必须
  4699. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4700. * @return {Object} data 返回的数据
  4701. */
  4702. function putBucketCors(params, callback) {
  4703. var CORSConfiguration = params['CORSConfiguration'] || {};
  4704. var CORSRules = CORSConfiguration['CORSRules'] || params['CORSRules'] || [];
  4705. CORSRules = util.clone(util.isArray(CORSRules) ? CORSRules : [CORSRules]);
  4706. util.each(CORSRules, function (rule) {
  4707. util.each(['AllowedOrigin', 'AllowedHeader', 'AllowedMethod', 'ExposeHeader'], function (key, k) {
  4708. var sKey = key + 's';
  4709. var val = rule[sKey] || rule[key] || [];
  4710. delete rule[sKey];
  4711. rule[key] = util.isArray(val) ? val : [val];
  4712. });
  4713. });
  4714. var xml = util.json2xml({CORSConfiguration: {CORSRule: CORSRules}});
  4715. var headers = params.Headers;
  4716. headers['Content-Type'] = 'application/xml';
  4717. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  4718. submitRequest.call(this, {
  4719. Action: 'name/cos:PutBucketCORS',
  4720. method: 'PUT',
  4721. Bucket: params.Bucket,
  4722. Region: params.Region,
  4723. body: xml,
  4724. action: 'cors',
  4725. headers: headers,
  4726. }, function (err, data) {
  4727. if (err) {
  4728. return callback(err);
  4729. }
  4730. callback(null, {
  4731. statusCode: data.statusCode,
  4732. headers: data.headers,
  4733. });
  4734. });
  4735. }
  4736. /**
  4737. * 删除 Bucket 的 跨域设置
  4738. * @param {Object} params 参数对象,必须
  4739. * @param {String} params.Bucket Bucket名称,必须
  4740. * @param {String} params.Region 地域名称,必须
  4741. * @param {Function} callback 回调函数,必须
  4742. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4743. * @return {Object} data 返回的数据
  4744. */
  4745. function deleteBucketCors(params, callback) {
  4746. submitRequest.call(this, {
  4747. Action: 'name/cos:DeleteBucketCORS',
  4748. method: 'DELETE',
  4749. Bucket: params.Bucket,
  4750. Region: params.Region,
  4751. headers: params.Headers,
  4752. action: 'cors',
  4753. }, function (err, data) {
  4754. if (err && err.statusCode === 204) {
  4755. return callback(null, {statusCode: err.statusCode});
  4756. } else if (err) {
  4757. return callback(err);
  4758. }
  4759. callback(null, {
  4760. statusCode: data.statusCode || err.statusCode,
  4761. headers: data.headers,
  4762. });
  4763. });
  4764. }
  4765. function putBucketPolicy(params, callback) {
  4766. var Policy = params['Policy'];
  4767. var PolicyStr = Policy;
  4768. try {
  4769. if (typeof Policy === 'string') {
  4770. Policy = JSON.parse(PolicyStr);
  4771. } else {
  4772. PolicyStr = JSON.stringify(Policy);
  4773. }
  4774. } catch (e) {
  4775. callback({error: 'Policy format error'});
  4776. }
  4777. var headers = params.Headers;
  4778. headers['Content-Type'] = 'application/json';
  4779. headers['Content-MD5'] = util.binaryBase64(util.md5(PolicyStr));
  4780. submitRequest.call(this, {
  4781. Action: 'name/cos:PutBucketPolicy',
  4782. method: 'PUT',
  4783. Bucket: params.Bucket,
  4784. Region: params.Region,
  4785. action: 'policy',
  4786. body: util.isBrowser ? PolicyStr : Policy,
  4787. headers: headers,
  4788. json: true,
  4789. }, function (err, data) {
  4790. if (err && err.statusCode === 204) {
  4791. return callback(null, {statusCode: err.statusCode});
  4792. } else if (err) {
  4793. return callback(err);
  4794. }
  4795. callback(null, {
  4796. statusCode: data.statusCode,
  4797. headers: data.headers,
  4798. });
  4799. });
  4800. }
  4801. /**
  4802. * 删除 Bucket 的 跨域设置
  4803. * @param {Object} params 参数对象,必须
  4804. * @param {String} params.Bucket Bucket名称,必须
  4805. * @param {String} params.Region 地域名称,必须
  4806. * @param {Function} callback 回调函数,必须
  4807. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4808. * @return {Object} data 返回的数据
  4809. */
  4810. function deleteBucketPolicy(params, callback) {
  4811. submitRequest.call(this, {
  4812. Action: 'name/cos:DeleteBucketPolicy',
  4813. method: 'DELETE',
  4814. Bucket: params.Bucket,
  4815. Region: params.Region,
  4816. headers: params.Headers,
  4817. action: 'policy',
  4818. }, function (err, data) {
  4819. if (err && err.statusCode === 204) {
  4820. return callback(null, {statusCode: err.statusCode});
  4821. } else if (err) {
  4822. return callback(err);
  4823. }
  4824. callback(null, {
  4825. statusCode: data.statusCode || err.statusCode,
  4826. headers: data.headers,
  4827. });
  4828. });
  4829. }
  4830. /**
  4831. * 获取 Bucket 的 地域信息
  4832. * @param {Object} params 参数对象,必须
  4833. * @param {String} params.Bucket Bucket名称,必须
  4834. * @param {String} params.Region 地域名称,必须
  4835. * @param {Function} callback 回调函数,必须
  4836. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4837. * @return {Object} data 返回数据,包含地域信息 LocationConstraint
  4838. */
  4839. function getBucketLocation(params, callback) {
  4840. submitRequest.call(this, {
  4841. Action: 'name/cos:GetBucketLocation',
  4842. method: 'GET',
  4843. Bucket: params.Bucket,
  4844. Region: params.Region,
  4845. headers: params.Headers,
  4846. action: 'location',
  4847. }, function (err, data) {
  4848. if (err) {
  4849. return callback(err);
  4850. }
  4851. callback(null, data);
  4852. });
  4853. }
  4854. /**
  4855. * 获取 Bucket 的读取权限策略
  4856. * @param {Object} params 参数对象,必须
  4857. * @param {String} params.Bucket Bucket名称,必须
  4858. * @param {String} params.Region 地域名称,必须
  4859. * @param {Function} callback 回调函数,必须
  4860. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4861. * @return {Object} data 返回数据
  4862. */
  4863. function getBucketPolicy(params, callback) {
  4864. submitRequest.call(this, {
  4865. Action: 'name/cos:GetBucketPolicy',
  4866. method: 'GET',
  4867. Bucket: params.Bucket,
  4868. Region: params.Region,
  4869. headers: params.Headers,
  4870. action: 'policy',
  4871. rawBody: true,
  4872. }, function (err, data) {
  4873. if (err) {
  4874. if (err.statusCode && err.statusCode === 403) {
  4875. return callback({ErrorStatus: 'Access Denied'});
  4876. }
  4877. if (err.statusCode && err.statusCode === 405) {
  4878. return callback({ErrorStatus: 'Method Not Allowed'});
  4879. }
  4880. if (err.statusCode && err.statusCode === 404) {
  4881. return callback({ErrorStatus: 'Policy Not Found'});
  4882. }
  4883. return callback(err);
  4884. }
  4885. var Policy = {};
  4886. try {
  4887. Policy = JSON.parse(data.body);
  4888. } catch (e) {
  4889. }
  4890. callback(null, {
  4891. Policy: Policy,
  4892. statusCode: data.statusCode,
  4893. headers: data.headers,
  4894. });
  4895. });
  4896. }
  4897. /**
  4898. * 获取 Bucket 的标签设置
  4899. * @param {Object} params 参数对象,必须
  4900. * @param {String} params.Bucket Bucket名称,必须
  4901. * @param {String} params.Region 地域名称,必须
  4902. * @param {Function} callback 回调函数,必须
  4903. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4904. * @return {Object} data 返回数据
  4905. */
  4906. function getBucketTagging(params, callback) {
  4907. submitRequest.call(this, {
  4908. Action: 'name/cos:GetBucketTagging',
  4909. method: 'GET',
  4910. Bucket: params.Bucket,
  4911. Region: params.Region,
  4912. headers: params.Headers,
  4913. action: 'tagging',
  4914. }, function (err, data) {
  4915. if (err) {
  4916. if (err.statusCode === 404 && err.error && (err.error === "Not Found" || err.error.Code === 'NoSuchTagSet')) {
  4917. var result = {
  4918. Tags: [],
  4919. statusCode: err.statusCode,
  4920. };
  4921. err.headers && (result.headers = err.headers);
  4922. callback(null, result);
  4923. } else {
  4924. callback(err);
  4925. }
  4926. return;
  4927. }
  4928. var Tags = [];
  4929. try {
  4930. Tags = data.Tagging.TagSet.Tag || [];
  4931. } catch (e) {
  4932. }
  4933. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  4934. callback(null, {
  4935. Tags: Tags,
  4936. statusCode: data.statusCode,
  4937. headers: data.headers,
  4938. });
  4939. });
  4940. }
  4941. /**
  4942. * 设置 Bucket 的标签
  4943. * @param {Object} params 参数对象,必须
  4944. * @param {String} params.Bucket Bucket名称,必须
  4945. * @param {String} params.Region 地域名称,必须
  4946. * @param {Array} params.TagSet 标签设置,必须
  4947. * @param {Function} callback 回调函数,必须
  4948. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4949. * @return {Object} data 返回数据
  4950. */
  4951. function putBucketTagging(params, callback) {
  4952. var Tagging = params['Tagging'] || {};
  4953. var Tags = Tagging.TagSet || Tagging.Tags || params['Tags'] || [];
  4954. Tags = util.clone(util.isArray(Tags) ? Tags : [Tags]);
  4955. var xml = util.json2xml({Tagging: {TagSet: {Tag: Tags}}});
  4956. var headers = params.Headers;
  4957. headers['Content-Type'] = 'application/xml';
  4958. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  4959. submitRequest.call(this, {
  4960. Action: 'name/cos:PutBucketTagging',
  4961. method: 'PUT',
  4962. Bucket: params.Bucket,
  4963. Region: params.Region,
  4964. body: xml,
  4965. action: 'tagging',
  4966. headers: headers,
  4967. }, function (err, data) {
  4968. if (err && err.statusCode === 204) {
  4969. return callback(null, {statusCode: err.statusCode});
  4970. } else if (err) {
  4971. return callback(err);
  4972. }
  4973. callback(null, {
  4974. statusCode: data.statusCode,
  4975. headers: data.headers,
  4976. });
  4977. });
  4978. }
  4979. /**
  4980. * 删除 Bucket 的 标签设置
  4981. * @param {Object} params 参数对象,必须
  4982. * @param {String} params.Bucket Bucket名称,必须
  4983. * @param {String} params.Region 地域名称,必须
  4984. * @param {Function} callback 回调函数,必须
  4985. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  4986. * @return {Object} data 返回的数据
  4987. */
  4988. function deleteBucketTagging(params, callback) {
  4989. submitRequest.call(this, {
  4990. Action: 'name/cos:DeleteBucketTagging',
  4991. method: 'DELETE',
  4992. Bucket: params.Bucket,
  4993. Region: params.Region,
  4994. headers: params.Headers,
  4995. action: 'tagging',
  4996. }, function (err, data) {
  4997. if (err && err.statusCode === 204) {
  4998. return callback(null, {statusCode: err.statusCode});
  4999. } else if (err) {
  5000. return callback(err);
  5001. }
  5002. callback(null, {
  5003. statusCode: data.statusCode,
  5004. headers: data.headers,
  5005. });
  5006. });
  5007. }
  5008. function putBucketLifecycle(params, callback) {
  5009. var LifecycleConfiguration = params['LifecycleConfiguration'] || {};
  5010. var Rules = LifecycleConfiguration.Rules || params.Rules || [];
  5011. Rules = util.clone(Rules);
  5012. var xml = util.json2xml({LifecycleConfiguration: {Rule: Rules}});
  5013. var headers = params.Headers;
  5014. headers['Content-Type'] = 'application/xml';
  5015. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5016. submitRequest.call(this, {
  5017. Action: 'name/cos:PutBucketLifecycle',
  5018. method: 'PUT',
  5019. Bucket: params.Bucket,
  5020. Region: params.Region,
  5021. body: xml,
  5022. action: 'lifecycle',
  5023. headers: headers,
  5024. }, function (err, data) {
  5025. if (err && err.statusCode === 204) {
  5026. return callback(null, {statusCode: err.statusCode});
  5027. } else if (err) {
  5028. return callback(err);
  5029. }
  5030. callback(null, {
  5031. statusCode: data.statusCode,
  5032. headers: data.headers,
  5033. });
  5034. });
  5035. }
  5036. function getBucketLifecycle(params, callback) {
  5037. submitRequest.call(this, {
  5038. Action: 'name/cos:GetBucketLifecycle',
  5039. method: 'GET',
  5040. Bucket: params.Bucket,
  5041. Region: params.Region,
  5042. headers: params.Headers,
  5043. action: 'lifecycle',
  5044. }, function (err, data) {
  5045. if (err) {
  5046. if (err.statusCode === 404 && err.error && err.error.Code === 'NoSuchLifecycleConfiguration') {
  5047. var result = {
  5048. Rules: [],
  5049. statusCode: err.statusCode,
  5050. };
  5051. err.headers && (result.headers = err.headers);
  5052. callback(null, result);
  5053. } else {
  5054. callback(err);
  5055. }
  5056. return;
  5057. }
  5058. var Rules = [];
  5059. try {
  5060. Rules = data.LifecycleConfiguration.Rule || [];
  5061. } catch (e) {
  5062. }
  5063. Rules = util.clone(util.isArray(Rules) ? Rules : [Rules]);
  5064. callback(null, {
  5065. Rules: Rules,
  5066. statusCode: data.statusCode,
  5067. headers: data.headers,
  5068. });
  5069. });
  5070. }
  5071. function deleteBucketLifecycle(params, callback) {
  5072. submitRequest.call(this, {
  5073. Action: 'name/cos:DeleteBucketLifecycle',
  5074. method: 'DELETE',
  5075. Bucket: params.Bucket,
  5076. Region: params.Region,
  5077. headers: params.Headers,
  5078. action: 'lifecycle',
  5079. }, function (err, data) {
  5080. if (err && err.statusCode === 204) {
  5081. return callback(null, {statusCode: err.statusCode});
  5082. } else if (err) {
  5083. return callback(err);
  5084. }
  5085. callback(null, {
  5086. statusCode: data.statusCode,
  5087. headers: data.headers,
  5088. });
  5089. });
  5090. }
  5091. function putBucketVersioning(params, callback) {
  5092. if (!params['VersioningConfiguration']) {
  5093. callback({error: 'missing param VersioningConfiguration'});
  5094. return;
  5095. }
  5096. var VersioningConfiguration = params['VersioningConfiguration'] || {};
  5097. var xml = util.json2xml({VersioningConfiguration: VersioningConfiguration});
  5098. var headers = params.Headers;
  5099. headers['Content-Type'] = 'application/xml';
  5100. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5101. submitRequest.call(this, {
  5102. Action: 'name/cos:PutBucketVersioning',
  5103. method: 'PUT',
  5104. Bucket: params.Bucket,
  5105. Region: params.Region,
  5106. body: xml,
  5107. action: 'versioning',
  5108. headers: headers,
  5109. }, function (err, data) {
  5110. if (err && err.statusCode === 204) {
  5111. return callback(null, {statusCode: err.statusCode});
  5112. } else if (err) {
  5113. return callback(err);
  5114. }
  5115. callback(null, {
  5116. statusCode: data.statusCode,
  5117. headers: data.headers,
  5118. });
  5119. });
  5120. }
  5121. function getBucketVersioning(params, callback) {
  5122. submitRequest.call(this, {
  5123. Action: 'name/cos:GetBucketVersioning',
  5124. method: 'GET',
  5125. Bucket: params.Bucket,
  5126. Region: params.Region,
  5127. headers: params.Headers,
  5128. action: 'versioning',
  5129. }, function (err, data) {
  5130. if (!err) {
  5131. !data.VersioningConfiguration && (data.VersioningConfiguration = {});
  5132. }
  5133. callback(err, data);
  5134. });
  5135. }
  5136. function putBucketReplication(params, callback) {
  5137. var ReplicationConfiguration = util.clone(params.ReplicationConfiguration);
  5138. var xml = util.json2xml({ReplicationConfiguration: ReplicationConfiguration});
  5139. xml = xml.replace(/<(\/?)Rules>/ig, '<$1Rule>');
  5140. xml = xml.replace(/<(\/?)Tags>/ig, '<$1Tag>');
  5141. var headers = params.Headers;
  5142. headers['Content-Type'] = 'application/xml';
  5143. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5144. submitRequest.call(this, {
  5145. Action: 'name/cos:PutBucketReplication',
  5146. method: 'PUT',
  5147. Bucket: params.Bucket,
  5148. Region: params.Region,
  5149. body: xml,
  5150. action: 'replication',
  5151. headers: headers,
  5152. }, function (err, data) {
  5153. if (err && err.statusCode === 204) {
  5154. return callback(null, {statusCode: err.statusCode});
  5155. } else if (err) {
  5156. return callback(err);
  5157. }
  5158. callback(null, {
  5159. statusCode: data.statusCode,
  5160. headers: data.headers,
  5161. });
  5162. });
  5163. }
  5164. function getBucketReplication(params, callback) {
  5165. submitRequest.call(this, {
  5166. Action: 'name/cos:GetBucketReplication',
  5167. method: 'GET',
  5168. Bucket: params.Bucket,
  5169. Region: params.Region,
  5170. headers: params.Headers,
  5171. action: 'replication',
  5172. }, function (err, data) {
  5173. if (err) {
  5174. if (err.statusCode === 404 && err.error && (err.error === 'Not Found' || err.error.Code === 'ReplicationConfigurationnotFoundError')) {
  5175. var result = {
  5176. ReplicationConfiguration: {Rules: []},
  5177. statusCode: err.statusCode,
  5178. };
  5179. err.headers && (result.headers = err.headers);
  5180. callback(null, result);
  5181. } else {
  5182. callback(err);
  5183. }
  5184. return;
  5185. }
  5186. if (!err) {
  5187. !data.ReplicationConfiguration && (data.ReplicationConfiguration = {});
  5188. }
  5189. if (data.ReplicationConfiguration.Rule) {
  5190. data.ReplicationConfiguration.Rules = data.ReplicationConfiguration.Rule;
  5191. delete data.ReplicationConfiguration.Rule;
  5192. }
  5193. callback(err, data);
  5194. });
  5195. }
  5196. function deleteBucketReplication(params, callback) {
  5197. submitRequest.call(this, {
  5198. Action: 'name/cos:DeleteBucketReplication',
  5199. method: 'DELETE',
  5200. Bucket: params.Bucket,
  5201. Region: params.Region,
  5202. headers: params.Headers,
  5203. action: 'replication',
  5204. }, function (err, data) {
  5205. if (err && err.statusCode === 204) {
  5206. return callback(null, {statusCode: err.statusCode});
  5207. } else if (err) {
  5208. return callback(err);
  5209. }
  5210. callback(null, {
  5211. statusCode: data.statusCode,
  5212. headers: data.headers,
  5213. });
  5214. });
  5215. }
  5216. // Object 相关
  5217. /**
  5218. * 取回对应Object的元数据,Head的权限与Get的权限一致
  5219. * @param {Object} params 参数对象,必须
  5220. * @param {String} params.Bucket Bucket名称,必须
  5221. * @param {String} params.Region 地域名称,必须
  5222. * @param {String} params.Key 文件名称,必须
  5223. * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须
  5224. * @param {Function} callback 回调函数,必须
  5225. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5226. * @return {Object} data 为指定 object 的元数据,如果设置了 IfModifiedSince ,且文件未修改,则返回一个对象,NotModified 属性为 true
  5227. * @return {Boolean} data.NotModified 是否在 IfModifiedSince 时间点之后未修改该 object,则为 true
  5228. */
  5229. function headObject(params, callback) {
  5230. submitRequest.call(this, {
  5231. Action: 'name/cos:HeadObject',
  5232. method: 'HEAD',
  5233. Bucket: params.Bucket,
  5234. Region: params.Region,
  5235. Key: params.Key,
  5236. VersionId: params.VersionId,
  5237. headers: params.Headers,
  5238. }, function (err, data) {
  5239. if (err) {
  5240. var statusCode = err.statusCode;
  5241. if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {
  5242. return callback(null, {
  5243. NotModified: true,
  5244. statusCode: statusCode,
  5245. });
  5246. }
  5247. return callback(err);
  5248. }
  5249. if (data.headers) {
  5250. var headers = data.headers;
  5251. data.ETag = headers.etag || headers.Etag || headers.ETag || '';
  5252. }
  5253. callback(null, data);
  5254. });
  5255. }
  5256. function listObjectVersions(params, callback) {
  5257. var reqParams = {};
  5258. reqParams['prefix'] = params['Prefix'] || '';
  5259. reqParams['delimiter'] = params['Delimiter'];
  5260. reqParams['key-marker'] = params['KeyMarker'];
  5261. reqParams['version-id-marker'] = params['VersionIdMarker'];
  5262. reqParams['max-keys'] = params['MaxKeys'];
  5263. reqParams['encoding-type'] = params['EncodingType'];
  5264. submitRequest.call(this, {
  5265. Action: 'name/cos:GetBucketObjectVersions',
  5266. ResourceKey: reqParams['prefix'],
  5267. method: 'GET',
  5268. Bucket: params.Bucket,
  5269. Region: params.Region,
  5270. headers: params.Headers,
  5271. qs: reqParams,
  5272. action: 'versions',
  5273. }, function (err, data) {
  5274. if (err) {
  5275. return callback(err);
  5276. }
  5277. var ListVersionsResult = data.ListVersionsResult || {};
  5278. var DeleteMarkers = ListVersionsResult.DeleteMarker || [];
  5279. DeleteMarkers = util.isArray(DeleteMarkers) ? DeleteMarkers : [DeleteMarkers];
  5280. var Versions = ListVersionsResult.Version || [];
  5281. Versions = util.isArray(Versions) ? Versions : [Versions];
  5282. var result = util.clone(ListVersionsResult);
  5283. delete result.DeleteMarker;
  5284. delete result.Version;
  5285. util.extend(result, {
  5286. DeleteMarkers: DeleteMarkers,
  5287. Versions: Versions,
  5288. statusCode: data.statusCode,
  5289. headers: data.headers,
  5290. });
  5291. callback(null, result);
  5292. });
  5293. }
  5294. /**
  5295. * 下载 object
  5296. * @param {Object} params 参数对象,必须
  5297. * @param {String} params.Bucket Bucket名称,必须
  5298. * @param {String} params.Region 地域名称,必须
  5299. * @param {String} params.Key 文件名称,必须
  5300. * @param {WriteStream} params.Output 文件写入流,非必须
  5301. * @param {String} params.IfModifiedSince 当Object在指定时间后被修改,则返回对应Object元信息,否则返回304,非必须
  5302. * @param {String} params.IfUnmodifiedSince 如果文件修改时间早于或等于指定时间,才返回文件内容。否则返回 412 (precondition failed),非必须
  5303. * @param {String} params.IfMatch 当 ETag 与指定的内容一致,才返回文件。否则返回 412 (precondition failed),非必须
  5304. * @param {String} params.IfNoneMatch 当 ETag 与指定的内容不一致,才返回文件。否则返回304 (not modified),非必须
  5305. * @param {String} params.ResponseContentType 设置返回头部中的 Content-Type 参数,非必须
  5306. * @param {String} params.ResponseContentLanguage 设置返回头部中的 Content-Language 参数,非必须
  5307. * @param {String} params.ResponseExpires 设置返回头部中的 Content-Expires 参数,非必须
  5308. * @param {String} params.ResponseCacheControl 设置返回头部中的 Cache-Control 参数,非必须
  5309. * @param {String} params.ResponseContentDisposition 设置返回头部中的 Content-Disposition 参数,非必须
  5310. * @param {String} params.ResponseContentEncoding 设置返回头部中的 Content-Encoding 参数,非必须
  5311. * @param {Function} callback 回调函数,必须
  5312. * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5313. * @param {Object} data 为对应的 object 数据,包括 body 和 headers
  5314. */
  5315. function getObject(params, callback) {
  5316. var reqParams = {};
  5317. reqParams['response-content-type'] = params['ResponseContentType'];
  5318. reqParams['response-content-language'] = params['ResponseContentLanguage'];
  5319. reqParams['response-expires'] = params['ResponseExpires'];
  5320. reqParams['response-cache-control'] = params['ResponseCacheControl'];
  5321. reqParams['response-content-disposition'] = params['ResponseContentDisposition'];
  5322. reqParams['response-content-encoding'] = params['ResponseContentEncoding'];
  5323. // 如果用户自己传入了 output
  5324. submitRequest.call(this, {
  5325. Action: 'name/cos:GetObject',
  5326. method: 'GET',
  5327. Bucket: params.Bucket,
  5328. Region: params.Region,
  5329. Key: params.Key,
  5330. VersionId: params.VersionId,
  5331. headers: params.Headers,
  5332. qs: reqParams,
  5333. rawBody: true,
  5334. }, function (err, data) {
  5335. if (err) {
  5336. var statusCode = err.statusCode;
  5337. if (params.Headers['If-Modified-Since'] && statusCode && statusCode === 304) {
  5338. return callback(null, {
  5339. NotModified: true
  5340. });
  5341. }
  5342. return callback(err);
  5343. }
  5344. var result = {};
  5345. result.Body = data.body;
  5346. if (data && data.headers) {
  5347. var headers = data.headers;
  5348. result.ETag = headers.etag || headers.Etag || headers.ETag || '';
  5349. }
  5350. util.extend(result, {
  5351. statusCode: data.statusCode,
  5352. headers: data.headers,
  5353. });
  5354. callback(null, result);
  5355. });
  5356. }
  5357. /**
  5358. * 上传 object
  5359. * @param {Object} params 参数对象,必须
  5360. * @param {String} params.Bucket Bucket名称,必须
  5361. * @param {String} params.Region 地域名称,必须
  5362. * @param {String} params.Key 文件名称,必须
  5363. * @param {String} params.Body 上传文件的内容,只支持字符串
  5364. * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须
  5365. * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存,非必须
  5366. * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须
  5367. * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),必须
  5368. * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须
  5369. * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须
  5370. * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须
  5371. * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验,非必须
  5372. * @param {String} params.ACL 允许用户自定义文件权限,有效值:private | public-read,非必须
  5373. * @param {String} params.GrantRead 赋予被授权者读的权限,格式 x-cos-grant-read: uin=" ",uin=" ",非必须
  5374. * @param {String} params.GrantWrite 赋予被授权者写的权限,格式 x-cos-grant-write: uin=" ",uin=" ",非必须
  5375. * @param {String} params.GrantFullControl 赋予被授权者读写权限,格式 x-cos-grant-full-control: uin=" ",uin=" ",非必须
  5376. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  5377. * @param {Function} params.onProgress 上传进度回调函数
  5378. * @param {Function} callback 回调函数,必须
  5379. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5380. * @return {Object} data 为对应的 object 数据
  5381. * @return {String} data.ETag 为对应上传文件的 ETag 值
  5382. */
  5383. function putObject(params, callback) {
  5384. var self = this;
  5385. var FileSize = params.ContentLength;
  5386. var onProgress = util.throttleOnProgress.call(self, FileSize, params.onProgress);
  5387. util.getBodyMd5(self.options.UploadCheckContentMd5, params.Body, function (md5) {
  5388. md5 && (params.Headers['Content-MD5'] = util.binaryBase64(md5));
  5389. if (params.ContentLength !== undefined) {
  5390. params.Headers['Content-Length'] = params.ContentLength;
  5391. }
  5392. submitRequest.call(self, {
  5393. Action: 'name/cos:PutObject',
  5394. TaskId: params.TaskId,
  5395. method: 'PUT',
  5396. Bucket: params.Bucket,
  5397. Region: params.Region,
  5398. Key: params.Key,
  5399. headers: params.Headers,
  5400. body: params.Body,
  5401. onProgress: onProgress,
  5402. }, function (err, data) {
  5403. if (err) {
  5404. onProgress(null, true);
  5405. return callback(err);
  5406. }
  5407. onProgress({loaded: FileSize, total: FileSize}, true);
  5408. if (data && data.headers ) {
  5409. var headers = data.headers;
  5410. var ETag = headers.etag || headers.Etag || headers.ETag || '';
  5411. var url = getUrl({
  5412. ForcePathStyle: self.options.ForcePathStyle,
  5413. protocol: self.options.Protocol,
  5414. domain: self.options.Domain,
  5415. bucket: params.Bucket,
  5416. region: params.Region,
  5417. object: params.Key,
  5418. });
  5419. url = url.substr(url.indexOf('://') + 3);
  5420. return callback(null, {
  5421. Location: url,
  5422. ETag: ETag,
  5423. statusCode: data.statusCode,
  5424. headers: headers,
  5425. });
  5426. }
  5427. callback(null, data);
  5428. });
  5429. });
  5430. }
  5431. /**
  5432. * 上传 object
  5433. * @param {Object} params 参数对象,必须
  5434. * @param {String} params.Bucket Bucket名称,必须
  5435. * @param {String} params.Region 地域名称,必须
  5436. * @param {String} params.Key 文件名称,必须
  5437. * @param {FilePath} params.FilePath 要上传的文件路径
  5438. * @param {Function} params.onProgress 上传进度回调函数
  5439. * @param {Function} callback 回调函数,必须
  5440. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5441. * @return {Object} data 为对应的 object 数据
  5442. * @return {String} data.ETag 为对应上传文件的 ETag 值
  5443. */
  5444. function postObject(params, callback) {
  5445. var self = this;
  5446. var headers = {};
  5447. headers['Cache-Control'] = params['CacheControl'];
  5448. headers['Content-Disposition'] = params['ContentDisposition'];
  5449. headers['Content-Encoding'] = params['ContentEncoding'];
  5450. headers['Content-MD5'] = params['ContentMD5'];
  5451. headers['Content-Length'] = params['ContentLength'];
  5452. headers['Content-Type'] = params['ContentType'];
  5453. headers['Expect'] = params['Expect'];
  5454. headers['Expires'] = params['Expires'];
  5455. headers['x-cos-acl'] = params['ACL'];
  5456. headers['x-cos-grant-read'] = params['GrantRead'];
  5457. headers['x-cos-grant-write'] = params['GrantWrite'];
  5458. headers['x-cos-grant-full-control'] = params['GrantFullControl'];
  5459. headers['x-cos-storage-class'] = params['StorageClass'];
  5460. var filePath = params.FilePath;
  5461. for (var key in params) {
  5462. if (key.indexOf('x-cos-meta-') > -1) {
  5463. headers[key] = params[key];
  5464. }
  5465. }
  5466. var onProgress = util.throttleOnProgress.call(self, headers['Content-Length'], params.onProgress);
  5467. submitRequest.call(this, {
  5468. Action: 'name/cos:PostObject',
  5469. method: 'POST',
  5470. Bucket: params.Bucket,
  5471. Region: params.Region,
  5472. Key: params.Key,
  5473. headers: headers,
  5474. filePath: filePath,
  5475. onProgress: onProgress,
  5476. }, function (err, data) {
  5477. onProgress(null, true);
  5478. if (err) {
  5479. return callback(err);
  5480. }
  5481. if (data && data.headers) {
  5482. var headers = data.headers;
  5483. var ETag = headers.etag || headers.Etag || headers.ETag || '';
  5484. var url = getUrl({
  5485. ForcePathStyle: self.options.ForcePathStyle,
  5486. protocol: self.options.Protocol,
  5487. domain: self.options.Domain,
  5488. bucket: params.Bucket,
  5489. region: params.Region,
  5490. object: params.Key,
  5491. isLocation: true,
  5492. });
  5493. return callback(null, {
  5494. Location: url,
  5495. statusCode: data.statusCode,
  5496. headers: headers,
  5497. ETag: ETag,
  5498. });
  5499. }
  5500. callback(null, data);
  5501. });
  5502. }
  5503. /**
  5504. * 删除 object
  5505. * @param {Object} params 参数对象,必须
  5506. * @param {String} params.Bucket Bucket名称,必须
  5507. * @param {String} params.Region 地域名称,必须
  5508. * @param {String} params.Key object名称,必须
  5509. * @param {Function} callback 回调函数,必须
  5510. * @param {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5511. * @param {Object} data 删除操作成功之后返回的数据
  5512. */
  5513. function deleteObject(params, callback) {
  5514. submitRequest.call(this, {
  5515. Action: 'name/cos:DeleteObject',
  5516. method: 'DELETE',
  5517. Bucket: params.Bucket,
  5518. Region: params.Region,
  5519. Key: params.Key,
  5520. headers: params.Headers,
  5521. VersionId: params.VersionId,
  5522. }, function (err, data) {
  5523. if (err) {
  5524. var statusCode = err.statusCode;
  5525. if (statusCode && statusCode === 204) {
  5526. return callback(null, {statusCode: statusCode});
  5527. } else if (statusCode && statusCode === 404) {
  5528. return callback(null, {BucketNotFound: true, statusCode: statusCode,});
  5529. } else {
  5530. return callback(err);
  5531. }
  5532. }
  5533. callback(null, {
  5534. statusCode: data.statusCode,
  5535. headers: data.headers,
  5536. });
  5537. });
  5538. }
  5539. /**
  5540. * 获取 object 的 权限列表
  5541. * @param {Object} params 参数对象,必须
  5542. * @param {String} params.Bucket Bucket名称,必须
  5543. * @param {String} params.Region 地域名称,必须
  5544. * @param {String} params.Key object名称,必须
  5545. * @param {Function} callback 回调函数,必须
  5546. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5547. * @return {Object} data 返回的数据
  5548. * @return {Object} data.AccessControlPolicy 权限列表
  5549. */
  5550. function getObjectAcl(params, callback) {
  5551. submitRequest.call(this, {
  5552. Action: 'name/cos:GetObjectACL',
  5553. method: 'GET',
  5554. Bucket: params.Bucket,
  5555. Region: params.Region,
  5556. Key: params.Key,
  5557. headers: params.Headers,
  5558. action: 'acl',
  5559. }, function (err, data) {
  5560. if (err) {
  5561. return callback(err);
  5562. }
  5563. var AccessControlPolicy = data.AccessControlPolicy || {};
  5564. var Owner = AccessControlPolicy.Owner || {};
  5565. var Grant = AccessControlPolicy.AccessControlList && AccessControlPolicy.AccessControlList.Grant || [];
  5566. Grant = util.isArray(Grant) ? Grant : [Grant];
  5567. var result = decodeAcl(AccessControlPolicy);
  5568. if (data.headers && data.headers['x-cos-acl']) {
  5569. result.ACL = data.headers['x-cos-acl'];
  5570. }
  5571. result = util.extend(result, {
  5572. Owner: Owner,
  5573. Grants: Grant,
  5574. statusCode: data.statusCode,
  5575. headers: data.headers,
  5576. });
  5577. callback(null, result);
  5578. });
  5579. }
  5580. /**
  5581. * 设置 object 的 权限列表
  5582. * @param {Object} params 参数对象,必须
  5583. * @param {String} params.Bucket Bucket名称,必须
  5584. * @param {String} params.Region 地域名称,必须
  5585. * @param {String} params.Key object名称,必须
  5586. * @param {Function} callback 回调函数,必须
  5587. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5588. * @return {Object} data 返回的数据
  5589. */
  5590. function putObjectAcl(params, callback) {
  5591. var headers = params.Headers;
  5592. var xml = '';
  5593. if (params['AccessControlPolicy']) {
  5594. var AccessControlPolicy = util.clone(params['AccessControlPolicy'] || {});
  5595. var Grants = AccessControlPolicy.Grants || AccessControlPolicy.Grant;
  5596. Grants = util.isArray(Grants) ? Grants : [Grants];
  5597. delete AccessControlPolicy.Grant;
  5598. delete AccessControlPolicy.Grants;
  5599. AccessControlPolicy.AccessControlList = {Grant: Grants};
  5600. xml = util.json2xml({AccessControlPolicy: AccessControlPolicy});
  5601. headers['Content-Type'] = 'application/xml';
  5602. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5603. }
  5604. // Grant Header 去重
  5605. util.each(headers, function (val, key) {
  5606. if (key.indexOf('x-cos-grant-') === 0) {
  5607. headers[key] = uniqGrant(headers[key]);
  5608. }
  5609. });
  5610. submitRequest.call(this, {
  5611. Action: 'name/cos:PutObjectACL',
  5612. method: 'PUT',
  5613. Bucket: params.Bucket,
  5614. Region: params.Region,
  5615. Key: params.Key,
  5616. action: 'acl',
  5617. headers: headers,
  5618. body: xml,
  5619. }, function (err, data) {
  5620. if (err) {
  5621. return callback(err);
  5622. }
  5623. callback(null, {
  5624. statusCode: data.statusCode,
  5625. headers: data.headers,
  5626. });
  5627. });
  5628. }
  5629. /**
  5630. * Options Object请求实现跨域访问的预请求。即发出一个 OPTIONS 请求给服务器以确认是否可以进行跨域操作。
  5631. * @param {Object} params 参数对象,必须
  5632. * @param {String} params.Bucket Bucket名称,必须
  5633. * @param {String} params.Region 地域名称,必须
  5634. * @param {String} params.Key object名称,必须
  5635. * @param {Function} callback 回调函数,必须
  5636. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5637. * @return {Object} data 返回的数据
  5638. */
  5639. function optionsObject(params, callback) {
  5640. var headers = params.Headers;
  5641. headers['Origin'] = params['Origin'];
  5642. headers['Access-Control-Request-Method'] = params['AccessControlRequestMethod'];
  5643. headers['Access-Control-Request-Headers'] = params['AccessControlRequestHeaders'];
  5644. submitRequest.call(this, {
  5645. Action: 'name/cos:OptionsObject',
  5646. method: 'OPTIONS',
  5647. Bucket: params.Bucket,
  5648. Region: params.Region,
  5649. Key: params.Key,
  5650. headers: headers,
  5651. }, function (err, data) {
  5652. if (err) {
  5653. if (err.statusCode && err.statusCode === 403) {
  5654. return callback(null, {
  5655. OptionsForbidden: true,
  5656. statusCode: err.statusCode
  5657. });
  5658. }
  5659. return callback(err);
  5660. }
  5661. var headers = data.headers || {};
  5662. callback(null, {
  5663. AccessControlAllowOrigin: headers['access-control-allow-origin'],
  5664. AccessControlAllowMethods: headers['access-control-allow-methods'],
  5665. AccessControlAllowHeaders: headers['access-control-allow-headers'],
  5666. AccessControlExposeHeaders: headers['access-control-expose-headers'],
  5667. AccessControlMaxAge: headers['access-control-max-age'],
  5668. statusCode: data.statusCode,
  5669. headers: data.headers,
  5670. });
  5671. });
  5672. }
  5673. /**
  5674. * @param {Object} 参数列表
  5675. * @param {String} Bucket Bucket 名称
  5676. * @param {String} Region 地域名称
  5677. * @param {String} Key 文件名称
  5678. * @param {String} CopySource 源文件URL绝对路径,可以通过versionid子资源指定历史版本
  5679. * @param {String} ACL 允许用户自定义文件权限。有效值:private,public-read默认值:private。
  5680. * @param {String} GrantRead 赋予被授权者读的权限,格式 x-cos-grant-read: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  5681. * @param {String} GrantWrite 赋予被授权者写的权限,格式 x-cos-grant-write: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  5682. * @param {String} GrantFullControl 赋予被授权者读写权限,格式 x-cos-grant-full-control: uin=" ",uin=" ",当需要给子账户授权时,uin="RootAcountID/SubAccountID",当需要给根账户授权时,uin="RootAcountID"。
  5683. * @param {String} MetadataDirective 是否拷贝元数据,枚举值:Copy, Replaced,默认值Copy。假如标记为Copy,忽略Header中的用户元数据信息直接复制;假如标记为Replaced,按Header信息修改元数据。当目标路径和原路径一致,即用户试图修改元数据时,必须为Replaced
  5684. * @param {String} CopySourceIfModifiedSince 当Object在指定时间后被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-None-Match一起使用,与其他条件联合使用返回冲突。
  5685. * @param {String} CopySourceIfUnmodifiedSince 当Object在指定时间后未被修改,则执行操作,否则返回412。可与x-cos-copy-source-If-Match一起使用,与其他条件联合使用返回冲突。
  5686. * @param {String} CopySourceIfMatch 当Object的ETag和给定一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Unmodified-Since一起使用,与其他条件联合使用返回冲突。
  5687. * @param {String} CopySourceIfNoneMatch 当Object的ETag和给定不一致时,则执行操作,否则返回412。可与x-cos-copy-source-If-Modified-Since一起使用,与其他条件联合使用返回冲突。
  5688. * @param {String} StorageClass 存储级别,枚举值:存储级别,枚举值:Standard, Standard_IA,Archive;默认值:Standard
  5689. * @param {String} CacheControl 指定所有缓存机制在整个请求/响应链中必须服从的指令。
  5690. * @param {String} ContentDisposition MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件
  5691. * @param {String} ContentEncoding HTTP 中用来对「采用何种编码格式传输正文」进行协定的一对头部字段
  5692. * @param {String} ContentLength 设置响应消息的实体内容的大小,单位为字节
  5693. * @param {String} ContentType RFC 2616 中定义的 HTTP 请求内容类型(MIME),例如text/plain
  5694. * @param {String} Expect 请求的特定的服务器行为
  5695. * @param {String} Expires 响应过期的日期和时间
  5696. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  5697. * @param {String} ContentLanguage 指定内容语言
  5698. * @param {String} x-cos-meta-* 允许用户自定义的头部信息,将作为 Object 元数据返回。大小限制2K。
  5699. */
  5700. function putObjectCopy(params, callback) {
  5701. var CopySource = params.CopySource || '';
  5702. var m = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
  5703. if (!m) {
  5704. callback({error: 'CopySource format error'});
  5705. return;
  5706. }
  5707. var SourceBucket = m[1];
  5708. var SourceRegion = m[3];
  5709. var SourceKey = decodeURIComponent(m[4]);
  5710. submitRequest.call(this, {
  5711. Scope: [{
  5712. action: 'name/cos:GetObject',
  5713. bucket: SourceBucket,
  5714. region: SourceRegion,
  5715. prefix: SourceKey,
  5716. }, {
  5717. action: 'name/cos:PutObject',
  5718. bucket: params.Bucket,
  5719. region: params.Region,
  5720. prefix: params.Key,
  5721. }],
  5722. method: 'PUT',
  5723. Bucket: params.Bucket,
  5724. Region: params.Region,
  5725. Key: params.Key,
  5726. VersionId: params.VersionId,
  5727. headers: params.Headers,
  5728. }, function (err, data) {
  5729. if (err) {
  5730. return callback(err);
  5731. }
  5732. var result = util.clone(data.CopyObjectResult || {});
  5733. util.extend(result, {
  5734. statusCode: data.statusCode,
  5735. headers: data.headers,
  5736. });
  5737. callback(null, result);
  5738. });
  5739. }
  5740. function uploadPartCopy(params, callback) {
  5741. var CopySource = params.CopySource || '';
  5742. var m = CopySource.match(/^([^.]+-\d+)\.cos(v6)?\.([^.]+)\.[^/]+\/(.+)$/);
  5743. if (!m) {
  5744. callback({error: 'CopySource format error'});
  5745. return;
  5746. }
  5747. var SourceBucket = m[1];
  5748. var SourceRegion = m[3];
  5749. var SourceKey = decodeURIComponent(m[4]);
  5750. submitRequest.call(this, {
  5751. Scope: [{
  5752. action: 'name/cos:GetObject',
  5753. bucket: SourceBucket,
  5754. region: SourceRegion,
  5755. prefix: SourceKey,
  5756. }, {
  5757. action: 'name/cos:PutObject',
  5758. bucket: params.Bucket,
  5759. region: params.Region,
  5760. prefix: params.Key,
  5761. }],
  5762. method: 'PUT',
  5763. Bucket: params.Bucket,
  5764. Region: params.Region,
  5765. Key: params.Key,
  5766. VersionId: params.VersionId,
  5767. qs: {
  5768. partNumber: params['PartNumber'],
  5769. uploadId: params['UploadId'],
  5770. },
  5771. headers: params.Headers,
  5772. }, function (err, data) {
  5773. if (err) {
  5774. return callback(err);
  5775. }
  5776. var result = util.clone(data.CopyPartResult || {});
  5777. util.extend(result, {
  5778. statusCode: data.statusCode,
  5779. headers: data.headers,
  5780. });
  5781. callback(null, result);
  5782. });
  5783. }
  5784. function deleteMultipleObject(params, callback) {
  5785. var Objects = params.Objects || [];
  5786. var Quiet = params.Quiet;
  5787. Objects = util.isArray(Objects) ? Objects : [Objects];
  5788. var xml = util.json2xml({Delete: {Object: Objects, Quiet: Quiet || false}});
  5789. var headers = params.Headers;
  5790. headers['Content-Type'] = 'application/xml';
  5791. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5792. var Scope = util.map(Objects, function (v) {
  5793. return {
  5794. action: 'name/cos:DeleteObject',
  5795. bucket: params.Bucket,
  5796. region: params.Region,
  5797. prefix: v.Key,
  5798. };
  5799. });
  5800. submitRequest.call(this, {
  5801. Scope: Scope,
  5802. method: 'POST',
  5803. Bucket: params.Bucket,
  5804. Region: params.Region,
  5805. body: xml,
  5806. action: 'delete',
  5807. headers: headers,
  5808. }, function (err, data) {
  5809. if (err) {
  5810. return callback(err);
  5811. }
  5812. var DeleteResult = data.DeleteResult || {};
  5813. var Deleted = DeleteResult.Deleted || [];
  5814. var Errors = DeleteResult.Error || [];
  5815. Deleted = util.isArray(Deleted) ? Deleted : [Deleted];
  5816. Errors = util.isArray(Errors) ? Errors : [Errors];
  5817. var result = util.clone(DeleteResult);
  5818. util.extend(result, {
  5819. Error: Errors,
  5820. Deleted: Deleted,
  5821. statusCode: data.statusCode,
  5822. headers: data.headers,
  5823. });
  5824. callback(null, result);
  5825. });
  5826. }
  5827. function restoreObject(params, callback) {
  5828. var headers = params.Headers;
  5829. if (!params['RestoreRequest']) {
  5830. callback({error: 'missing param RestoreRequest'});
  5831. return;
  5832. }
  5833. var RestoreRequest = params.RestoreRequest || {};
  5834. var xml = util.json2xml({RestoreRequest: RestoreRequest});
  5835. headers['Content-Type'] = 'application/xml';
  5836. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5837. submitRequest.call(this, {
  5838. Action: 'name/cos:RestoreObject',
  5839. method: 'POST',
  5840. Bucket: params.Bucket,
  5841. Region: params.Region,
  5842. Key: params.Key,
  5843. VersionId: params.VersionId,
  5844. body: xml,
  5845. action: 'restore',
  5846. headers: headers,
  5847. }, function (err, data) {
  5848. callback(err, data);
  5849. });
  5850. }
  5851. // 分块上传
  5852. /**
  5853. * 初始化分块上传
  5854. * @param {Object} params 参数对象,必须
  5855. * @param {String} params.Bucket Bucket名称,必须
  5856. * @param {String} params.Region 地域名称,必须
  5857. * @param {String} params.Key object名称,必须
  5858. * @param {String} params.UploadId object名称,必须
  5859. * @param {String} params.CacheControl RFC 2616 中定义的缓存策略,将作为 Object 元数据保存,非必须
  5860. * @param {String} params.ContentDisposition RFC 2616 中定义的文件名称,将作为 Object 元数据保存 ,非必须
  5861. * @param {String} params.ContentEncoding RFC 2616 中定义的编码格式,将作为 Object 元数据保存,非必须
  5862. * @param {String} params.ContentType RFC 2616 中定义的内容类型(MIME),将作为 Object 元数据保存,非必须
  5863. * @param {String} params.Expires RFC 2616 中定义的过期时间,将作为 Object 元数据保存,非必须
  5864. * @param {String} params.ACL 允许用户自定义文件权限,非必须
  5865. * @param {String} params.GrantRead 赋予被授权者读的权限 ,非必须
  5866. * @param {String} params.GrantWrite 赋予被授权者写的权限 ,非必须
  5867. * @param {String} params.GrantFullControl 赋予被授权者读写权限 ,非必须
  5868. * @param {String} params.StorageClass 设置Object的存储级别,枚举值:Standard,Standard_IA,Archive,非必须
  5869. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  5870. * @param {Function} callback 回调函数,必须
  5871. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5872. * @return {Object} data 返回的数据
  5873. */
  5874. function multipartInit(params, callback) {
  5875. submitRequest.call(this, {
  5876. Action: 'name/cos:InitiateMultipartUpload',
  5877. method: 'POST',
  5878. Bucket: params.Bucket,
  5879. Region: params.Region,
  5880. Key: params.Key,
  5881. action: 'uploads',
  5882. headers: params.Headers,
  5883. }, function (err, data) {
  5884. if (err) {
  5885. return callback(err);
  5886. }
  5887. data = util.clone(data || {});
  5888. if (data && data.InitiateMultipartUploadResult) {
  5889. return callback(null, util.extend(data.InitiateMultipartUploadResult, {
  5890. statusCode: data.statusCode,
  5891. headers: data.headers,
  5892. }));
  5893. }
  5894. callback(null, data);
  5895. });
  5896. }
  5897. /**
  5898. * 分块上传
  5899. * @param {Object} params 参数对象,必须
  5900. * @param {String} params.Bucket Bucket名称,必须
  5901. * @param {String} params.Region 地域名称,必须
  5902. * @param {String} params.Key object名称,必须
  5903. * @param {String} params.Body 上传文件对象或字符串
  5904. * @param {String} params.ContentLength RFC 2616 中定义的 HTTP 请求内容长度(字节),非必须
  5905. * @param {String} params.Expect 当使用 Expect: 100-continue 时,在收到服务端确认后,才会发送请求内容,非必须
  5906. * @param {String} params.ServerSideEncryption 支持按照指定的加密算法进行服务端数据加密,格式 x-cos-server-side-encryption: "AES256",非必须
  5907. * @param {String} params.ContentSha1 RFC 3174 中定义的 160-bit 内容 SHA-1 算法校验值,非必须
  5908. * @param {Function} callback 回调函数,必须
  5909. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5910. * @return {Object} data 返回的数据
  5911. * @return {Object} data.ETag 返回的文件分块 sha1 值
  5912. */
  5913. function multipartUpload(params, callback) {
  5914. var self = this;
  5915. util.getFileSize('multipartUpload', params, function () {
  5916. util.getBodyMd5(self.options.UploadCheckContentMd5, params.Body, function (md5) {
  5917. md5 && (params.Headers['Content-MD5'] = util.binaryBase64(md5));
  5918. submitRequest.call(self, {
  5919. Action: 'name/cos:UploadPart',
  5920. TaskId: params.TaskId,
  5921. method: 'PUT',
  5922. Bucket: params.Bucket,
  5923. Region: params.Region,
  5924. Key: params.Key,
  5925. qs: {
  5926. partNumber: params['PartNumber'],
  5927. uploadId: params['UploadId'],
  5928. },
  5929. headers: params.Headers,
  5930. onProgress: params.onProgress,
  5931. body: params.Body || null
  5932. }, function (err, data) {
  5933. if (err) {
  5934. return callback(err);
  5935. }
  5936. if(data && data.headers){
  5937. var headers = data.headers;
  5938. data.ETag = headers.etag || headers.Etag || headers.ETag || '';
  5939. }
  5940. callback(null, data);
  5941. });
  5942. });
  5943. });
  5944. }
  5945. /**
  5946. * 完成分块上传
  5947. * @param {Object} params 参数对象,必须
  5948. * @param {String} params.Bucket Bucket名称,必须
  5949. * @param {String} params.Region 地域名称,必须
  5950. * @param {String} params.Key object名称,必须
  5951. * @param {Array} params.Parts 分块信息列表,必须
  5952. * @param {String} params.Parts[i].PartNumber 块编号,必须
  5953. * @param {String} params.Parts[i].ETag 分块的 sha1 校验值
  5954. * @param {Function} callback 回调函数,必须
  5955. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  5956. * @return {Object} data 返回的数据
  5957. * @return {Object} data.CompleteMultipartUpload 完成分块上传后的文件信息,包括Location, Bucket, Key 和 ETag
  5958. */
  5959. function multipartComplete(params, callback) {
  5960. var self = this;
  5961. var UploadId = params.UploadId;
  5962. var Parts = params['Parts'];
  5963. for (var i = 0, len = Parts.length; i < len; i++) {
  5964. if (Parts[i]['ETag'].indexOf('"') === 0) {
  5965. continue;
  5966. }
  5967. Parts[i]['ETag'] = '"' + Parts[i]['ETag'] + '"';
  5968. }
  5969. var xml = util.json2xml({CompleteMultipartUpload: {Part: Parts}});
  5970. var headers = params.Headers;
  5971. headers['Content-Type'] = 'application/xml';
  5972. headers['Content-MD5'] = util.binaryBase64(util.md5(xml));
  5973. submitRequest.call(this, {
  5974. Action: 'name/cos:CompleteMultipartUpload',
  5975. method: 'POST',
  5976. Bucket: params.Bucket,
  5977. Region: params.Region,
  5978. Key: params.Key,
  5979. qs: {
  5980. uploadId: UploadId
  5981. },
  5982. body: xml,
  5983. headers: headers,
  5984. }, function (err, data) {
  5985. if (err) {
  5986. return callback(err);
  5987. }
  5988. var url = getUrl({
  5989. ForcePathStyle: self.options.ForcePathStyle,
  5990. protocol: self.options.Protocol,
  5991. domain: self.options.Domain,
  5992. bucket: params.Bucket,
  5993. region: params.Region,
  5994. object: params.Key,
  5995. isLocation: true,
  5996. });
  5997. var CompleteMultipartUploadResult = data.CompleteMultipartUploadResult || {};
  5998. var result = util.extend(CompleteMultipartUploadResult, {
  5999. Location: url,
  6000. statusCode: data.statusCode,
  6001. headers: data.headers,
  6002. });
  6003. callback(null, result);
  6004. });
  6005. }
  6006. /**
  6007. * 分块上传任务列表查询
  6008. * @param {Object} params 参数对象,必须
  6009. * @param {String} params.Bucket Bucket名称,必须
  6010. * @param {String} params.Region 地域名称,必须
  6011. * @param {String} params.Delimiter 定界符为一个符号,如果有Prefix,则将Prefix到delimiter之间的相同路径归为一类,定义为Common Prefix,然后列出所有Common Prefix。如果没有Prefix,则从路径起点开始,非必须
  6012. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  6013. * @param {String} params.Prefix 前缀匹配,用来规定返回的文件前缀地址,非必须
  6014. * @param {String} params.MaxUploads 单次返回最大的条目数量,默认1000,非必须
  6015. * @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的条目将被列出,非必须
  6016. * @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的条目将被列出,非必须
  6017. * @param {Function} callback 回调函数,必须
  6018. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6019. * @return {Object} data 返回的数据
  6020. * @return {Object} data.ListMultipartUploadsResult 分块上传任务信息
  6021. */
  6022. function multipartList(params, callback) {
  6023. var reqParams = {};
  6024. reqParams['delimiter'] = params['Delimiter'];
  6025. reqParams['encoding-type'] = params['EncodingType'];
  6026. reqParams['prefix'] = params['Prefix'] || '';
  6027. reqParams['max-uploads'] = params['MaxUploads'];
  6028. reqParams['key-marker'] = params['KeyMarker'];
  6029. reqParams['upload-id-marker'] = params['UploadIdMarker'];
  6030. reqParams = util.clearKey(reqParams);
  6031. submitRequest.call(this, {
  6032. Action: 'name/cos:ListMultipartUploads',
  6033. ResourceKey: reqParams['prefix'],
  6034. method: 'GET',
  6035. Bucket: params.Bucket,
  6036. Region: params.Region,
  6037. headers: params.Headers,
  6038. qs: reqParams,
  6039. action: 'uploads',
  6040. }, function (err, data) {
  6041. if (err) {
  6042. return callback(err);
  6043. }
  6044. if (data && data.ListMultipartUploadsResult) {
  6045. var Upload = data.ListMultipartUploadsResult.Upload || [];
  6046. var CommonPrefixes = data.ListMultipartUploadsResult.CommonPrefixes || [];
  6047. CommonPrefixes = util.isArray(CommonPrefixes) ? CommonPrefixes : [CommonPrefixes];
  6048. Upload = util.isArray(Upload) ? Upload : [Upload];
  6049. data.ListMultipartUploadsResult.Upload = Upload;
  6050. data.ListMultipartUploadsResult.CommonPrefixes = CommonPrefixes;
  6051. }
  6052. var result = util.clone(data.ListMultipartUploadsResult || {});
  6053. util.extend(result, {
  6054. statusCode: data.statusCode,
  6055. headers: data.headers,
  6056. });
  6057. callback(null, result);
  6058. });
  6059. }
  6060. /**
  6061. * 上传的分块列表查询
  6062. * @param {Object} params 参数对象,必须
  6063. * @param {String} params.Bucket Bucket名称,必须
  6064. * @param {String} params.Region 地域名称,必须
  6065. * @param {String} params.Key object名称,必须
  6066. * @param {String} params.UploadId 标示本次分块上传的ID,必须
  6067. * @param {String} params.EncodingType 规定返回值的编码方式,非必须
  6068. * @param {String} params.MaxParts 单次返回最大的条目数量,默认1000,非必须
  6069. * @param {String} params.PartNumberMarker 默认以UTF-8二进制顺序列出条目,所有列出条目从marker开始,非必须
  6070. * @param {Function} callback 回调函数,必须
  6071. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6072. * @return {Object} data 返回的数据
  6073. * @return {Object} data.ListMultipartUploadsResult 分块信息
  6074. */
  6075. function multipartListPart(params, callback) {
  6076. var reqParams = {};
  6077. reqParams['uploadId'] = params['UploadId'];
  6078. reqParams['encoding-type'] = params['EncodingType'];
  6079. reqParams['max-parts'] = params['MaxParts'];
  6080. reqParams['part-number-marker'] = params['PartNumberMarker'];
  6081. submitRequest.call(this, {
  6082. Action: 'name/cos:ListParts',
  6083. method: 'GET',
  6084. Bucket: params.Bucket,
  6085. Region: params.Region,
  6086. Key: params.Key,
  6087. headers: params.Headers,
  6088. qs: reqParams,
  6089. }, function (err, data) {
  6090. if (err) {
  6091. return callback(err);
  6092. }
  6093. var ListPartsResult = data.ListPartsResult || {};
  6094. var Part = ListPartsResult.Part || [];
  6095. Part = util.isArray(Part) ? Part : [Part];
  6096. ListPartsResult.Part = Part;
  6097. var result = util.clone(ListPartsResult);
  6098. util.extend(result, {
  6099. statusCode: data.statusCode,
  6100. headers: data.headers,
  6101. });
  6102. callback(null, result);
  6103. });
  6104. }
  6105. /**
  6106. * 抛弃分块上传
  6107. * @param {Object} params 参数对象,必须
  6108. * @param {String} params.Bucket Bucket名称,必须
  6109. * @param {String} params.Region 地域名称,必须
  6110. * @param {String} params.Key object名称,必须
  6111. * @param {String} params.UploadId 标示本次分块上传的ID,必须
  6112. * @param {Function} callback 回调函数,必须
  6113. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6114. * @return {Object} data 返回的数据
  6115. */
  6116. function multipartAbort(params, callback) {
  6117. var reqParams = {};
  6118. reqParams['uploadId'] = params['UploadId'];
  6119. submitRequest.call(this, {
  6120. Action: 'name/cos:AbortMultipartUpload',
  6121. method: 'DELETE',
  6122. Bucket: params.Bucket,
  6123. Region: params.Region,
  6124. Key: params.Key,
  6125. headers: params.Headers,
  6126. qs: reqParams,
  6127. }, function (err, data) {
  6128. if (err) {
  6129. return callback(err);
  6130. }
  6131. callback(null, {
  6132. statusCode: data.statusCode,
  6133. headers: data.headers,
  6134. });
  6135. });
  6136. }
  6137. /**
  6138. * 获取签名
  6139. * @param {Object} params 参数对象,必须
  6140. * @param {String} params.Method 请求方法,必须
  6141. * @param {String} params.Key object名称,必须
  6142. * @param {String} params.Expires 名超时时间,单位秒,可选
  6143. * @return {String} data 返回签名字符串
  6144. */
  6145. function getAuth(params) {
  6146. var self = this;
  6147. return util.getAuth({
  6148. SecretId: params.SecretId || this.options.SecretId || '',
  6149. SecretKey: params.SecretKey || this.options.SecretKey || '',
  6150. Method: params.Method,
  6151. Key: params.Key,
  6152. Query: params.Query,
  6153. Headers: params.Headers,
  6154. Expires: params.Expires,
  6155. SystemClockOffset: self.options.SystemClockOffset,
  6156. });
  6157. }
  6158. /**
  6159. * 获取文件下载链接
  6160. * @param {Object} params 参数对象,必须
  6161. * @param {String} params.Bucket Bucket名称,必须
  6162. * @param {String} params.Region 地域名称,必须
  6163. * @param {String} params.Key object名称,必须
  6164. * @param {String} params.Method 请求的方法,可选
  6165. * @param {String} params.Expires 签名超时时间,单位秒,可选
  6166. * @param {Function} callback 回调函数,必须
  6167. * @return {Object} err 请求失败的错误,如果请求成功,则为空。https://cloud.tencent.com/document/product/436/7730
  6168. * @return {Object} data 返回的数据
  6169. */
  6170. function getObjectUrl(params, callback) {
  6171. var self = this;
  6172. var url = getUrl({
  6173. ForcePathStyle: self.options.ForcePathStyle,
  6174. protocol: params.Protocol || self.options.Protocol,
  6175. domain: self.options.Domain,
  6176. bucket: params.Bucket,
  6177. region: params.Region,
  6178. object: params.Key,
  6179. });
  6180. if (params.Sign !== undefined && !params.Sign) {
  6181. callback(null, {Url: url});
  6182. return url;
  6183. }
  6184. var AuthData = getAuthorizationAsync.call(this, {
  6185. Action: ((params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject'),
  6186. Bucket: params.Bucket || '',
  6187. Region: params.Region || '',
  6188. Method: params.Method || 'get',
  6189. Key: params.Key,
  6190. Expires: params.Expires,
  6191. }, function (err, AuthData) {
  6192. if (!callback) return;
  6193. if (err) {
  6194. callback(err);
  6195. return;
  6196. }
  6197. var signUrl = url;
  6198. signUrl += '?' + (AuthData.Authorization.indexOf('q-signature') > -1 ?
  6199. AuthData.Authorization : 'sign=' + encodeURIComponent(AuthData.Authorization));
  6200. AuthData.XCosSecurityToken && (signUrl += '&x-cos-security-token=' + AuthData.XCosSecurityToken);
  6201. AuthData.ClientIP && (signUrl += '&clientIP=' + AuthData.ClientIP);
  6202. AuthData.ClientUA && (signUrl += '&clientUA=' + AuthData.ClientUA);
  6203. AuthData.Token && (signUrl += '&token=' + AuthData.Token);
  6204. setTimeout(function () {
  6205. callback(null, {Url: signUrl});
  6206. });
  6207. });
  6208. if (AuthData) {
  6209. return url + '?' + AuthData.Authorization +
  6210. (AuthData.XCosSecurityToken ? '&x-cos-security-token=' + AuthData.XCosSecurityToken : '');
  6211. } else {
  6212. return url;
  6213. }
  6214. }
  6215. /**
  6216. * 私有方法
  6217. */
  6218. function decodeAcl(AccessControlPolicy) {
  6219. var result = {
  6220. GrantFullControl: [],
  6221. GrantWrite: [],
  6222. GrantRead: [],
  6223. GrantReadAcp: [],
  6224. GrantWriteAcp: [],
  6225. ACL: '',
  6226. };
  6227. var GrantMap = {
  6228. 'FULL_CONTROL': 'GrantFullControl',
  6229. 'WRITE': 'GrantWrite',
  6230. 'READ': 'GrantRead',
  6231. 'READ_ACP': 'GrantReadAcp',
  6232. 'WRITE_ACP': 'GrantWriteAcp',
  6233. };
  6234. var Grant = AccessControlPolicy.AccessControlList.Grant;
  6235. if (Grant) {
  6236. Grant = util.isArray(Grant) ? Grant : [Grant];
  6237. }
  6238. var PublicAcl = {READ: 0, WRITE: 0, FULL_CONTROL: 0};
  6239. Grant.length && util.each(Grant, function (item) {
  6240. if (item.Grantee.ID === 'qcs::cam::anyone:anyone' || item.Grantee.URI === 'http://cam.qcloud.com/groups/global/AllUsers') {
  6241. PublicAcl[item.Permission] = 1;
  6242. } else if (item.Grantee.ID !== AccessControlPolicy.Owner.ID) {
  6243. result[GrantMap[item.Permission]].push('id="' + item.Grantee.ID + '"');
  6244. }
  6245. });
  6246. if (PublicAcl.FULL_CONTROL || (PublicAcl.WRITE && PublicAcl.READ)) {
  6247. result.ACL = 'public-read-write';
  6248. } else if (PublicAcl.READ) {
  6249. result.ACL = 'public-read';
  6250. } else {
  6251. result.ACL = 'private';
  6252. }
  6253. util.each(GrantMap, function (item) {
  6254. result[item] = uniqGrant(result[item].join(','));
  6255. });
  6256. return result;
  6257. }
  6258. // Grant 去重
  6259. function uniqGrant(str) {
  6260. var arr = str.split(',');
  6261. var exist = {};
  6262. var i, item;
  6263. for (i = 0; i < arr.length; ) {
  6264. item = arr[i].trim();
  6265. if (exist[item]) {
  6266. arr.splice(i, 1);
  6267. } else {
  6268. exist[item] = true;
  6269. arr[i] = item;
  6270. i++;
  6271. }
  6272. }
  6273. return arr.join(',');
  6274. }
  6275. // 生成操作 url
  6276. function getUrl(params) {
  6277. var longBucket = params.bucket;
  6278. var shortBucket = longBucket.substr(0, longBucket.lastIndexOf('-'));
  6279. var appId = longBucket.substr(longBucket.lastIndexOf('-') + 1);
  6280. var domain = params.domain;
  6281. var region = params.region;
  6282. var object = params.object;
  6283. var protocol = 'https:';
  6284. if (!domain) {
  6285. if (['cn-south', 'cn-south-2', 'cn-north', 'cn-east', 'cn-southwest', 'sg'].indexOf(region) > -1) {
  6286. domain = '{Region}.myqcloud.com';
  6287. } else {
  6288. domain = 'cos.{Region}.myqcloud.com';
  6289. }
  6290. if (!params.ForcePathStyle) {
  6291. domain = '{Bucket}.' + domain;
  6292. }
  6293. }
  6294. domain = domain.replace(/\{\{AppId\}\}/ig, appId)
  6295. .replace(/\{\{Bucket\}\}/ig, shortBucket)
  6296. .replace(/\{\{Region\}\}/ig, region)
  6297. .replace(/\{\{.*?\}\}/ig, '');
  6298. domain = domain.replace(/\{AppId\}/ig, appId)
  6299. .replace(/\{BucketName\}/ig, shortBucket)
  6300. .replace(/\{Bucket\}/ig, longBucket)
  6301. .replace(/\{Region\}/ig, region)
  6302. .replace(/\{.*?\}/ig, '');
  6303. if (!/^[a-zA-Z]+:\/\//.test(domain)) {
  6304. domain = protocol + '//' + domain;
  6305. }
  6306. // 去掉域名最后的斜杆
  6307. if (domain.slice(-1) === '/') {
  6308. domain = domain.slice(0, -1);
  6309. }
  6310. var url = domain;
  6311. if (params.ForcePathStyle) {
  6312. url += '/' + longBucket;
  6313. }
  6314. url += '/';
  6315. if (object) {
  6316. url += util.camSafeUrlEncode(object).replace(/%2F/g, '/');
  6317. }
  6318. if (params.isLocation) {
  6319. url = url.replace(/^https?:\/\//, '');
  6320. }
  6321. return url;
  6322. }
  6323. // 异步获取签名
  6324. function getAuthorizationAsync(params, callback) {
  6325. var headers = util.clone(params.Headers);
  6326. delete headers['Content-Type'];
  6327. delete headers['Cache-Control'];
  6328. util.each(headers, function (v, k) {
  6329. v === '' && delete headers[k];
  6330. });
  6331. var cb = function (AuthData) {
  6332. // 检查签名格式
  6333. var formatAllow = false;
  6334. var auth = AuthData.Authorization;
  6335. if (auth) {
  6336. if (auth.indexOf(' ') > -1) {
  6337. formatAllow = false;
  6338. } else if (auth.indexOf('q-sign-algorithm=') > -1 &&
  6339. auth.indexOf('q-ak=') > -1 &&
  6340. auth.indexOf('q-sign-time=') > -1 &&
  6341. auth.indexOf('q-key-time=') > -1 &&
  6342. auth.indexOf('q-url-param-list=') > -1) {
  6343. formatAllow = true;
  6344. } else {
  6345. try {
  6346. auth = base64.atob(auth);
  6347. if (auth.indexOf('a=') > -1 &&
  6348. auth.indexOf('k=') > -1 &&
  6349. auth.indexOf('t=') > -1 &&
  6350. auth.indexOf('r=') > -1 &&
  6351. auth.indexOf('b=') > -1) {
  6352. formatAllow = true;
  6353. }
  6354. } catch (e) {}
  6355. }
  6356. }
  6357. if (formatAllow) {
  6358. callback && callback(null, AuthData);
  6359. } else {
  6360. callback && callback('authorization error');
  6361. }
  6362. };
  6363. var self = this;
  6364. var Bucket = params.Bucket || '';
  6365. var Region = params.Region || '';
  6366. // PathName
  6367. var KeyName = params.Action === 'name/cos:PostObject' || !params.Key ? '' : params.Key;
  6368. if (self.options.ForcePathStyle && Bucket) {
  6369. KeyName = Bucket + '/' + KeyName;
  6370. }
  6371. var Pathname = '/' + KeyName;
  6372. // Action、ResourceKey
  6373. var StsData = {};
  6374. var Scope = params.Scope;
  6375. if (!Scope) {
  6376. var Action = params.Action || '';
  6377. var ResourceKey = params.ResourceKey || params.Key || '';
  6378. Scope = params.Scope || [{
  6379. action: Action,
  6380. bucket: Bucket,
  6381. region: Region,
  6382. prefix: ResourceKey,
  6383. }];
  6384. }
  6385. var ScopeKey = util.md5(JSON.stringify(Scope));
  6386. // STS
  6387. self._StsCache = self._StsCache ||[];
  6388. (function () {
  6389. var i, AuthData;
  6390. for (i = self._StsCache.length - 1; i >= 0; i--) {
  6391. AuthData = self._StsCache[i];
  6392. var compareTime = Math.round(util.getSkewTime(self.options.SystemClockOffset) / 1000) + 30;
  6393. if (AuthData.StartTime && compareTime < AuthData.StartTime || compareTime >= AuthData.ExpiredTime) {
  6394. self._StsCache.splice(i, 1);
  6395. continue;
  6396. }
  6397. if (!AuthData.ScopeLimit || AuthData.ScopeLimit && AuthData.ScopeKey === ScopeKey) {
  6398. StsData = AuthData;
  6399. break;
  6400. }
  6401. }
  6402. })();
  6403. var calcAuthByTmpKey = function () {
  6404. var KeyTime = StsData.StartTime && StsData.ExpiredTime ? StsData.StartTime + ';' + StsData.ExpiredTime : '';
  6405. var Authorization = util.getAuth({
  6406. SecretId: StsData.TmpSecretId,
  6407. SecretKey: StsData.TmpSecretKey,
  6408. Method: params.Method,
  6409. Pathname: Pathname,
  6410. Query: params.Query,
  6411. Headers: headers,
  6412. Expires: params.Expires,
  6413. SystemClockOffset: self.options.SystemClockOffset,
  6414. KeyTime: KeyTime
  6415. });
  6416. var AuthData = {
  6417. Authorization: Authorization,
  6418. XCosSecurityToken: StsData.XCosSecurityToken || '',
  6419. Token: StsData.Token || '',
  6420. ClientIP: StsData.ClientIP || '',
  6421. ClientUA: StsData.ClientUA || '',
  6422. };
  6423. cb(AuthData);
  6424. };
  6425. // 先判断是否有临时密钥
  6426. if (StsData.ExpiredTime && StsData.ExpiredTime - (util.getSkewTime(self.options.SystemClockOffset) / 1000) > 60) { // 如果缓存的临时密钥有效,并还有超过60秒有效期就直接使用
  6427. calcAuthByTmpKey();
  6428. } else if (self.options.getAuthorization) { // 外部计算签名或获取临时密钥
  6429. self.options.getAuthorization.call(self, {
  6430. Bucket: Bucket,
  6431. Region: Region,
  6432. Method: params.Method,
  6433. Key: KeyName,
  6434. Pathname: Pathname,
  6435. Query: params.Query,
  6436. Headers: headers,
  6437. Scope: Scope,
  6438. }, function (AuthData) {
  6439. if (typeof AuthData === 'string') {
  6440. AuthData = {Authorization: AuthData};
  6441. }
  6442. if (AuthData.TmpSecretId &&
  6443. AuthData.TmpSecretKey &&
  6444. AuthData.XCosSecurityToken &&
  6445. AuthData.ExpiredTime) {
  6446. StsData = AuthData || {};
  6447. StsData.Scope = Scope;
  6448. StsData.ScopeKey = ScopeKey;
  6449. self._StsCache.push(StsData);
  6450. calcAuthByTmpKey();
  6451. } else {
  6452. cb(AuthData);
  6453. }
  6454. });
  6455. } else if (self.options.getSTS) { // 外部获取临时密钥
  6456. self.options.getSTS.call(self, {
  6457. Bucket: Bucket,
  6458. Region: Region,
  6459. }, function (data) {
  6460. StsData = data || {};
  6461. StsData.Scope = Scope;
  6462. StsData.ScopeKey = ScopeKey;
  6463. StsData.TmpSecretId = StsData.SecretId;
  6464. StsData.TmpSecretKey = StsData.SecretKey;
  6465. self._StsCache.push(StsData);
  6466. calcAuthByTmpKey();
  6467. });
  6468. } else { // 内部计算获取签名
  6469. return (function () {
  6470. var Authorization = util.getAuth({
  6471. SecretId: params.SecretId || self.options.SecretId,
  6472. SecretKey: params.SecretKey || self.options.SecretKey,
  6473. Method: params.Method,
  6474. Pathname: Pathname,
  6475. Query: params.Query,
  6476. Headers: headers,
  6477. Expires: params.Expires,
  6478. SystemClockOffset: self.options.SystemClockOffset,
  6479. });
  6480. var AuthData = {
  6481. Authorization: Authorization,
  6482. XCosSecurityToken: self.options.XCosSecurityToken,
  6483. };
  6484. cb(AuthData);
  6485. return AuthData;
  6486. })();
  6487. }
  6488. return '';
  6489. }
  6490. // 调整时间偏差
  6491. function allowRetry(err) {
  6492. var allowRetry = false;
  6493. var isTimeError = false;
  6494. var serverDate = (err.headers && (err.headers.date || err.headers.Date)) || '';
  6495. try {
  6496. var errorCode = err.error.Code;
  6497. var errorMessage = err.error.Message;
  6498. if (errorCode === 'RequestTimeTooSkewed' ||
  6499. (errorCode === 'AccessDenied' && errorMessage === 'Request has expired')) {
  6500. isTimeError = true;
  6501. }
  6502. } catch (e) {
  6503. }
  6504. if (err) {
  6505. if (isTimeError && serverDate) {
  6506. var serverTime = Date.parse(serverDate);
  6507. if (this.options.CorrectClockSkew && Math.abs(util.getSkewTime(this.options.SystemClockOffset) - serverTime) >= 30000) {
  6508. console.error('error: Local time is too skewed.');
  6509. this.options.SystemClockOffset = serverTime - Date.now();
  6510. allowRetry = true;
  6511. }
  6512. } else if (Math.round(err.statusCode / 100) === 5) {
  6513. allowRetry = true;
  6514. }
  6515. }
  6516. return allowRetry;
  6517. }
  6518. // 获取签名并发起请求
  6519. function submitRequest(params, callback) {
  6520. var self = this;
  6521. // 处理 headers
  6522. !params.headers && (params.headers = {});
  6523. // 处理 query
  6524. !params.qs && (params.qs = {});
  6525. params.VersionId && (params.qs.versionId = params.VersionId);
  6526. params.qs = util.clearKey(params.qs);
  6527. // 清理 undefined 和 null 字段
  6528. params.headers && (params.headers = util.clearKey(params.headers));
  6529. params.qs && (params.qs = util.clearKey(params.qs));
  6530. var Query = util.clone(params.qs);
  6531. params.action && (Query[params.action] = '');
  6532. var next = function (tryIndex) {
  6533. var oldClockOffset = self.options.SystemClockOffset;
  6534. getAuthorizationAsync.call(self, {
  6535. Bucket: params.Bucket || '',
  6536. Region: params.Region || '',
  6537. Method: params.method,
  6538. Key: params.Key,
  6539. Query: Query,
  6540. Headers: params.headers,
  6541. Action: params.Action,
  6542. ResourceKey: params.ResourceKey,
  6543. Scope: params.Scope,
  6544. }, function (err, AuthData) {
  6545. params.AuthData = AuthData;
  6546. _submitRequest.call(self, params, function (err, data) {
  6547. if (err && tryIndex < 2 && (oldClockOffset !== self.options.SystemClockOffset || allowRetry.call(self, err))) {
  6548. if (params.headers) {
  6549. delete params.headers.Authorization;
  6550. delete params.headers['token'];
  6551. delete params.headers['clientIP'];
  6552. delete params.headers['clientUA'];
  6553. delete params.headers['x-cos-security-token'];
  6554. }
  6555. next(tryIndex + 1);
  6556. } else {
  6557. callback(err, data);
  6558. }
  6559. });
  6560. });
  6561. };
  6562. next(0);
  6563. }
  6564. // 发起请求
  6565. function _submitRequest(params, callback) {
  6566. var self = this;
  6567. var TaskId = params.TaskId;
  6568. if (TaskId && !self._isRunningTask(TaskId)) return;
  6569. var bucket = params.Bucket;
  6570. var region = params.Region;
  6571. var object = params.Key;
  6572. var method = params.method || 'GET';
  6573. var url = params.url;
  6574. var body = params.body;
  6575. var json = params.json;
  6576. var rawBody = params.rawBody;
  6577. // url
  6578. url = url || getUrl({
  6579. ForcePathStyle: self.options.ForcePathStyle,
  6580. protocol: self.options.Protocol,
  6581. domain: self.options.Domain,
  6582. bucket: bucket,
  6583. region: region,
  6584. object: object,
  6585. });
  6586. if (params.action) {
  6587. url = url + '?' + params.action;
  6588. }
  6589. var opt = {
  6590. method: method,
  6591. url: url,
  6592. headers: params.headers,
  6593. qs: params.qs,
  6594. filePath: params.filePath,
  6595. body: body,
  6596. json: json,
  6597. };
  6598. // 获取签名
  6599. opt.headers.Authorization = params.AuthData.Authorization;
  6600. params.AuthData.Token && (opt.headers['token'] = params.AuthData.Token);
  6601. params.AuthData.ClientIP && (opt.headers['clientIP'] = params.AuthData.ClientIP);
  6602. params.AuthData.ClientUA && (opt.headers['clientUA'] = params.AuthData.ClientUA);
  6603. params.AuthData.XCosSecurityToken && (opt.headers['x-cos-security-token'] = params.AuthData.XCosSecurityToken);
  6604. // 清理 undefined 和 null 字段
  6605. opt.headers && (opt.headers = util.clearKey(opt.headers));
  6606. opt = util.clearKey(opt);
  6607. // progress
  6608. if (params.onProgress && typeof params.onProgress === 'function') {
  6609. opt.onProgress = function (e) {
  6610. if (TaskId && !self._isRunningTask(TaskId)) return;
  6611. var loaded = e ? e.loaded : 0;
  6612. params.onProgress({loaded: loaded, total: e.total});
  6613. };
  6614. }
  6615. self.options.ForcePathStyle && (opt.pathStyle = self.options.ForcePathStyle);
  6616. var sender = REQUEST(opt, function (err, response, body) {
  6617. // 返回内容添加 状态码 和 headers
  6618. var hasReturned;
  6619. var cb = function (err, data) {
  6620. TaskId && self.off('inner-kill-task', killTask);
  6621. if (hasReturned) return;
  6622. hasReturned = true;
  6623. var attrs = {};
  6624. response && response.statusCode && (attrs.statusCode = response.statusCode);
  6625. response && response.headers && (attrs.headers = response.headers);
  6626. if (err) {
  6627. err = util.extend(err || {}, attrs);
  6628. callback(err, null);
  6629. } else {
  6630. data = util.extend(data || {}, attrs);
  6631. callback(null, data);
  6632. }
  6633. };
  6634. // 请求错误,发生网络错误
  6635. if (err) {
  6636. cb({error: err});
  6637. return;
  6638. }
  6639. var jsonRes;
  6640. try {
  6641. jsonRes = util.xml2json(body) || {};
  6642. } catch (e) {
  6643. jsonRes = body || {};
  6644. }
  6645. // 请求返回码不为 200
  6646. var statusCode = response.statusCode;
  6647. var statusSuccess = Math.floor(statusCode / 100) === 2; // 200 202 204 206
  6648. if (!statusSuccess) {
  6649. cb({error: jsonRes.Error || jsonRes});
  6650. return;
  6651. }
  6652. // 不对 body 进行转换,body 直接挂载返回
  6653. if (rawBody) {
  6654. jsonRes = {};
  6655. jsonRes.body = body;
  6656. }
  6657. if (jsonRes.Error) {
  6658. cb({error: jsonRes.Error});
  6659. return;
  6660. }
  6661. cb(null, jsonRes);
  6662. });
  6663. // kill task
  6664. var killTask = function (data) {
  6665. if (data.TaskId === TaskId) {
  6666. sender && sender.abort && sender.abort();
  6667. self.off('inner-kill-task', killTask);
  6668. }
  6669. };
  6670. TaskId && self.on('inner-kill-task', killTask);
  6671. }
  6672. var API_MAP = {
  6673. // Bucket 相关方法
  6674. getService: getService,
  6675. putBucket: putBucket,
  6676. getBucket: getBucket,
  6677. headBucket: headBucket,
  6678. deleteBucket: deleteBucket,
  6679. getBucketAcl: getBucketAcl,
  6680. putBucketAcl: putBucketAcl,
  6681. getBucketCors: getBucketCors,
  6682. putBucketCors: putBucketCors,
  6683. deleteBucketCors: deleteBucketCors,
  6684. getBucketLocation: getBucketLocation,
  6685. putBucketTagging: putBucketTagging,
  6686. getBucketTagging: getBucketTagging,
  6687. deleteBucketTagging: deleteBucketTagging,
  6688. getBucketPolicy: getBucketPolicy,
  6689. putBucketPolicy: putBucketPolicy,
  6690. deleteBucketPolicy: deleteBucketPolicy,
  6691. getBucketLifecycle: getBucketLifecycle,
  6692. putBucketLifecycle: putBucketLifecycle,
  6693. deleteBucketLifecycle: deleteBucketLifecycle,
  6694. putBucketVersioning: putBucketVersioning,
  6695. getBucketVersioning: getBucketVersioning,
  6696. putBucketReplication: putBucketReplication,
  6697. getBucketReplication: getBucketReplication,
  6698. deleteBucketReplication: deleteBucketReplication,
  6699. // Object 相关方法
  6700. getObject: getObject,
  6701. headObject: headObject,
  6702. listObjectVersions: listObjectVersions,
  6703. putObject: putObject,
  6704. postObject: postObject,
  6705. deleteObject: deleteObject,
  6706. getObjectAcl: getObjectAcl,
  6707. putObjectAcl: putObjectAcl,
  6708. optionsObject: optionsObject,
  6709. putObjectCopy: putObjectCopy,
  6710. deleteMultipleObject: deleteMultipleObject,
  6711. restoreObject: restoreObject,
  6712. // 分块上传相关方法
  6713. uploadPartCopy: uploadPartCopy,
  6714. multipartInit: multipartInit,
  6715. multipartUpload: multipartUpload,
  6716. multipartComplete: multipartComplete,
  6717. multipartList: multipartList,
  6718. multipartListPart: multipartListPart,
  6719. multipartAbort: multipartAbort,
  6720. // 工具方法
  6721. getObjectUrl: getObjectUrl,
  6722. getAuth: getAuth,
  6723. };
  6724. module.exports.init = function (COS, task) {
  6725. task.transferToTaskMethod(API_MAP, 'postObject');
  6726. util.each(API_MAP, function (fn, apiName) {
  6727. COS.prototype[apiName] = util.apiWrapper(apiName, fn);
  6728. });
  6729. };
  6730. /***/ }),
  6731. /* 16 */
  6732. /***/ (function(module, exports, __webpack_require__) {
  6733. var util = __webpack_require__(0);
  6734. var originApiMap = {};
  6735. var transferToTaskMethod = function (apiMap, apiName) {
  6736. originApiMap[apiName] = apiMap[apiName];
  6737. apiMap[apiName] = function (params, callback) {
  6738. if (params.SkipTask) {
  6739. originApiMap[apiName].call(this, params, callback);
  6740. } else {
  6741. this._addTask(apiName, params, callback);
  6742. }
  6743. };
  6744. };
  6745. var initTask = function (cos) {
  6746. var queue = [];
  6747. var tasks = {};
  6748. var uploadingFileCount = 0;
  6749. var nextUploadIndex = 0;
  6750. // 接口返回简略的任务信息
  6751. var formatTask = function (task) {
  6752. var t = {
  6753. id: task.id,
  6754. Bucket: task.Bucket,
  6755. Region: task.Region,
  6756. Key: task.Key,
  6757. FilePath: task.FilePath,
  6758. state: task.state,
  6759. loaded: task.loaded,
  6760. size: task.size,
  6761. speed: task.speed,
  6762. percent: task.percent,
  6763. hashPercent: task.hashPercent,
  6764. error: task.error,
  6765. };
  6766. if (task.FilePath) t.FilePath = task.FilePath;
  6767. return t;
  6768. };
  6769. var emitListUpdate = function () {
  6770. cos.emit('list-update', {list: util.map(queue, formatTask)});
  6771. };
  6772. var clearQueue = function () {
  6773. if (queue.length > cos.options.UploadQueueSize) {
  6774. var i;
  6775. for (i = 0;
  6776. i < queue.length &&
  6777. queue.length > cos.options.UploadQueueSize && // 大于队列才处理
  6778. i < nextUploadIndex; // 小于当前操作的 index 才处理
  6779. i++) {
  6780. if (!queue[i] || queue[i].state !== 'waiting') {
  6781. queue.splice(i, 1);
  6782. nextUploadIndex--;
  6783. }
  6784. }
  6785. }
  6786. };
  6787. var startNextTask = function () {
  6788. if (nextUploadIndex < queue.length &&
  6789. uploadingFileCount < cos.options.FileParallelLimit) {
  6790. var task = queue[nextUploadIndex];
  6791. if (task.state === 'waiting') {
  6792. uploadingFileCount++;
  6793. task.state = 'checking';
  6794. var apiParams = util.formatParams(task.api, task.params);
  6795. originApiMap[task.api].call(cos, apiParams, function (err, data) {
  6796. if (!cos._isRunningTask(task.id)) return;
  6797. if (task.state === 'checking' || task.state === 'uploading') {
  6798. task.state = err ? 'error' : 'success';
  6799. err && (task.error = err);
  6800. uploadingFileCount--;
  6801. emitListUpdate();
  6802. startNextTask(cos);
  6803. task.callback && task.callback(err, data);
  6804. if (task.state === 'success') {
  6805. if (task.params) {
  6806. delete task.params.Body;
  6807. delete task.params;
  6808. }
  6809. delete task.callback;
  6810. }
  6811. }
  6812. clearQueue();
  6813. });
  6814. emitListUpdate();
  6815. }
  6816. nextUploadIndex++;
  6817. startNextTask(cos);
  6818. }
  6819. };
  6820. var killTask = function (id, switchToState) {
  6821. var task = tasks[id];
  6822. if (!task) return;
  6823. var waiting = task && task.state === 'waiting';
  6824. var running = task && (task.state === 'checking' || task.state === 'uploading');
  6825. if (switchToState === 'canceled' && task.state !== 'canceled' ||
  6826. switchToState === 'paused' && waiting ||
  6827. switchToState === 'paused' && running) {
  6828. if (switchToState === 'paused' && task.params.Body && typeof task.params.Body.pipe === 'function') {
  6829. console.error('stream not support pause');
  6830. return;
  6831. }
  6832. task.state = switchToState;
  6833. cos.emit('inner-kill-task', {TaskId: id, toState: switchToState});
  6834. emitListUpdate();
  6835. if (running) {
  6836. uploadingFileCount--;
  6837. startNextTask(cos);
  6838. }
  6839. if (switchToState === 'canceled') {
  6840. if (task.params) {
  6841. delete task.params.Body;
  6842. delete task.params;
  6843. }
  6844. delete task.callback;
  6845. }
  6846. }
  6847. clearQueue();
  6848. };
  6849. cos._addTasks = function (taskList) {
  6850. util.each(taskList, function (task) {
  6851. cos._addTask(task.api, task.params, task.callback, true);
  6852. });
  6853. emitListUpdate();
  6854. };
  6855. cos._addTask = function (api, params, callback, ignoreAddEvent) {
  6856. // 复制参数对象
  6857. params = util.formatParams(api, params);
  6858. // 生成 id
  6859. var id = util.uuid();
  6860. params.TaskId = id;
  6861. params.TaskReady && params.TaskReady(id);
  6862. var task = {
  6863. // env
  6864. params: params,
  6865. callback: callback,
  6866. api: api,
  6867. index: queue.length,
  6868. // task
  6869. id: id,
  6870. Bucket: params.Bucket,
  6871. Region: params.Region,
  6872. Key: params.Key,
  6873. FilePath: params.FilePath || '',
  6874. state: 'waiting',
  6875. loaded: 0,
  6876. size: 0,
  6877. speed: 0,
  6878. percent: 0,
  6879. hashPercent: 0,
  6880. error: null,
  6881. };
  6882. var onHashProgress = params.onHashProgress;
  6883. params.onHashProgress = function (info) {
  6884. if (!cos._isRunningTask(task.id)) return;
  6885. task.hashPercent = info.percent;
  6886. onHashProgress && onHashProgress(info);
  6887. emitListUpdate();
  6888. };
  6889. var onProgress = params.onProgress;
  6890. params.onProgress = function (info) {
  6891. if (!cos._isRunningTask(task.id)) return;
  6892. task.state === 'checking' && (task.state = 'uploading');
  6893. task.loaded = info.loaded;
  6894. task.size = info.total;
  6895. task.speed = info.speed;
  6896. task.percent = info.percent;
  6897. onProgress && onProgress(info);
  6898. emitListUpdate();
  6899. };
  6900. (function () {
  6901. // 获取完文件大小再把任务加入队列
  6902. tasks[id] = task;
  6903. queue.push(task);
  6904. task.size = params.FileSize;
  6905. !ignoreAddEvent && emitListUpdate();
  6906. startNextTask(cos);
  6907. clearQueue();
  6908. })();
  6909. return id;
  6910. };
  6911. cos._isRunningTask = function (id) {
  6912. var task = tasks[id];
  6913. return !!(task && (task.state === 'checking' || task.state === 'uploading'));
  6914. };
  6915. cos.getTaskList = function () {
  6916. return util.map(queue, formatTask);
  6917. };
  6918. cos.cancelTask = function (id) {
  6919. killTask(id, 'canceled')
  6920. };
  6921. cos.pauseTask = function (id) {
  6922. killTask(id, 'paused')
  6923. };
  6924. cos.restartTask = function (id) {
  6925. var task = tasks[id];
  6926. if (task && (task.state === 'paused' || task.state === 'error')) {
  6927. task.state = 'waiting';
  6928. emitListUpdate();
  6929. nextUploadIndex = Math.min(nextUploadIndex, task.index);
  6930. startNextTask();
  6931. }
  6932. };
  6933. };
  6934. module.exports.transferToTaskMethod = transferToTaskMethod;
  6935. module.exports.init = initTask;
  6936. /***/ })
  6937. /******/ ]);
  6938. });
  6939. }, function(modId) {var map = {}; return __REQUIRE__(map[modId], modId); })
  6940. return __REQUIRE__(1595302356117);
  6941. })()
  6942. //# sourceMappingURL=index.js.map