@hot-updater/aws 0.12.6 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,16 +29,48 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
 
31
31
  // src/index.ts
32
- var src_exports = {};
33
- __export(src_exports, {
32
+ var index_exports = {};
33
+ __export(index_exports, {
34
34
  s3Database: () => s3Database,
35
35
  s3Storage: () => s3Storage
36
36
  });
37
- module.exports = __toCommonJS(src_exports);
37
+ module.exports = __toCommonJS(index_exports);
38
38
 
39
39
  // src/s3Database.ts
40
+ var import_client_cloudfront = require("@aws-sdk/client-cloudfront");
40
41
  var import_client_s3 = require("@aws-sdk/client-s3");
41
42
  var import_lib_storage = require("@aws-sdk/lib-storage");
43
+ var import_plugin_core = require("@hot-updater/plugin-core");
44
+
45
+ // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/_internal/compareValues.mjs
46
+ function compareValues(a, b, order) {
47
+ if (a < b) {
48
+ return order === "asc" ? -1 : 1;
49
+ }
50
+ if (a > b) {
51
+ return order === "asc" ? 1 : -1;
52
+ }
53
+ return 0;
54
+ }
55
+
56
+ // ../../node_modules/.pnpm/es-toolkit@1.32.0/node_modules/es-toolkit/dist/array/orderBy.mjs
57
+ function orderBy(arr, criteria, orders) {
58
+ return arr.slice().sort((a, b) => {
59
+ const ordersLength = orders.length;
60
+ for (let i = 0; i < criteria.length; i++) {
61
+ const order = ordersLength > i ? orders[i] : orders[ordersLength - 1];
62
+ const criterion = criteria[i];
63
+ const criterionIsFunction = typeof criterion === "function";
64
+ const valueA = criterionIsFunction ? criterion(a) : a[criterion];
65
+ const valueB = criterionIsFunction ? criterion(b) : b[criterion];
66
+ const result = compareValues(valueA, valueB, order);
67
+ if (result !== 0) {
68
+ return result;
69
+ }
70
+ }
71
+ return 0;
72
+ });
73
+ }
42
74
 
43
75
  // ../../node_modules/.pnpm/mime@4.0.4/node_modules/mime/dist/types/other.js
44
76
  var types = { "application/prs.cww": ["cww"], "application/prs.xsf+xml": ["xsf"], "application/vnd.1000minds.decision-model+xml": ["1km"], "application/vnd.3gpp.pic-bw-large": ["plb"], "application/vnd.3gpp.pic-bw-small": ["psb"], "application/vnd.3gpp.pic-bw-var": ["pvb"], "application/vnd.3gpp2.tcap": ["tcap"], "application/vnd.3m.post-it-notes": ["pwn"], "application/vnd.accpac.simply.aso": ["aso"], "application/vnd.accpac.simply.imp": ["imp"], "application/vnd.acucobol": ["acu"], "application/vnd.acucorp": ["atc", "acutc"], "application/vnd.adobe.air-application-installer-package+zip": ["air"], "application/vnd.adobe.formscentral.fcdt": ["fcdt"], "application/vnd.adobe.fxp": ["fxp", "fxpl"], "application/vnd.adobe.xdp+xml": ["xdp"], "application/vnd.adobe.xfdf": ["*xfdf"], "application/vnd.age": ["age"], "application/vnd.ahead.space": ["ahead"], "application/vnd.airzip.filesecure.azf": ["azf"], "application/vnd.airzip.filesecure.azs": ["azs"], "application/vnd.amazon.ebook": ["azw"], "application/vnd.americandynamics.acc": ["acc"], "application/vnd.amiga.ami": ["ami"], "application/vnd.android.package-archive": ["apk"], "application/vnd.anser-web-certificate-issue-initiation": ["cii"], "application/vnd.anser-web-funds-transfer-initiation": ["fti"], "application/vnd.antix.game-component": ["atx"], "application/vnd.apple.installer+xml": ["mpkg"], "application/vnd.apple.keynote": ["key"], "application/vnd.apple.mpegurl": ["m3u8"], "application/vnd.apple.numbers": ["numbers"], "application/vnd.apple.pages": ["pages"], "application/vnd.apple.pkpass": ["pkpass"], "application/vnd.aristanetworks.swi": ["swi"], "application/vnd.astraea-software.iota": ["iota"], "application/vnd.audiograph": ["aep"], "application/vnd.balsamiq.bmml+xml": ["bmml"], "application/vnd.blueice.multipass": ["mpm"], "application/vnd.bmi": ["bmi"], "application/vnd.businessobjects": ["rep"], "application/vnd.chemdraw+xml": ["cdxml"], "application/vnd.chipnuts.karaoke-mmd": ["mmd"], "application/vnd.cinderella": ["cdy"], "application/vnd.citationstyles.style+xml": ["csl"], "application/vnd.claymore": ["cla"], "application/vnd.cloanto.rp9": ["rp9"], "application/vnd.clonk.c4group": ["c4g", "c4d", "c4f", "c4p", "c4u"], "application/vnd.cluetrust.cartomobile-config": ["c11amc"], "application/vnd.cluetrust.cartomobile-config-pkg": ["c11amz"], "application/vnd.commonspace": ["csp"], "application/vnd.contact.cmsg": ["cdbcmsg"], "application/vnd.cosmocaller": ["cmc"], "application/vnd.crick.clicker": ["clkx"], "application/vnd.crick.clicker.keyboard": ["clkk"], "application/vnd.crick.clicker.palette": ["clkp"], "application/vnd.crick.clicker.template": ["clkt"], "application/vnd.crick.clicker.wordbank": ["clkw"], "application/vnd.criticaltools.wbs+xml": ["wbs"], "application/vnd.ctc-posml": ["pml"], "application/vnd.cups-ppd": ["ppd"], "application/vnd.curl.car": ["car"], "application/vnd.curl.pcurl": ["pcurl"], "application/vnd.dart": ["dart"], "application/vnd.data-vision.rdz": ["rdz"], "application/vnd.dbf": ["dbf"], "application/vnd.dece.data": ["uvf", "uvvf", "uvd", "uvvd"], "application/vnd.dece.ttml+xml": ["uvt", "uvvt"], "application/vnd.dece.unspecified": ["uvx", "uvvx"], "application/vnd.dece.zip": ["uvz", "uvvz"], "application/vnd.denovo.fcselayout-link": ["fe_launch"], "application/vnd.dna": ["dna"], "application/vnd.dolby.mlp": ["mlp"], "application/vnd.dpgraph": ["dpg"], "application/vnd.dreamfactory": ["dfac"], "application/vnd.ds-keypoint": ["kpxx"], "application/vnd.dvb.ait": ["ait"], "application/vnd.dvb.service": ["svc"], "application/vnd.dynageo": ["geo"], "application/vnd.ecowin.chart": ["mag"], "application/vnd.enliven": ["nml"], "application/vnd.epson.esf": ["esf"], "application/vnd.epson.msf": ["msf"], "application/vnd.epson.quickanime": ["qam"], "application/vnd.epson.salt": ["slt"], "application/vnd.epson.ssf": ["ssf"], "application/vnd.eszigno3+xml": ["es3", "et3"], "application/vnd.ezpix-album": ["ez2"], "application/vnd.ezpix-package": ["ez3"], "application/vnd.fdf": ["*fdf"], "application/vnd.fdsn.mseed": ["mseed"], "application/vnd.fdsn.seed": ["seed", "dataless"], "application/vnd.flographit": ["gph"], "application/vnd.fluxtime.clip": ["ftc"], "application/vnd.framemaker": ["fm", "frame", "maker", "book"], "application/vnd.frogans.fnc": ["fnc"], "application/vnd.frogans.ltf": ["ltf"], "application/vnd.fsc.weblaunch": ["fsc"], "application/vnd.fujitsu.oasys": ["oas"], "application/vnd.fujitsu.oasys2": ["oa2"], "application/vnd.fujitsu.oasys3": ["oa3"], "application/vnd.fujitsu.oasysgp": ["fg5"], "application/vnd.fujitsu.oasysprs": ["bh2"], "application/vnd.fujixerox.ddd": ["ddd"], "application/vnd.fujixerox.docuworks": ["xdw"], "application/vnd.fujixerox.docuworks.binder": ["xbd"], "application/vnd.fuzzysheet": ["fzs"], "application/vnd.genomatix.tuxedo": ["txd"], "application/vnd.geogebra.file": ["ggb"], "application/vnd.geogebra.tool": ["ggt"], "application/vnd.geometry-explorer": ["gex", "gre"], "application/vnd.geonext": ["gxt"], "application/vnd.geoplan": ["g2w"], "application/vnd.geospace": ["g3w"], "application/vnd.gmx": ["gmx"], "application/vnd.google-apps.document": ["gdoc"], "application/vnd.google-apps.presentation": ["gslides"], "application/vnd.google-apps.spreadsheet": ["gsheet"], "application/vnd.google-earth.kml+xml": ["kml"], "application/vnd.google-earth.kmz": ["kmz"], "application/vnd.grafeq": ["gqf", "gqs"], "application/vnd.groove-account": ["gac"], "application/vnd.groove-help": ["ghf"], "application/vnd.groove-identity-message": ["gim"], "application/vnd.groove-injector": ["grv"], "application/vnd.groove-tool-message": ["gtm"], "application/vnd.groove-tool-template": ["tpl"], "application/vnd.groove-vcard": ["vcg"], "application/vnd.hal+xml": ["hal"], "application/vnd.handheld-entertainment+xml": ["zmm"], "application/vnd.hbci": ["hbci"], "application/vnd.hhe.lesson-player": ["les"], "application/vnd.hp-hpgl": ["hpgl"], "application/vnd.hp-hpid": ["hpid"], "application/vnd.hp-hps": ["hps"], "application/vnd.hp-jlyt": ["jlt"], "application/vnd.hp-pcl": ["pcl"], "application/vnd.hp-pclxl": ["pclxl"], "application/vnd.hydrostatix.sof-data": ["sfd-hdstx"], "application/vnd.ibm.minipay": ["mpy"], "application/vnd.ibm.modcap": ["afp", "listafp", "list3820"], "application/vnd.ibm.rights-management": ["irm"], "application/vnd.ibm.secure-container": ["sc"], "application/vnd.iccprofile": ["icc", "icm"], "application/vnd.igloader": ["igl"], "application/vnd.immervision-ivp": ["ivp"], "application/vnd.immervision-ivu": ["ivu"], "application/vnd.insors.igm": ["igm"], "application/vnd.intercon.formnet": ["xpw", "xpx"], "application/vnd.intergeo": ["i2g"], "application/vnd.intu.qbo": ["qbo"], "application/vnd.intu.qfx": ["qfx"], "application/vnd.ipunplugged.rcprofile": ["rcprofile"], "application/vnd.irepository.package+xml": ["irp"], "application/vnd.is-xpr": ["xpr"], "application/vnd.isac.fcs": ["fcs"], "application/vnd.jam": ["jam"], "application/vnd.jcp.javame.midlet-rms": ["rms"], "application/vnd.jisp": ["jisp"], "application/vnd.joost.joda-archive": ["joda"], "application/vnd.kahootz": ["ktz", "ktr"], "application/vnd.kde.karbon": ["karbon"], "application/vnd.kde.kchart": ["chrt"], "application/vnd.kde.kformula": ["kfo"], "application/vnd.kde.kivio": ["flw"], "application/vnd.kde.kontour": ["kon"], "application/vnd.kde.kpresenter": ["kpr", "kpt"], "application/vnd.kde.kspread": ["ksp"], "application/vnd.kde.kword": ["kwd", "kwt"], "application/vnd.kenameaapp": ["htke"], "application/vnd.kidspiration": ["kia"], "application/vnd.kinar": ["kne", "knp"], "application/vnd.koan": ["skp", "skd", "skt", "skm"], "application/vnd.kodak-descriptor": ["sse"], "application/vnd.las.las+xml": ["lasxml"], "application/vnd.llamagraphics.life-balance.desktop": ["lbd"], "application/vnd.llamagraphics.life-balance.exchange+xml": ["lbe"], "application/vnd.lotus-1-2-3": ["123"], "application/vnd.lotus-approach": ["apr"], "application/vnd.lotus-freelance": ["pre"], "application/vnd.lotus-notes": ["nsf"], "application/vnd.lotus-organizer": ["org"], "application/vnd.lotus-screencam": ["scm"], "application/vnd.lotus-wordpro": ["lwp"], "application/vnd.macports.portpkg": ["portpkg"], "application/vnd.mapbox-vector-tile": ["mvt"], "application/vnd.mcd": ["mcd"], "application/vnd.medcalcdata": ["mc1"], "application/vnd.mediastation.cdkey": ["cdkey"], "application/vnd.mfer": ["mwf"], "application/vnd.mfmp": ["mfm"], "application/vnd.micrografx.flo": ["flo"], "application/vnd.micrografx.igx": ["igx"], "application/vnd.mif": ["mif"], "application/vnd.mobius.daf": ["daf"], "application/vnd.mobius.dis": ["dis"], "application/vnd.mobius.mbk": ["mbk"], "application/vnd.mobius.mqy": ["mqy"], "application/vnd.mobius.msl": ["msl"], "application/vnd.mobius.plc": ["plc"], "application/vnd.mobius.txf": ["txf"], "application/vnd.mophun.application": ["mpn"], "application/vnd.mophun.certificate": ["mpc"], "application/vnd.mozilla.xul+xml": ["xul"], "application/vnd.ms-artgalry": ["cil"], "application/vnd.ms-cab-compressed": ["cab"], "application/vnd.ms-excel": ["xls", "xlm", "xla", "xlc", "xlt", "xlw"], "application/vnd.ms-excel.addin.macroenabled.12": ["xlam"], "application/vnd.ms-excel.sheet.binary.macroenabled.12": ["xlsb"], "application/vnd.ms-excel.sheet.macroenabled.12": ["xlsm"], "application/vnd.ms-excel.template.macroenabled.12": ["xltm"], "application/vnd.ms-fontobject": ["eot"], "application/vnd.ms-htmlhelp": ["chm"], "application/vnd.ms-ims": ["ims"], "application/vnd.ms-lrm": ["lrm"], "application/vnd.ms-officetheme": ["thmx"], "application/vnd.ms-outlook": ["msg"], "application/vnd.ms-pki.seccat": ["cat"], "application/vnd.ms-pki.stl": ["*stl"], "application/vnd.ms-powerpoint": ["ppt", "pps", "pot"], "application/vnd.ms-powerpoint.addin.macroenabled.12": ["ppam"], "application/vnd.ms-powerpoint.presentation.macroenabled.12": ["pptm"], "application/vnd.ms-powerpoint.slide.macroenabled.12": ["sldm"], "application/vnd.ms-powerpoint.slideshow.macroenabled.12": ["ppsm"], "application/vnd.ms-powerpoint.template.macroenabled.12": ["potm"], "application/vnd.ms-project": ["*mpp", "mpt"], "application/vnd.ms-word.document.macroenabled.12": ["docm"], "application/vnd.ms-word.template.macroenabled.12": ["dotm"], "application/vnd.ms-works": ["wps", "wks", "wcm", "wdb"], "application/vnd.ms-wpl": ["wpl"], "application/vnd.ms-xpsdocument": ["xps"], "application/vnd.mseq": ["mseq"], "application/vnd.musician": ["mus"], "application/vnd.muvee.style": ["msty"], "application/vnd.mynfc": ["taglet"], "application/vnd.neurolanguage.nlu": ["nlu"], "application/vnd.nitf": ["ntf", "nitf"], "application/vnd.noblenet-directory": ["nnd"], "application/vnd.noblenet-sealer": ["nns"], "application/vnd.noblenet-web": ["nnw"], "application/vnd.nokia.n-gage.ac+xml": ["*ac"], "application/vnd.nokia.n-gage.data": ["ngdat"], "application/vnd.nokia.n-gage.symbian.install": ["n-gage"], "application/vnd.nokia.radio-preset": ["rpst"], "application/vnd.nokia.radio-presets": ["rpss"], "application/vnd.novadigm.edm": ["edm"], "application/vnd.novadigm.edx": ["edx"], "application/vnd.novadigm.ext": ["ext"], "application/vnd.oasis.opendocument.chart": ["odc"], "application/vnd.oasis.opendocument.chart-template": ["otc"], "application/vnd.oasis.opendocument.database": ["odb"], "application/vnd.oasis.opendocument.formula": ["odf"], "application/vnd.oasis.opendocument.formula-template": ["odft"], "application/vnd.oasis.opendocument.graphics": ["odg"], "application/vnd.oasis.opendocument.graphics-template": ["otg"], "application/vnd.oasis.opendocument.image": ["odi"], "application/vnd.oasis.opendocument.image-template": ["oti"], "application/vnd.oasis.opendocument.presentation": ["odp"], "application/vnd.oasis.opendocument.presentation-template": ["otp"], "application/vnd.oasis.opendocument.spreadsheet": ["ods"], "application/vnd.oasis.opendocument.spreadsheet-template": ["ots"], "application/vnd.oasis.opendocument.text": ["odt"], "application/vnd.oasis.opendocument.text-master": ["odm"], "application/vnd.oasis.opendocument.text-template": ["ott"], "application/vnd.oasis.opendocument.text-web": ["oth"], "application/vnd.olpc-sugar": ["xo"], "application/vnd.oma.dd2+xml": ["dd2"], "application/vnd.openblox.game+xml": ["obgx"], "application/vnd.openofficeorg.extension": ["oxt"], "application/vnd.openstreetmap.data+xml": ["osm"], "application/vnd.openxmlformats-officedocument.presentationml.presentation": ["pptx"], "application/vnd.openxmlformats-officedocument.presentationml.slide": ["sldx"], "application/vnd.openxmlformats-officedocument.presentationml.slideshow": ["ppsx"], "application/vnd.openxmlformats-officedocument.presentationml.template": ["potx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": ["xlsx"], "application/vnd.openxmlformats-officedocument.spreadsheetml.template": ["xltx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.document": ["docx"], "application/vnd.openxmlformats-officedocument.wordprocessingml.template": ["dotx"], "application/vnd.osgeo.mapguide.package": ["mgp"], "application/vnd.osgi.dp": ["dp"], "application/vnd.osgi.subsystem": ["esa"], "application/vnd.palm": ["pdb", "pqa", "oprc"], "application/vnd.pawaafile": ["paw"], "application/vnd.pg.format": ["str"], "application/vnd.pg.osasli": ["ei6"], "application/vnd.picsel": ["efif"], "application/vnd.pmi.widget": ["wg"], "application/vnd.pocketlearn": ["plf"], "application/vnd.powerbuilder6": ["pbd"], "application/vnd.previewsystems.box": ["box"], "application/vnd.proteus.magazine": ["mgz"], "application/vnd.publishare-delta-tree": ["qps"], "application/vnd.pvi.ptid1": ["ptid"], "application/vnd.pwg-xhtml-print+xml": ["xhtm"], "application/vnd.quark.quarkxpress": ["qxd", "qxt", "qwd", "qwt", "qxl", "qxb"], "application/vnd.rar": ["rar"], "application/vnd.realvnc.bed": ["bed"], "application/vnd.recordare.musicxml": ["mxl"], "application/vnd.recordare.musicxml+xml": ["musicxml"], "application/vnd.rig.cryptonote": ["cryptonote"], "application/vnd.rim.cod": ["cod"], "application/vnd.rn-realmedia": ["rm"], "application/vnd.rn-realmedia-vbr": ["rmvb"], "application/vnd.route66.link66+xml": ["link66"], "application/vnd.sailingtracker.track": ["st"], "application/vnd.seemail": ["see"], "application/vnd.sema": ["sema"], "application/vnd.semd": ["semd"], "application/vnd.semf": ["semf"], "application/vnd.shana.informed.formdata": ["ifm"], "application/vnd.shana.informed.formtemplate": ["itp"], "application/vnd.shana.informed.interchange": ["iif"], "application/vnd.shana.informed.package": ["ipk"], "application/vnd.simtech-mindmapper": ["twd", "twds"], "application/vnd.smaf": ["mmf"], "application/vnd.smart.teacher": ["teacher"], "application/vnd.software602.filler.form+xml": ["fo"], "application/vnd.solent.sdkm+xml": ["sdkm", "sdkd"], "application/vnd.spotfire.dxp": ["dxp"], "application/vnd.spotfire.sfs": ["sfs"], "application/vnd.stardivision.calc": ["sdc"], "application/vnd.stardivision.draw": ["sda"], "application/vnd.stardivision.impress": ["sdd"], "application/vnd.stardivision.math": ["smf"], "application/vnd.stardivision.writer": ["sdw", "vor"], "application/vnd.stardivision.writer-global": ["sgl"], "application/vnd.stepmania.package": ["smzip"], "application/vnd.stepmania.stepchart": ["sm"], "application/vnd.sun.wadl+xml": ["wadl"], "application/vnd.sun.xml.calc": ["sxc"], "application/vnd.sun.xml.calc.template": ["stc"], "application/vnd.sun.xml.draw": ["sxd"], "application/vnd.sun.xml.draw.template": ["std"], "application/vnd.sun.xml.impress": ["sxi"], "application/vnd.sun.xml.impress.template": ["sti"], "application/vnd.sun.xml.math": ["sxm"], "application/vnd.sun.xml.writer": ["sxw"], "application/vnd.sun.xml.writer.global": ["sxg"], "application/vnd.sun.xml.writer.template": ["stw"], "application/vnd.sus-calendar": ["sus", "susp"], "application/vnd.svd": ["svd"], "application/vnd.symbian.install": ["sis", "sisx"], "application/vnd.syncml+xml": ["xsm"], "application/vnd.syncml.dm+wbxml": ["bdm"], "application/vnd.syncml.dm+xml": ["xdm"], "application/vnd.syncml.dmddf+xml": ["ddf"], "application/vnd.tao.intent-module-archive": ["tao"], "application/vnd.tcpdump.pcap": ["pcap", "cap", "dmp"], "application/vnd.tmobile-livetv": ["tmo"], "application/vnd.trid.tpt": ["tpt"], "application/vnd.triscape.mxs": ["mxs"], "application/vnd.trueapp": ["tra"], "application/vnd.ufdl": ["ufd", "ufdl"], "application/vnd.uiq.theme": ["utz"], "application/vnd.umajin": ["umj"], "application/vnd.unity": ["unityweb"], "application/vnd.uoml+xml": ["uoml", "uo"], "application/vnd.vcx": ["vcx"], "application/vnd.visio": ["vsd", "vst", "vss", "vsw"], "application/vnd.visionary": ["vis"], "application/vnd.vsf": ["vsf"], "application/vnd.wap.wbxml": ["wbxml"], "application/vnd.wap.wmlc": ["wmlc"], "application/vnd.wap.wmlscriptc": ["wmlsc"], "application/vnd.webturbo": ["wtb"], "application/vnd.wolfram.player": ["nbp"], "application/vnd.wordperfect": ["wpd"], "application/vnd.wqd": ["wqd"], "application/vnd.wt.stf": ["stf"], "application/vnd.xara": ["xar"], "application/vnd.xfdl": ["xfdl"], "application/vnd.yamaha.hv-dic": ["hvd"], "application/vnd.yamaha.hv-script": ["hvs"], "application/vnd.yamaha.hv-voice": ["hvp"], "application/vnd.yamaha.openscoreformat": ["osf"], "application/vnd.yamaha.openscoreformat.osfpvg+xml": ["osfpvg"], "application/vnd.yamaha.smaf-audio": ["saf"], "application/vnd.yamaha.smaf-phrase": ["spf"], "application/vnd.yellowriver-custom-menu": ["cmp"], "application/vnd.zul": ["zir", "zirz"], "application/vnd.zzazz.deck+xml": ["zaz"], "application/x-7z-compressed": ["7z"], "application/x-abiword": ["abw"], "application/x-ace-compressed": ["ace"], "application/x-apple-diskimage": ["*dmg"], "application/x-arj": ["arj"], "application/x-authorware-bin": ["aab", "x32", "u32", "vox"], "application/x-authorware-map": ["aam"], "application/x-authorware-seg": ["aas"], "application/x-bcpio": ["bcpio"], "application/x-bdoc": ["*bdoc"], "application/x-bittorrent": ["torrent"], "application/x-blorb": ["blb", "blorb"], "application/x-bzip": ["bz"], "application/x-bzip2": ["bz2", "boz"], "application/x-cbr": ["cbr", "cba", "cbt", "cbz", "cb7"], "application/x-cdlink": ["vcd"], "application/x-cfs-compressed": ["cfs"], "application/x-chat": ["chat"], "application/x-chess-pgn": ["pgn"], "application/x-chrome-extension": ["crx"], "application/x-cocoa": ["cco"], "application/x-conference": ["nsc"], "application/x-cpio": ["cpio"], "application/x-csh": ["csh"], "application/x-debian-package": ["*deb", "udeb"], "application/x-dgc-compressed": ["dgc"], "application/x-director": ["dir", "dcr", "dxr", "cst", "cct", "cxt", "w3d", "fgd", "swa"], "application/x-doom": ["wad"], "application/x-dtbncx+xml": ["ncx"], "application/x-dtbook+xml": ["dtb"], "application/x-dtbresource+xml": ["res"], "application/x-dvi": ["dvi"], "application/x-envoy": ["evy"], "application/x-eva": ["eva"], "application/x-font-bdf": ["bdf"], "application/x-font-ghostscript": ["gsf"], "application/x-font-linux-psf": ["psf"], "application/x-font-pcf": ["pcf"], "application/x-font-snf": ["snf"], "application/x-font-type1": ["pfa", "pfb", "pfm", "afm"], "application/x-freearc": ["arc"], "application/x-futuresplash": ["spl"], "application/x-gca-compressed": ["gca"], "application/x-glulx": ["ulx"], "application/x-gnumeric": ["gnumeric"], "application/x-gramps-xml": ["gramps"], "application/x-gtar": ["gtar"], "application/x-hdf": ["hdf"], "application/x-httpd-php": ["php"], "application/x-install-instructions": ["install"], "application/x-iso9660-image": ["*iso"], "application/x-iwork-keynote-sffkey": ["*key"], "application/x-iwork-numbers-sffnumbers": ["*numbers"], "application/x-iwork-pages-sffpages": ["*pages"], "application/x-java-archive-diff": ["jardiff"], "application/x-java-jnlp-file": ["jnlp"], "application/x-keepass2": ["kdbx"], "application/x-latex": ["latex"], "application/x-lua-bytecode": ["luac"], "application/x-lzh-compressed": ["lzh", "lha"], "application/x-makeself": ["run"], "application/x-mie": ["mie"], "application/x-mobipocket-ebook": ["*prc", "mobi"], "application/x-ms-application": ["application"], "application/x-ms-shortcut": ["lnk"], "application/x-ms-wmd": ["wmd"], "application/x-ms-wmz": ["wmz"], "application/x-ms-xbap": ["xbap"], "application/x-msaccess": ["mdb"], "application/x-msbinder": ["obd"], "application/x-mscardfile": ["crd"], "application/x-msclip": ["clp"], "application/x-msdos-program": ["*exe"], "application/x-msdownload": ["*exe", "*dll", "com", "bat", "*msi"], "application/x-msmediaview": ["mvb", "m13", "m14"], "application/x-msmetafile": ["*wmf", "*wmz", "*emf", "emz"], "application/x-msmoney": ["mny"], "application/x-mspublisher": ["pub"], "application/x-msschedule": ["scd"], "application/x-msterminal": ["trm"], "application/x-mswrite": ["wri"], "application/x-netcdf": ["nc", "cdf"], "application/x-ns-proxy-autoconfig": ["pac"], "application/x-nzb": ["nzb"], "application/x-perl": ["pl", "pm"], "application/x-pilot": ["*prc", "*pdb"], "application/x-pkcs12": ["p12", "pfx"], "application/x-pkcs7-certificates": ["p7b", "spc"], "application/x-pkcs7-certreqresp": ["p7r"], "application/x-rar-compressed": ["*rar"], "application/x-redhat-package-manager": ["rpm"], "application/x-research-info-systems": ["ris"], "application/x-sea": ["sea"], "application/x-sh": ["sh"], "application/x-shar": ["shar"], "application/x-shockwave-flash": ["swf"], "application/x-silverlight-app": ["xap"], "application/x-sql": ["*sql"], "application/x-stuffit": ["sit"], "application/x-stuffitx": ["sitx"], "application/x-subrip": ["srt"], "application/x-sv4cpio": ["sv4cpio"], "application/x-sv4crc": ["sv4crc"], "application/x-t3vm-image": ["t3"], "application/x-tads": ["gam"], "application/x-tar": ["tar"], "application/x-tcl": ["tcl", "tk"], "application/x-tex": ["tex"], "application/x-tex-tfm": ["tfm"], "application/x-texinfo": ["texinfo", "texi"], "application/x-tgif": ["*obj"], "application/x-ustar": ["ustar"], "application/x-virtualbox-hdd": ["hdd"], "application/x-virtualbox-ova": ["ova"], "application/x-virtualbox-ovf": ["ovf"], "application/x-virtualbox-vbox": ["vbox"], "application/x-virtualbox-vbox-extpack": ["vbox-extpack"], "application/x-virtualbox-vdi": ["vdi"], "application/x-virtualbox-vhd": ["vhd"], "application/x-virtualbox-vmdk": ["vmdk"], "application/x-wais-source": ["src"], "application/x-web-app-manifest+json": ["webapp"], "application/x-x509-ca-cert": ["der", "crt", "pem"], "application/x-xfig": ["fig"], "application/x-xliff+xml": ["*xlf"], "application/x-xpinstall": ["xpi"], "application/x-xz": ["xz"], "application/x-zmachine": ["z1", "z2", "z3", "z4", "z5", "z6", "z7", "z8"], "audio/vnd.dece.audio": ["uva", "uvva"], "audio/vnd.digital-winds": ["eol"], "audio/vnd.dra": ["dra"], "audio/vnd.dts": ["dts"], "audio/vnd.dts.hd": ["dtshd"], "audio/vnd.lucent.voice": ["lvp"], "audio/vnd.ms-playready.media.pya": ["pya"], "audio/vnd.nuera.ecelp4800": ["ecelp4800"], "audio/vnd.nuera.ecelp7470": ["ecelp7470"], "audio/vnd.nuera.ecelp9600": ["ecelp9600"], "audio/vnd.rip": ["rip"], "audio/x-aac": ["*aac"], "audio/x-aiff": ["aif", "aiff", "aifc"], "audio/x-caf": ["caf"], "audio/x-flac": ["flac"], "audio/x-m4a": ["*m4a"], "audio/x-matroska": ["mka"], "audio/x-mpegurl": ["m3u"], "audio/x-ms-wax": ["wax"], "audio/x-ms-wma": ["wma"], "audio/x-pn-realaudio": ["ram", "ra"], "audio/x-pn-realaudio-plugin": ["rmp"], "audio/x-realaudio": ["*ra"], "audio/x-wav": ["*wav"], "chemical/x-cdx": ["cdx"], "chemical/x-cif": ["cif"], "chemical/x-cmdf": ["cmdf"], "chemical/x-cml": ["cml"], "chemical/x-csml": ["csml"], "chemical/x-xyz": ["xyz"], "image/prs.btif": ["btif", "btf"], "image/prs.pti": ["pti"], "image/vnd.adobe.photoshop": ["psd"], "image/vnd.airzip.accelerator.azv": ["azv"], "image/vnd.dece.graphic": ["uvi", "uvvi", "uvg", "uvvg"], "image/vnd.djvu": ["djvu", "djv"], "image/vnd.dvb.subtitle": ["*sub"], "image/vnd.dwg": ["dwg"], "image/vnd.dxf": ["dxf"], "image/vnd.fastbidsheet": ["fbs"], "image/vnd.fpx": ["fpx"], "image/vnd.fst": ["fst"], "image/vnd.fujixerox.edmics-mmr": ["mmr"], "image/vnd.fujixerox.edmics-rlc": ["rlc"], "image/vnd.microsoft.icon": ["ico"], "image/vnd.ms-dds": ["dds"], "image/vnd.ms-modi": ["mdi"], "image/vnd.ms-photo": ["wdp"], "image/vnd.net-fpx": ["npx"], "image/vnd.pco.b16": ["b16"], "image/vnd.tencent.tap": ["tap"], "image/vnd.valve.source.texture": ["vtf"], "image/vnd.wap.wbmp": ["wbmp"], "image/vnd.xiff": ["xif"], "image/vnd.zbrush.pcx": ["pcx"], "image/x-3ds": ["3ds"], "image/x-cmu-raster": ["ras"], "image/x-cmx": ["cmx"], "image/x-freehand": ["fh", "fhc", "fh4", "fh5", "fh7"], "image/x-icon": ["*ico"], "image/x-jng": ["jng"], "image/x-mrsid-image": ["sid"], "image/x-ms-bmp": ["*bmp"], "image/x-pcx": ["*pcx"], "image/x-pict": ["pic", "pct"], "image/x-portable-anymap": ["pnm"], "image/x-portable-bitmap": ["pbm"], "image/x-portable-graymap": ["pgm"], "image/x-portable-pixmap": ["ppm"], "image/x-rgb": ["rgb"], "image/x-tga": ["tga"], "image/x-xbitmap": ["xbm"], "image/x-xpixmap": ["xpm"], "image/x-xwindowdump": ["xwd"], "message/vnd.wfa.wsc": ["wsc"], "model/vnd.cld": ["cld"], "model/vnd.collada+xml": ["dae"], "model/vnd.dwf": ["dwf"], "model/vnd.gdl": ["gdl"], "model/vnd.gtw": ["gtw"], "model/vnd.mts": ["mts"], "model/vnd.opengex": ["ogex"], "model/vnd.parasolid.transmit.binary": ["x_b"], "model/vnd.parasolid.transmit.text": ["x_t"], "model/vnd.pytha.pyox": ["pyo", "pyox"], "model/vnd.sap.vds": ["vds"], "model/vnd.usda": ["usda"], "model/vnd.usdz+zip": ["usdz"], "model/vnd.valve.source.compiled-map": ["bsp"], "model/vnd.vtu": ["vtu"], "text/prs.lines.tag": ["dsc"], "text/vnd.curl": ["curl"], "text/vnd.curl.dcurl": ["dcurl"], "text/vnd.curl.mcurl": ["mcurl"], "text/vnd.curl.scurl": ["scurl"], "text/vnd.dvb.subtitle": ["sub"], "text/vnd.familysearch.gedcom": ["ged"], "text/vnd.fly": ["fly"], "text/vnd.fmi.flexstor": ["flx"], "text/vnd.graphviz": ["gv"], "text/vnd.in3d.3dml": ["3dml"], "text/vnd.in3d.spot": ["spot"], "text/vnd.sun.j2me.app-descriptor": ["jad"], "text/vnd.wap.wml": ["wml"], "text/vnd.wap.wmlscript": ["wmls"], "text/x-asm": ["s", "asm"], "text/x-c": ["c", "cc", "cxx", "cpp", "h", "hh", "dic"], "text/x-component": ["htc"], "text/x-fortran": ["f", "for", "f77", "f90"], "text/x-handlebars-template": ["hbs"], "text/x-java-source": ["java"], "text/x-lua": ["lua"], "text/x-markdown": ["mkd"], "text/x-nfo": ["nfo"], "text/x-opml": ["opml"], "text/x-org": ["*org"], "text/x-pascal": ["p", "pas"], "text/x-processing": ["pde"], "text/x-sass": ["sass"], "text/x-scss": ["scss"], "text/x-setext": ["etx"], "text/x-sfv": ["sfv"], "text/x-suse-ymp": ["ymp"], "text/x-uuencode": ["uu"], "text/x-vcalendar": ["vcs"], "text/x-vcard": ["vcf"], "video/vnd.dece.hd": ["uvh", "uvvh"], "video/vnd.dece.mobile": ["uvm", "uvvm"], "video/vnd.dece.pd": ["uvp", "uvvp"], "video/vnd.dece.sd": ["uvs", "uvvs"], "video/vnd.dece.video": ["uvv", "uvvv"], "video/vnd.dvb.file": ["dvb"], "video/vnd.fvt": ["fvt"], "video/vnd.mpegurl": ["mxu", "m4u"], "video/vnd.ms-playready.media.pyv": ["pyv"], "video/vnd.uvvu.mp4": ["uvu", "uvvu"], "video/vnd.vivo": ["viv"], "video/x-f4v": ["f4v"], "video/x-fli": ["fli"], "video/x-flv": ["flv"], "video/x-m4v": ["m4v"], "video/x-matroska": ["mkv", "mk3d", "mks"], "video/x-mng": ["mng"], "video/x-ms-asf": ["asf", "asx"], "video/x-ms-vob": ["vob"], "video/x-ms-wm": ["wm"], "video/x-ms-wmv": ["wmv"], "video/x-ms-wmx": ["wmx"], "video/x-ms-wvx": ["wvx"], "video/x-msvideo": ["avi"], "video/x-sgi-movie": ["movie"], "video/x-smv": ["smv"], "x-conference/x-cooltalk": ["ice"] };
@@ -170,170 +202,296 @@ async function uploadJsonToS3(client, bucket, key, data) {
170
202
  const ContentType = src_default.getType(key) ?? "application/json";
171
203
  const upload = new import_lib_storage.Upload({
172
204
  client,
173
- params: { Bucket: bucket, Key: key, Body, ContentType }
205
+ params: {
206
+ Bucket: bucket,
207
+ Key: key,
208
+ Body,
209
+ ContentType,
210
+ CacheControl: "max-age=31536000"
211
+ }
174
212
  });
175
213
  await upload.done();
176
214
  }
177
- var s3Database = (config, hooks) => (_) => {
178
- const { bucketName, ...s3Config } = config;
179
- const client = new import_client_s3.S3Client(s3Config);
180
- let bundles = [];
181
- const changedIds = /* @__PURE__ */ new Set();
182
- const markChanged = (id) => changedIds.add(id);
183
- const PLATFORMS = ["ios", "android"];
184
- async function listUpdateJsonKeys(platform) {
185
- let continuationToken;
186
- const keys = [];
187
- const pattern = new RegExp(`^${platform}/[^/]+/update\\.json$`);
188
- do {
189
- const response = await client.send(
190
- new import_client_s3.ListObjectsV2Command({
191
- Bucket: bucketName,
192
- Prefix: `${platform}/`,
193
- ContinuationToken: continuationToken
194
- })
195
- );
196
- const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
197
- keys.push(...found);
198
- continuationToken = response.NextContinuationToken;
199
- } while (continuationToken);
200
- return keys;
215
+ async function invalidateCloudFront(client, distributionId, paths) {
216
+ if (paths.length === 0) {
217
+ return;
201
218
  }
202
- async function updateTargetVersionsForPlatform(platform) {
203
- const targetKey = `${platform}/target-app-versions.json`;
219
+ const timestamp = (/* @__PURE__ */ new Date()).getTime();
220
+ await client.send(
221
+ new import_client_cloudfront.CreateInvalidationCommand({
222
+ DistributionId: distributionId,
223
+ InvalidationBatch: {
224
+ CallerReference: `invalidation-${timestamp}`,
225
+ Paths: {
226
+ Quantity: paths.length,
227
+ Items: paths
228
+ }
229
+ }
230
+ })
231
+ );
232
+ }
233
+ function removeBundleInternalKeys(bundle) {
234
+ const { _updateJsonKey, _oldUpdateJsonKey, ...pureBundle } = bundle;
235
+ return pureBundle;
236
+ }
237
+ async function listUpdateJsonKeys(client, bucketName, platform, channel) {
238
+ let continuationToken;
239
+ const keys = [];
240
+ const prefix = channel ? platform ? `${channel}/${platform}/` : `${channel}/` : "";
241
+ const pattern = channel ? platform ? new RegExp(`^${channel}/${platform}/[^/]+/update\\.json$`) : new RegExp(`^${channel}/[^/]+/[^/]+/update\\.json$`) : platform ? new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`) : /^[^\/]+\/[^\/]+\/[^\/]+\/update\.json$/;
242
+ do {
243
+ const response = await client.send(
244
+ new import_client_s3.ListObjectsV2Command({
245
+ Bucket: bucketName,
246
+ Prefix: prefix,
247
+ ContinuationToken: continuationToken
248
+ })
249
+ );
250
+ const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
251
+ keys.push(...found);
252
+ continuationToken = response.NextContinuationToken;
253
+ } while (continuationToken);
254
+ return keys;
255
+ }
256
+ async function updateTargetVersionsForPlatform(client, bucketName, platform) {
257
+ let continuationToken;
258
+ const keys = [];
259
+ const pattern = new RegExp(`^[^/]+/${platform}/[^/]+/update\\.json$`);
260
+ do {
261
+ const response = await client.send(
262
+ new import_client_s3.ListObjectsV2Command({
263
+ Bucket: bucketName,
264
+ Prefix: "",
265
+ ContinuationToken: continuationToken
266
+ })
267
+ );
268
+ const found = (response.Contents ?? []).map((item) => item.Key).filter((key) => !!key && pattern.test(key));
269
+ keys.push(...found);
270
+ continuationToken = response.NextContinuationToken;
271
+ } while (continuationToken);
272
+ const keysByChannel = keys.reduce(
273
+ (acc, key) => {
274
+ const parts = key.split("/");
275
+ const channel = parts[0];
276
+ acc[channel] = acc[channel] || [];
277
+ acc[channel].push(key);
278
+ return acc;
279
+ },
280
+ {}
281
+ );
282
+ const updatedTargetFiles = /* @__PURE__ */ new Set();
283
+ for (const channel of Object.keys(keysByChannel)) {
284
+ const updateKeys = keysByChannel[channel];
285
+ const targetKey = `${channel}/${platform}/target-app-versions.json`;
286
+ const currentVersions = updateKeys.map((key) => key.split("/")[2]);
204
287
  const oldTargetVersions = await loadJsonFromS3(client, bucketName, targetKey) ?? [];
205
- const updateKeys = await listUpdateJsonKeys(platform);
206
- const currentVersions = updateKeys.map((key) => key.split("/")[1]);
207
288
  const newTargetVersions = oldTargetVersions.filter(
208
289
  (v) => currentVersions.includes(v)
209
290
  );
210
291
  for (const v of currentVersions) {
211
292
  if (!newTargetVersions.includes(v)) newTargetVersions.push(v);
212
293
  }
213
- await uploadJsonToS3(client, bucketName, targetKey, newTargetVersions);
214
- }
215
- async function processRemovals(oldKey, removalIds) {
216
- const currentBundles = await loadJsonFromS3(client, bucketName, oldKey) ?? [];
217
- const updatedBundles = currentBundles.filter(
218
- (b) => !removalIds.includes(b.id)
219
- );
220
- updatedBundles.sort((a, b) => b.id.localeCompare(a.id));
221
- if (updatedBundles.length === 0) {
222
- await client.send(
223
- new import_client_s3.DeleteObjectCommand({ Bucket: bucketName, Key: oldKey })
224
- );
225
- } else {
226
- await uploadJsonToS3(client, bucketName, oldKey, updatedBundles);
294
+ if (JSON.stringify(oldTargetVersions) !== JSON.stringify(newTargetVersions)) {
295
+ await uploadJsonToS3(client, bucketName, targetKey, newTargetVersions);
296
+ updatedTargetFiles.add(`/${targetKey}`);
227
297
  }
228
298
  }
229
- async function mergeChangedBundles(updateJsonKey, changedList) {
230
- const currentBundles = await loadJsonFromS3(client, bucketName, updateJsonKey) ?? [];
231
- for (const changedBundle of changedList) {
232
- const index = currentBundles.findIndex(
233
- (b) => b.id === changedBundle.id
234
- );
235
- if (index >= 0) {
236
- currentBundles[index] = changedBundle;
237
- } else {
238
- currentBundles.push(changedBundle);
239
- }
299
+ return updatedTargetFiles;
300
+ }
301
+ var s3Database = (config, hooks) => {
302
+ const { bucketName, cloudfrontDistributionId, ...s3Config } = config;
303
+ const client = new import_client_s3.S3Client(s3Config);
304
+ const cloudfrontClient = new import_client_cloudfront.CloudFrontClient({
305
+ credentials: s3Config.credentials,
306
+ region: s3Config.region
307
+ });
308
+ const bundlesMap = /* @__PURE__ */ new Map();
309
+ const pendingBundlesMap = /* @__PURE__ */ new Map();
310
+ const PLATFORMS = ["ios", "android"];
311
+ async function reloadBundles() {
312
+ bundlesMap.clear();
313
+ const platformPromises = PLATFORMS.map(async (platform) => {
314
+ const keys = await listUpdateJsonKeys(client, bucketName, platform);
315
+ const filePromises = keys.map(async (key) => {
316
+ const bundlesData = await loadJsonFromS3(client, bucketName, key) ?? [];
317
+ return bundlesData.map((bundle) => ({
318
+ ...bundle,
319
+ _updateJsonKey: key
320
+ }));
321
+ });
322
+ const results = await Promise.all(filePromises);
323
+ return results.flat();
324
+ });
325
+ const allBundles = (await Promise.all(platformPromises)).flat();
326
+ for (const bundle of allBundles) {
327
+ bundlesMap.set(bundle.id, bundle);
240
328
  }
241
- currentBundles.sort((a, b) => b.id.localeCompare(a.id));
242
- await uploadJsonToS3(client, bucketName, updateJsonKey, currentBundles);
329
+ for (const [id, bundle] of pendingBundlesMap.entries()) {
330
+ bundlesMap.set(id, bundle);
331
+ }
332
+ return orderBy(allBundles, [(v) => v.id], ["desc"]);
243
333
  }
244
- return {
245
- name: "s3Database",
246
- async commitBundle() {
247
- const changedBundlesByKey = {};
248
- const removalsByKey = {};
249
- for (const bundle of bundles) {
250
- if (changedIds.has(bundle.id)) {
251
- if (bundle._oldUpdateJsonKey) {
252
- removalsByKey[bundle._oldUpdateJsonKey] = removalsByKey[bundle._oldUpdateJsonKey] || [];
253
- removalsByKey[bundle._oldUpdateJsonKey].push(bundle.id);
334
+ return (0, import_plugin_core.createDatabasePlugin)(
335
+ "s3Database",
336
+ {
337
+ async getBundleById(bundleId) {
338
+ const pendingBundle = pendingBundlesMap.get(bundleId);
339
+ if (pendingBundle) {
340
+ return removeBundleInternalKeys(pendingBundle);
341
+ }
342
+ const bundle = bundlesMap.get(bundleId);
343
+ if (bundle) {
344
+ return removeBundleInternalKeys(bundle);
345
+ }
346
+ const bundles = await reloadBundles();
347
+ return bundles.find((bundle2) => bundle2.id === bundleId) ?? null;
348
+ },
349
+ async getBundles(options) {
350
+ let bundles = await reloadBundles();
351
+ const { where, limit, offset = 0 } = options ?? {};
352
+ if (where) {
353
+ bundles = bundles.filter((bundle) => {
354
+ return Object.entries(where).every(
355
+ ([key, value]) => value === void 0 || value === null || bundle[key] === value
356
+ );
357
+ });
358
+ }
359
+ if (offset > 0) {
360
+ bundles = bundles.slice(offset);
361
+ }
362
+ if (limit) {
363
+ bundles = bundles.slice(0, limit);
364
+ }
365
+ return bundles.map(removeBundleInternalKeys);
366
+ },
367
+ async getChannels() {
368
+ const allBundles = await this.getBundles();
369
+ return [...new Set(allBundles.map((bundle) => bundle.channel))];
370
+ },
371
+ async commitBundle({ changedSets }) {
372
+ if (changedSets.length === 0) return;
373
+ const changedBundlesByKey = {};
374
+ const removalsByKey = {};
375
+ const pathsToInvalidate = /* @__PURE__ */ new Set();
376
+ for (const { operation, data } of changedSets) {
377
+ if (operation === "insert") {
378
+ const key = `${data.channel}/${data.platform}/${data.targetAppVersion}/update.json`;
379
+ const bundleWithKey = {
380
+ ...data,
381
+ _updateJsonKey: key
382
+ };
383
+ bundlesMap.set(data.id, bundleWithKey);
384
+ pendingBundlesMap.set(data.id, bundleWithKey);
385
+ changedBundlesByKey[key] = changedBundlesByKey[key] || [];
386
+ changedBundlesByKey[key].push(
387
+ removeBundleInternalKeys(bundleWithKey)
388
+ );
389
+ pathsToInvalidate.add(`/${key}`);
390
+ continue;
391
+ }
392
+ let bundle = pendingBundlesMap.get(data.id);
393
+ if (!bundle) {
394
+ bundle = bundlesMap.get(data.id);
254
395
  }
255
- const currentKey = bundle._updateJsonKey;
256
- if (!currentKey) {
257
- throw new Error(
258
- `Missing _updateJsonKey for bundle id ${bundle.id}`
396
+ if (!bundle) {
397
+ throw new Error("targetBundleId not found");
398
+ }
399
+ if (operation === "update") {
400
+ const newChannel = data.channel !== void 0 ? data.channel : bundle.channel;
401
+ const newPlatform = data.platform !== void 0 ? data.platform : bundle.platform;
402
+ const newTargetAppVersion = data.targetAppVersion !== void 0 ? data.targetAppVersion : bundle.targetAppVersion;
403
+ const newKey = `${newChannel}/${newPlatform}/${newTargetAppVersion}/update.json`;
404
+ if (newKey !== bundle._updateJsonKey) {
405
+ const oldKey = bundle._updateJsonKey;
406
+ removalsByKey[oldKey] = removalsByKey[oldKey] || [];
407
+ removalsByKey[oldKey].push(bundle.id);
408
+ changedBundlesByKey[newKey] = changedBundlesByKey[newKey] || [];
409
+ const updatedBundle2 = { ...bundle, ...data };
410
+ updatedBundle2._oldUpdateJsonKey = oldKey;
411
+ updatedBundle2._updateJsonKey = newKey;
412
+ bundlesMap.set(data.id, updatedBundle2);
413
+ pendingBundlesMap.set(data.id, updatedBundle2);
414
+ changedBundlesByKey[newKey].push(
415
+ removeBundleInternalKeys(updatedBundle2)
416
+ );
417
+ pathsToInvalidate.add(`/${oldKey}`);
418
+ pathsToInvalidate.add(`/${newKey}`);
419
+ continue;
420
+ }
421
+ const currentKey = bundle._updateJsonKey;
422
+ const updatedBundle = { ...bundle, ...data };
423
+ bundlesMap.set(data.id, updatedBundle);
424
+ pendingBundlesMap.set(data.id, updatedBundle);
425
+ changedBundlesByKey[currentKey] = changedBundlesByKey[currentKey] || [];
426
+ changedBundlesByKey[currentKey].push(
427
+ removeBundleInternalKeys(updatedBundle)
259
428
  );
429
+ pathsToInvalidate.add(`/${currentKey}`);
260
430
  }
261
- changedBundlesByKey[currentKey] = changedBundlesByKey[currentKey] || [];
262
- const { _updateJsonKey, _oldUpdateJsonKey, ...pureBundle } = bundle;
263
- changedBundlesByKey[currentKey].push(pureBundle);
264
431
  }
432
+ for (const oldKey of Object.keys(removalsByKey)) {
433
+ await (async () => {
434
+ const currentBundles = await loadJsonFromS3(client, bucketName, oldKey) ?? [];
435
+ const updatedBundles = currentBundles.filter(
436
+ (b) => !removalsByKey[oldKey].includes(b.id)
437
+ );
438
+ updatedBundles.sort((a, b) => b.id.localeCompare(a.id));
439
+ if (updatedBundles.length === 0) {
440
+ await client.send(
441
+ new import_client_s3.DeleteObjectCommand({ Bucket: bucketName, Key: oldKey })
442
+ );
443
+ } else {
444
+ await uploadJsonToS3(client, bucketName, oldKey, updatedBundles);
445
+ }
446
+ })();
447
+ }
448
+ for (const key of Object.keys(changedBundlesByKey)) {
449
+ await (async () => {
450
+ const currentBundles = await loadJsonFromS3(client, bucketName, key) ?? [];
451
+ const pureBundles = changedBundlesByKey[key].map(
452
+ (bundle) => bundle
453
+ );
454
+ for (const changedBundle of pureBundles) {
455
+ const index = currentBundles.findIndex(
456
+ (b) => b.id === changedBundle.id
457
+ );
458
+ if (index >= 0) {
459
+ currentBundles[index] = changedBundle;
460
+ } else {
461
+ currentBundles.push(changedBundle);
462
+ }
463
+ }
464
+ currentBundles.sort((a, b) => b.id.localeCompare(a.id));
465
+ await uploadJsonToS3(client, bucketName, key, currentBundles);
466
+ })();
467
+ }
468
+ const updatedTargetFilePaths = /* @__PURE__ */ new Set();
469
+ for (const platform of PLATFORMS) {
470
+ const updatedPaths = await updateTargetVersionsForPlatform(
471
+ client,
472
+ bucketName,
473
+ platform
474
+ );
475
+ for (const path2 of updatedPaths) {
476
+ updatedTargetFilePaths.add(path2);
477
+ }
478
+ }
479
+ for (const path2 of updatedTargetFilePaths) {
480
+ pathsToInvalidate.add(path2);
481
+ }
482
+ if (cloudfrontClient && cloudfrontDistributionId && pathsToInvalidate.size > 0) {
483
+ await invalidateCloudFront(
484
+ cloudfrontClient,
485
+ cloudfrontDistributionId,
486
+ Array.from(pathsToInvalidate)
487
+ );
488
+ }
489
+ pendingBundlesMap.clear();
490
+ hooks?.onDatabaseUpdated?.();
265
491
  }
266
- for (const oldKey of Object.keys(removalsByKey)) {
267
- await processRemovals(oldKey, removalsByKey[oldKey]);
268
- }
269
- for (const key of Object.keys(changedBundlesByKey)) {
270
- await mergeChangedBundles(key, changedBundlesByKey[key]);
271
- }
272
- for (const platform of PLATFORMS) {
273
- await updateTargetVersionsForPlatform(platform);
274
- }
275
- changedIds.clear();
276
- hooks?.onDatabaseUpdated?.();
277
- },
278
- async updateBundle(targetBundleId, newBundle) {
279
- const index = bundles.findIndex((u) => u.id === targetBundleId);
280
- if (index === -1) {
281
- throw new Error("target bundle version not found");
282
- }
283
- const original = bundles[index];
284
- const {
285
- platform: oldPlatform,
286
- targetAppVersion: oldTargetAppVersion,
287
- _updateJsonKey: oldUpdateJsonKey
288
- } = original;
289
- const newPlatform = newBundle.platform ?? original.platform;
290
- const newTargetAppVersion = newBundle.targetAppVersion ?? original.targetAppVersion;
291
- if (newPlatform !== oldPlatform || newTargetAppVersion !== oldTargetAppVersion) {
292
- original._oldUpdateJsonKey = oldUpdateJsonKey;
293
- original._updateJsonKey = `${newPlatform}/${newTargetAppVersion}/update.json`;
294
- }
295
- Object.assign(original, newBundle);
296
- markChanged(original.id);
297
- },
298
- async getBundleById(bundleId) {
299
- const bundle = bundles.find((b) => b.id === bundleId);
300
- if (!bundle) return null;
301
- const { _updateJsonKey, _oldUpdateJsonKey, ...pureBundle } = bundle;
302
- return pureBundle;
303
- },
304
- async getBundles(refresh = false) {
305
- if (!refresh && bundles.length > 0) {
306
- return bundles.map(
307
- ({ _updateJsonKey, _oldUpdateJsonKey, ...bundle }) => bundle
308
- );
309
- }
310
- const platformPromises = PLATFORMS.map(async (platform) => {
311
- const keys = await listUpdateJsonKeys(platform);
312
- const filePromises = keys.map(async (key) => {
313
- const bundlesData = await loadJsonFromS3(client, bucketName, key) ?? [];
314
- return bundlesData.map((bundle) => ({
315
- ...bundle,
316
- _updateJsonKey: key
317
- }));
318
- });
319
- const results = await Promise.all(filePromises);
320
- return results.flat();
321
- });
322
- const allBundles = (await Promise.all(platformPromises)).flat();
323
- allBundles.sort((a, b) => b.id.localeCompare(a.id));
324
- bundles = allBundles;
325
- return bundles.map(
326
- ({ _updateJsonKey, _oldUpdateJsonKey, ...bundle }) => bundle
327
- );
328
492
  },
329
- async appendBundle(inputBundle) {
330
- bundles.unshift({
331
- ...inputBundle,
332
- _updateJsonKey: `${inputBundle.platform}/${inputBundle.targetAppVersion}/update.json`
333
- });
334
- markChanged(inputBundle.id);
335
- }
336
- };
493
+ hooks
494
+ );
337
495
  };
338
496
 
339
497
  // src/s3Storage.ts
@@ -381,16 +539,18 @@ var s3Storage = (config, hooks) => (_) => {
381
539
  ContentType,
382
540
  Bucket: bucketName,
383
541
  Key,
384
- Body
542
+ Body,
543
+ CacheControl: "max-age=31536000"
385
544
  }
386
545
  });
387
546
  const response = await upload.done();
388
- if (!response.Location || !response.Key) {
547
+ if (!response.Bucket || !response.Key) {
389
548
  throw new Error("Upload Failed");
390
549
  }
391
550
  hooks?.onStorageUploaded?.();
392
551
  return {
393
- fileUrl: hooks?.transformFileUrl?.(response.Key) ?? response.Location
552
+ bucketName: response.Bucket,
553
+ key: response.Key
394
554
  };
395
555
  }
396
556
  };
@@ -1,10 +1,12 @@
1
+ import * as _hot_updater_plugin_core from '@hot-updater/plugin-core';
2
+ import { DatabasePluginHooks, StoragePluginHooks, BasePluginArgs, StoragePlugin } from '@hot-updater/plugin-core';
1
3
  import { S3ClientConfig } from '@aws-sdk/client-s3';
2
- import { DatabasePluginHooks, BasePluginArgs, DatabasePlugin, StoragePluginHooks, StoragePlugin } from '@hot-updater/plugin-core';
3
4
 
4
5
  interface S3DatabaseConfig extends S3ClientConfig {
5
6
  bucketName: string;
7
+ cloudfrontDistributionId: string;
6
8
  }
7
- declare const s3Database: (config: S3DatabaseConfig, hooks?: DatabasePluginHooks) => (_: BasePluginArgs) => DatabasePlugin;
9
+ declare const s3Database: (config: S3DatabaseConfig, hooks?: DatabasePluginHooks) => (options: _hot_updater_plugin_core.BasePluginArgs) => _hot_updater_plugin_core.DatabasePlugin;
8
10
 
9
11
  interface S3StorageConfig extends S3ClientConfig {
10
12
  bucketName: string;
@@ -1,10 +1,12 @@
1
+ import * as _hot_updater_plugin_core from '@hot-updater/plugin-core';
2
+ import { DatabasePluginHooks, StoragePluginHooks, BasePluginArgs, StoragePlugin } from '@hot-updater/plugin-core';
1
3
  import { S3ClientConfig } from '@aws-sdk/client-s3';
2
- import { DatabasePluginHooks, BasePluginArgs, DatabasePlugin, StoragePluginHooks, StoragePlugin } from '@hot-updater/plugin-core';
3
4
 
4
5
  interface S3DatabaseConfig extends S3ClientConfig {
5
6
  bucketName: string;
7
+ cloudfrontDistributionId: string;
6
8
  }
7
- declare const s3Database: (config: S3DatabaseConfig, hooks?: DatabasePluginHooks) => (_: BasePluginArgs) => DatabasePlugin;
9
+ declare const s3Database: (config: S3DatabaseConfig, hooks?: DatabasePluginHooks) => (options: _hot_updater_plugin_core.BasePluginArgs) => _hot_updater_plugin_core.DatabasePlugin;
8
10
 
9
11
  interface S3StorageConfig extends S3ClientConfig {
10
12
  bucketName: string;